Merge branch 'stable-2.16' into stable-3.0
* stable-2.16: OutgoingEmail: Sanity check recipients of multipart and plaintext OutgoingEmail: Log when email is sent as multipart and plaintext OutgoingEmail: Log the reason that email is not being sent OutgoingEmail#send: Check first if email sending is enabled Change-Id: I1e18e6f8db77900149d3bf0754b7fb4c64b408bf
This commit is contained in:
@@ -18,6 +18,7 @@ import static com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailSt
|
|||||||
import static com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy.DISABLED;
|
import static com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy.DISABLED;
|
||||||
import static java.util.Objects.requireNonNull;
|
import static java.util.Objects.requireNonNull;
|
||||||
|
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import com.google.common.flogger.FluentLogger;
|
import com.google.common.flogger.FluentLogger;
|
||||||
import com.google.gerrit.exceptions.EmailException;
|
import com.google.gerrit.exceptions.EmailException;
|
||||||
import com.google.gerrit.extensions.api.changes.RecipientType;
|
import com.google.gerrit.extensions.api.changes.RecipientType;
|
||||||
@@ -90,13 +91,16 @@ public abstract class OutgoingEmail {
|
|||||||
* @throws EmailException
|
* @throws EmailException
|
||||||
*/
|
*/
|
||||||
public void send() throws EmailException {
|
public void send() throws EmailException {
|
||||||
if (!notify.shouldNotify()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!args.emailSender.isEnabled()) {
|
if (!args.emailSender.isEnabled()) {
|
||||||
// Server has explicitly disabled email sending.
|
// Server has explicitly disabled email sending.
|
||||||
//
|
//
|
||||||
|
logger.atFine().log(
|
||||||
|
"Not sending '%s': Email sending is disabled by server config", messageClass);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!notify.shouldNotify()) {
|
||||||
|
logger.atFine().log("Not sending '%s': Notify handling is NONE", messageClass);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,6 +151,7 @@ public abstract class OutgoingEmail {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (smtpRcptTo.isEmpty() && smtpRcptToPlaintextOnly.isEmpty()) {
|
if (smtpRcptTo.isEmpty() && smtpRcptToPlaintextOnly.isEmpty()) {
|
||||||
|
logger.atFine().log("Not sending '%s': No SMTP recipients", messageClass);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -185,16 +190,26 @@ public abstract class OutgoingEmail {
|
|||||||
try {
|
try {
|
||||||
validator.validateOutgoingEmail(va);
|
validator.validateOutgoingEmail(va);
|
||||||
} catch (ValidationException e) {
|
} catch (ValidationException e) {
|
||||||
|
logger.atFine().log(
|
||||||
|
"Not sending '%s': Rejected by outgoing email validator: %s",
|
||||||
|
messageClass, e.getMessage());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Set<Address> intersection = Sets.intersection(smtpRcptTo, smtpRcptToPlaintextOnly);
|
||||||
|
if (!intersection.isEmpty()) {
|
||||||
|
logger.atSevere().log("Email '%s' will be sent twice to %s", messageClass, intersection);
|
||||||
|
}
|
||||||
|
|
||||||
if (!smtpRcptTo.isEmpty()) {
|
if (!smtpRcptTo.isEmpty()) {
|
||||||
// Send multipart message
|
// Send multipart message
|
||||||
|
logger.atFine().log("Sending multipart '%s'", messageClass);
|
||||||
args.emailSender.send(va.smtpFromAddress, va.smtpRcptTo, va.headers, va.body, va.htmlBody);
|
args.emailSender.send(va.smtpFromAddress, va.smtpRcptTo, va.headers, va.body, va.htmlBody);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!smtpRcptToPlaintextOnly.isEmpty()) {
|
if (!smtpRcptToPlaintextOnly.isEmpty()) {
|
||||||
|
logger.atFine().log("Sending plaintext '%s'", messageClass);
|
||||||
// Send plaintext message
|
// Send plaintext message
|
||||||
Map<String, EmailHeader> shallowCopy = new HashMap<>();
|
Map<String, EmailHeader> shallowCopy = new HashMap<>();
|
||||||
shallowCopy.putAll(headers);
|
shallowCopy.putAll(headers);
|
||||||
@@ -389,6 +404,7 @@ public abstract class OutgoingEmail {
|
|||||||
protected boolean shouldSendMessage() {
|
protected boolean shouldSendMessage() {
|
||||||
if (textBody.length() == 0) {
|
if (textBody.length() == 0) {
|
||||||
// If we have no message body, don't send.
|
// If we have no message body, don't send.
|
||||||
|
logger.atFine().log("Not sending '%s': No message body", messageClass);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -396,6 +412,7 @@ public abstract class OutgoingEmail {
|
|||||||
// If we have nobody to send this message to, then all of our
|
// If we have nobody to send this message to, then all of our
|
||||||
// selection filters previously for this type of message were
|
// selection filters previously for this type of message were
|
||||||
// unable to match a destination. Don't bother sending it.
|
// unable to match a destination. Don't bother sending it.
|
||||||
|
logger.atFine().log("Not sending '%s': No recipients", messageClass);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -405,6 +422,7 @@ public abstract class OutgoingEmail {
|
|||||||
&& rcptTo.contains(fromId)) {
|
&& rcptTo.contains(fromId)) {
|
||||||
// If the only recipient is also the sender, don't bother.
|
// If the only recipient is also the sender, don't bother.
|
||||||
//
|
//
|
||||||
|
logger.atFine().log("Not sending '%s': Sender is only recipient", messageClass);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user