diff --git a/core/src/main/java/google/registry/batch/RelockDomainAction.java b/core/src/main/java/google/registry/batch/RelockDomainAction.java index a49f3a323..a19751737 100644 --- a/core/src/main/java/google/registry/batch/RelockDomainAction.java +++ b/core/src/main/java/google/registry/batch/RelockDomainAction.java @@ -82,7 +82,6 @@ public class RelockDomainAction implements Runnable { private final long oldUnlockRevisionId; private final int previousAttempts; private final InternetAddress alertRecipientAddress; - private final InternetAddress gSuiteOutgoingEmailAddress; private final String supportEmail; private final GmailClient gmailClient; private final DomainLockUtils domainLockUtils; @@ -93,7 +92,6 @@ public class RelockDomainAction implements Runnable { @Parameter(OLD_UNLOCK_REVISION_ID_PARAM) long oldUnlockRevisionId, @Parameter(PREVIOUS_ATTEMPTS_PARAM) int previousAttempts, @Config("newAlertRecipientEmailAddress") InternetAddress alertRecipientAddress, - @Config("gSuiteOutgoingEmailAddress") InternetAddress gSuiteOutgoingEmailAddress, @Config("supportEmail") String supportEmail, GmailClient gmailClient, DomainLockUtils domainLockUtils, @@ -101,7 +99,6 @@ public class RelockDomainAction implements Runnable { this.oldUnlockRevisionId = oldUnlockRevisionId; this.previousAttempts = previousAttempts; this.alertRecipientAddress = alertRecipientAddress; - this.gSuiteOutgoingEmailAddress = gSuiteOutgoingEmailAddress; this.supportEmail = supportEmail; this.gmailClient = gmailClient; this.domainLockUtils = domainLockUtils; @@ -217,7 +214,6 @@ public class RelockDomainAction implements Runnable { supportEmail); gmailClient.sendEmail( EmailMessage.newBuilder() - .setFrom(gSuiteOutgoingEmailAddress) .setBody(body) .setSubject(String.format("Error re-locking domain %s", oldLock.getDomainName())) .setRecipients(getEmailRecipients(oldLock.getRegistrarId())) @@ -247,7 +243,6 @@ public class RelockDomainAction implements Runnable { gmailClient.sendEmail( EmailMessage.newBuilder() - .setFrom(gSuiteOutgoingEmailAddress) .setBody(body) .setSubject(String.format("Successful re-lock of domain %s", oldLock.getDomainName())) .setRecipients(getEmailRecipients(oldLock.getRegistrarId())) @@ -266,7 +261,6 @@ public class RelockDomainAction implements Runnable { .build(); gmailClient.sendEmail( EmailMessage.newBuilder() - .setFrom(gSuiteOutgoingEmailAddress) .setBody(body) .setSubject(String.format("Error re-locking domain %s", oldLock.getDomainName())) .setRecipients(allRecipients) @@ -276,7 +270,6 @@ public class RelockDomainAction implements Runnable { private void sendUnknownRevisionIdAlertEmail() { gmailClient.sendEmail( EmailMessage.newBuilder() - .setFrom(gSuiteOutgoingEmailAddress) .setBody(String.format(RELOCK_UNKNOWN_ID_FAILURE_EMAIL_TEMPLATE, oldUnlockRevisionId)) .setSubject("Error re-locking domain") .setRecipients(ImmutableSet.of(alertRecipientAddress)) diff --git a/core/src/main/java/google/registry/batch/SendExpiringCertificateNotificationEmailAction.java b/core/src/main/java/google/registry/batch/SendExpiringCertificateNotificationEmailAction.java index 56f3f3d62..eaffcaffa 100644 --- a/core/src/main/java/google/registry/batch/SendExpiringCertificateNotificationEmailAction.java +++ b/core/src/main/java/google/registry/batch/SendExpiringCertificateNotificationEmailAction.java @@ -72,21 +72,18 @@ public class SendExpiringCertificateNotificationEmailAction implements Runnable private final String expirationWarningEmailBodyText; private final GmailClient gmailClient; private final String expirationWarningEmailSubjectText; - private final InternetAddress gSuiteOutgoingEmailAddress; private final Response response; @Inject public SendExpiringCertificateNotificationEmailAction( @Config("expirationWarningEmailBodyText") String expirationWarningEmailBodyText, @Config("expirationWarningEmailSubjectText") String expirationWarningEmailSubjectText, - @Config("gSuiteOutgoingEmailAddress") InternetAddress gSuiteOutgoingEmailAddress, GmailClient gmailClient, CertificateChecker certificateChecker, Response response) { this.certificateChecker = certificateChecker; this.expirationWarningEmailSubjectText = expirationWarningEmailSubjectText; this.gmailClient = gmailClient; - this.gSuiteOutgoingEmailAddress = gSuiteOutgoingEmailAddress; this.expirationWarningEmailBodyText = expirationWarningEmailBodyText; this.response = response; } @@ -172,7 +169,6 @@ public class SendExpiringCertificateNotificationEmailAction implements Runnable } gmailClient.sendEmail( EmailMessage.newBuilder() - .setFrom(gSuiteOutgoingEmailAddress) .setSubject(expirationWarningEmailSubjectText) .setBody( getEmailBody( diff --git a/core/src/main/java/google/registry/dns/PublishDnsUpdatesAction.java b/core/src/main/java/google/registry/dns/PublishDnsUpdatesAction.java index 2641635e2..99e4ebef8 100644 --- a/core/src/main/java/google/registry/dns/PublishDnsUpdatesAction.java +++ b/core/src/main/java/google/registry/dns/PublishDnsUpdatesAction.java @@ -118,7 +118,6 @@ public final class PublishDnsUpdatesAction implements Runnable, Callable { private final String dnsUpdateFailRegistryName; private final Lazy registrySupportEmail; private final Lazy registryCcEmail; - private final InternetAddress gSuiteOutgoingEmailAddress; @Inject public PublishDnsUpdatesAction( @@ -136,7 +135,6 @@ public final class PublishDnsUpdatesAction implements Runnable, Callable { @Config("dnsUpdateFailRegistryName") String dnsUpdateFailRegistryName, @Config("registrySupportEmail") Lazy registrySupportEmail, @Config("registryCcEmail") Lazy registryCcEmail, - @Config("gSuiteOutgoingEmailAddress") InternetAddress gSuiteOutgoingEmailAddress, @Header(CLOUD_TASKS_RETRY_HEADER) int retryCount, DnsWriterProxy dnsWriterProxy, DnsMetrics dnsMetrics, @@ -167,7 +165,6 @@ public final class PublishDnsUpdatesAction implements Runnable, Callable { this.dnsUpdateFailRegistryName = dnsUpdateFailRegistryName; this.registrySupportEmail = registrySupportEmail; this.registryCcEmail = registryCcEmail; - this.gSuiteOutgoingEmailAddress = gSuiteOutgoingEmailAddress; } private void recordActionResult(ActionStatus status) { @@ -309,7 +306,6 @@ public final class PublishDnsUpdatesAction implements Runnable, Callable { .setSubject(dnsUpdateFailEmailSubjectText) .setRecipients(recipients) .addBcc(registryCcEmail.get()) - .setFrom(gSuiteOutgoingEmailAddress) .build()); } else { diff --git a/core/src/main/java/google/registry/groups/GmailClient.java b/core/src/main/java/google/registry/groups/GmailClient.java index be649570b..e53c6b5fd 100644 --- a/core/src/main/java/google/registry/groups/GmailClient.java +++ b/core/src/main/java/google/registry/groups/GmailClient.java @@ -79,9 +79,6 @@ public final class GmailClient { /** * Sends {@code emailMessage} using {@link Gmail}. - * - *

If the sender as specified by {@link EmailMessage#from} differs from the caller's identity, - * the caller must have delegated `send` authority to the sender. */ public void sendEmail(EmailMessage emailMessage) { if (!isEmailSendingEnabled) { diff --git a/core/src/main/java/google/registry/reporting/billing/BillingEmailUtils.java b/core/src/main/java/google/registry/reporting/billing/BillingEmailUtils.java index 05493a82a..7b62a914a 100644 --- a/core/src/main/java/google/registry/reporting/billing/BillingEmailUtils.java +++ b/core/src/main/java/google/registry/reporting/billing/BillingEmailUtils.java @@ -37,7 +37,6 @@ public class BillingEmailUtils { private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private final GmailClient gmailClient; private final YearMonth yearMonth; - private final InternetAddress outgoingEmailAddress; private final InternetAddress alertRecipientAddress; private final ImmutableList invoiceEmailRecipients; private final Optional replyToEmailAddress; @@ -51,7 +50,6 @@ public class BillingEmailUtils { BillingEmailUtils( GmailClient gmailClient, YearMonth yearMonth, - @Config("gSuiteOutgoingEmailAddress") InternetAddress outgoingEmailAddress, @Config("newAlertRecipientEmailAddress") InternetAddress alertRecipientAddress, @Config("invoiceEmailRecipients") ImmutableList invoiceEmailRecipients, @Config("invoiceReplyToEmailAddress") Optional replyToEmailAddress, @@ -62,7 +60,6 @@ public class BillingEmailUtils { GcsUtils gcsUtils) { this.gmailClient = gmailClient; this.yearMonth = yearMonth; - this.outgoingEmailAddress = outgoingEmailAddress; this.alertRecipientAddress = alertRecipientAddress; this.invoiceEmailRecipients = invoiceEmailRecipients; this.replyToEmailAddress = replyToEmailAddress; @@ -94,7 +91,6 @@ public class BillingEmailUtils { "

Use the following link to download %s invoice for the domain registry -" + " invoice.

", yearMonth, fileUrl)) - .setFrom(outgoingEmailAddress) .setRecipients(invoiceEmailRecipients) .setReplyToEmailAddress(replyToEmailAddress) .setContentType(MediaType.HTML_UTF_8) @@ -115,7 +111,6 @@ public class BillingEmailUtils { .setSubject(String.format("Billing Pipeline Alert: %s", yearMonth)) .setBody(body) .addRecipient(alertRecipientAddress) - .setFrom(outgoingEmailAddress) .build()); } catch (Throwable e) { throw new RuntimeException("The alert e-mail system failed.", e); diff --git a/core/src/main/java/google/registry/reporting/icann/IcannReportingStagingAction.java b/core/src/main/java/google/registry/reporting/icann/IcannReportingStagingAction.java index 52d505264..14c7ca09c 100644 --- a/core/src/main/java/google/registry/reporting/icann/IcannReportingStagingAction.java +++ b/core/src/main/java/google/registry/reporting/icann/IcannReportingStagingAction.java @@ -82,7 +82,6 @@ public final class IcannReportingStagingAction implements Runnable { @Inject IcannReportingStager stager; @Inject Retrier retrier; @Inject Response response; - @Inject @Config("gSuiteOutgoingEmailAddress") InternetAddress sender; @Inject @Config("newAlertRecipientEmailAddress") @@ -115,7 +114,6 @@ public final class IcannReportingStagingAction implements Runnable { "Completed staging the following %d ICANN reports:\n%s", manifestedFiles.size(), Joiner.on('\n').join(manifestedFiles))) .addRecipient(recipient) - .setFrom(sender) .build()); response.setStatus(SC_OK); @@ -139,8 +137,7 @@ public final class IcannReportingStagingAction implements Runnable { "ICANN Monthly report staging summary [FAILURE]", String.format( "Staging failed due to %s, check logs for more details.", getRootCause(e)), - recipient, - sender)); + recipient)); response.setStatus(SC_INTERNAL_SERVER_ERROR); response.setContentType(MediaType.PLAIN_TEXT_UTF_8); response.setPayload( diff --git a/core/src/main/java/google/registry/reporting/icann/IcannReportingUploadAction.java b/core/src/main/java/google/registry/reporting/icann/IcannReportingUploadAction.java index 27d6e6989..8898306d1 100644 --- a/core/src/main/java/google/registry/reporting/icann/IcannReportingUploadAction.java +++ b/core/src/main/java/google/registry/reporting/icann/IcannReportingUploadAction.java @@ -86,7 +86,6 @@ public final class IcannReportingUploadAction implements Runnable { @Inject IcannHttpReporter icannReporter; @Inject Retrier retrier; @Inject Response response; - @Inject @Config("gSuiteOutgoingEmailAddress") InternetAddress sender; @Inject @Config("newAlertRecipientEmailAddress") @@ -297,7 +296,7 @@ public final class IcannReportingUploadAction implements Runnable { (e) -> String.format("%s - %s", e.getKey(), e.getValue() ? "SUCCESS" : "FAILURE")) .collect(Collectors.joining("\n"))); - gmailClient.sendEmail(EmailMessage.create(subject, body, recipient, sender)); + gmailClient.sendEmail(EmailMessage.create(subject, body, recipient)); } private byte[] readBytesFromGcs(BlobId reportFilename) throws IOException { diff --git a/core/src/main/java/google/registry/reporting/spec11/Spec11EmailUtils.java b/core/src/main/java/google/registry/reporting/spec11/Spec11EmailUtils.java index ce476df53..3b6b30ca6 100644 --- a/core/src/main/java/google/registry/reporting/spec11/Spec11EmailUtils.java +++ b/core/src/main/java/google/registry/reporting/spec11/Spec11EmailUtils.java @@ -173,7 +173,6 @@ public class Spec11EmailUtils { .setSubject(subject) .setBody(getEmailBody(date, soyTemplateInfo, registrarThreatMatches)) .setContentType(MediaType.HTML_UTF_8) - .setFrom(outgoingEmailAddress) .addRecipient(getEmailAddressForRegistrar(registrarThreatMatches.clientId())) .setBccs(spec11BccEmailAddresses) .build()); @@ -216,7 +215,6 @@ public class Spec11EmailUtils { try { gmailClient.sendEmail( EmailMessage.newBuilder() - .setFrom(outgoingEmailAddress) .addRecipient(alertRecipientAddress) .setBody(body) .setSubject(subject) diff --git a/core/src/main/java/google/registry/ui/server/SendEmailUtils.java b/core/src/main/java/google/registry/ui/server/SendEmailUtils.java index bf9323f68..071826a53 100644 --- a/core/src/main/java/google/registry/ui/server/SendEmailUtils.java +++ b/core/src/main/java/google/registry/ui/server/SendEmailUtils.java @@ -35,21 +35,14 @@ import javax.mail.internet.InternetAddress; public class SendEmailUtils { private static final FluentLogger logger = FluentLogger.forEnclosingClass(); - - private final InternetAddress gSuiteOutgoingEmailAddress; - private final String gSuiteOutgoingEmailDisplayName; private final GmailClient gmailClient; private final ImmutableList registrarChangesNotificationEmailAddresses; @Inject public SendEmailUtils( - @Config("gSuiteOutgoingEmailAddress") InternetAddress gSuiteOutgoingEmailAddress, - @Config("gSuiteOutgoingEmailDisplayName") String gSuiteOutgoingEmailDisplayName, @Config("registrarChangesNotificationEmailAddresses") ImmutableList registrarChangesNotificationEmailAddresses, GmailClient gmailClient) { - this.gSuiteOutgoingEmailAddress = gSuiteOutgoingEmailAddress; - this.gSuiteOutgoingEmailDisplayName = gSuiteOutgoingEmailDisplayName; this.gmailClient = gmailClient; this.registrarChangesNotificationEmailAddresses = registrarChangesNotificationEmailAddresses; } @@ -71,9 +64,6 @@ public class SendEmailUtils { Optional bcc, ImmutableList additionalAddresses) { try { - InternetAddress from = - new InternetAddress( - gSuiteOutgoingEmailAddress.getAddress(), gSuiteOutgoingEmailDisplayName); ImmutableList recipients = Stream.concat( registrarChangesNotificationEmailAddresses.stream(), additionalAddresses.stream()) @@ -95,11 +85,7 @@ public class SendEmailUtils { return false; } EmailMessage.Builder emailMessage = - EmailMessage.newBuilder() - .setBody(body) - .setSubject(subject) - .setRecipients(recipients) - .setFrom(from); + EmailMessage.newBuilder().setBody(body).setSubject(subject).setRecipients(recipients); if (bcc.isPresent()) { try { InternetAddress bccInternetAddress = new InternetAddress(bcc.get(), true); diff --git a/core/src/main/java/google/registry/ui/server/registrar/RegistryLockPostAction.java b/core/src/main/java/google/registry/ui/server/registrar/RegistryLockPostAction.java index 4012d056f..2646bd178 100644 --- a/core/src/main/java/google/registry/ui/server/registrar/RegistryLockPostAction.java +++ b/core/src/main/java/google/registry/ui/server/registrar/RegistryLockPostAction.java @@ -29,7 +29,6 @@ import com.google.common.base.Throwables; import com.google.common.collect.ImmutableList; import com.google.common.flogger.FluentLogger; import com.google.gson.Gson; -import google.registry.config.RegistryConfig.Config; import google.registry.flows.domain.DomainFlowUtils; import google.registry.groups.GmailClient; import google.registry.model.domain.RegistryLock; @@ -85,7 +84,6 @@ public class RegistryLockPostAction implements Runnable, JsonActionRunner.JsonAc private final AuthenticatedRegistrarAccessor registrarAccessor; private final GmailClient gmailClient; private final DomainLockUtils domainLockUtils; - private final InternetAddress gSuiteOutgoingEmailAddress; @Inject RegistryLockPostAction( @@ -94,15 +92,13 @@ public class RegistryLockPostAction implements Runnable, JsonActionRunner.JsonAc AuthResult authResult, AuthenticatedRegistrarAccessor registrarAccessor, GmailClient gmailClient, - DomainLockUtils domainLockUtils, - @Config("gSuiteOutgoingEmailAddress") InternetAddress gSuiteOutgoingEmailAddress) { + DomainLockUtils domainLockUtils) { this.req = req; this.jsonActionRunner = jsonActionRunner; this.authResult = authResult; this.registrarAccessor = registrarAccessor; this.gmailClient = gmailClient; this.domainLockUtils = domainLockUtils; - this.gSuiteOutgoingEmailAddress = gSuiteOutgoingEmailAddress; } @Override @@ -174,7 +170,6 @@ public class RegistryLockPostAction implements Runnable, JsonActionRunner.JsonAc .setBody(body) .setSubject(String.format("Registry %s verification", action)) .setRecipients(recipients) - .setFrom(gSuiteOutgoingEmailAddress) .build()); } catch (AddressException | URISyntaxException e) { throw new RuntimeException(e); // caught above -- this is so we can run in a transaction diff --git a/core/src/test/java/google/registry/batch/CheckBulkComplianceActionTest.java b/core/src/test/java/google/registry/batch/CheckBulkComplianceActionTest.java index 0943ae507..b0a7cc5a5 100644 --- a/core/src/test/java/google/registry/batch/CheckBulkComplianceActionTest.java +++ b/core/src/test/java/google/registry/batch/CheckBulkComplianceActionTest.java @@ -44,7 +44,6 @@ import google.registry.ui.server.SendEmailUtils; import google.registry.util.EmailMessage; import java.util.logging.Level; import java.util.logging.Logger; -import javax.mail.internet.InternetAddress; import org.joda.money.CurrencyUnit; import org.joda.money.Money; import org.joda.time.DateTime; @@ -89,8 +88,6 @@ public class CheckBulkComplianceActionTest { loggerToIntercept.addHandler(logHandler); sendEmailUtils = new SendEmailUtils( - new InternetAddress("outgoing@registry.example"), - "UnitTest Registry", ImmutableList.of("notification@test.example", "notification2@test.example"), gmailClient); createTld("tld"); diff --git a/core/src/test/java/google/registry/batch/RelockDomainActionTest.java b/core/src/test/java/google/registry/batch/RelockDomainActionTest.java index 0fb29ef72..cee65386a 100644 --- a/core/src/test/java/google/registry/batch/RelockDomainActionTest.java +++ b/core/src/test/java/google/registry/batch/RelockDomainActionTest.java @@ -258,7 +258,6 @@ public class RelockDomainActionTest { + "contact support at support@example.com if you have any questions.") .setRecipients( ImmutableSet.of(new InternetAddress("Marla.Singer.RegistryLock@crr.com"))) - .setFrom(new InternetAddress("outgoing@example.com")) .build(); verify(gmailClient).sendEmail(expectedEmail); } @@ -292,7 +291,6 @@ public class RelockDomainActionTest { .setSubject("Error re-locking domain example.tld") .setBody(body) .setRecipients(recipients) - .setFrom(new InternetAddress("outgoing@example.com")) .build(); verify(gmailClient).sendEmail(expectedEmail); } @@ -321,12 +319,10 @@ public class RelockDomainActionTest { private RelockDomainAction createAction(Long oldUnlockRevisionId, int previousAttempts) throws Exception { InternetAddress alertRecipientAddress = new InternetAddress("alerts@example.com"); - InternetAddress gSuiteOutgoingAddress = new InternetAddress("outgoing@example.com"); return new RelockDomainAction( oldUnlockRevisionId, previousAttempts, alertRecipientAddress, - gSuiteOutgoingAddress, "support@example.com", gmailClient, domainLockUtils, diff --git a/core/src/test/java/google/registry/batch/SendExpiringCertificateNotificationEmailActionTest.java b/core/src/test/java/google/registry/batch/SendExpiringCertificateNotificationEmailActionTest.java index 970e5b17b..b2021761d 100644 --- a/core/src/test/java/google/registry/batch/SendExpiringCertificateNotificationEmailActionTest.java +++ b/core/src/test/java/google/registry/batch/SendExpiringCertificateNotificationEmailActionTest.java @@ -98,7 +98,6 @@ class SendExpiringCertificateNotificationEmailActionTest { new SendExpiringCertificateNotificationEmailAction( EXPIRATION_WARNING_EMAIL_BODY_TEXT, EXPIRATION_WARNING_EMAIL_SUBJECT_TEXT, - new InternetAddress("test@example.com"), sendEmailService, certificateChecker, response); diff --git a/core/src/test/java/google/registry/dns/PublishDnsUpdatesActionTest.java b/core/src/test/java/google/registry/dns/PublishDnsUpdatesActionTest.java index 495f0429c..f1b7cb021 100644 --- a/core/src/test/java/google/registry/dns/PublishDnsUpdatesActionTest.java +++ b/core/src/test/java/google/registry/dns/PublishDnsUpdatesActionTest.java @@ -87,7 +87,6 @@ public class PublishDnsUpdatesActionTest { private final DnsMetrics dnsMetrics = mock(DnsMetrics.class); private final CloudTasksHelper cloudTasksHelper = new CloudTasksHelper(); private PublishDnsUpdatesAction action; - private InternetAddress outgoingRegistry; private Lazy registrySupportEmail; private Lazy registryCcEmail; private final GmailClient emailService = mock(GmailClient.class); @@ -96,7 +95,6 @@ public class PublishDnsUpdatesActionTest { void beforeEach() throws Exception { createTld("xn--q9jyb4c"); createTld("com"); - outgoingRegistry = new InternetAddress("outgoing@registry.example"); registrySupportEmail = Lazies.of(new InternetAddress("registry@test.com")); registryCcEmail = Lazies.of(new InternetAddress("registry-cc@test.com")); persistResource( @@ -159,7 +157,6 @@ public class PublishDnsUpdatesActionTest { "awesomeRegistry", registrySupportEmail, registryCcEmail, - outgoingRegistry, retryCount, new DnsWriterProxy(ImmutableMap.of("correctWriter", dnsWriter)), dnsMetrics, diff --git a/core/src/test/java/google/registry/groups/GmailClientTest.java b/core/src/test/java/google/registry/groups/GmailClientTest.java index f8369e145..acaa53281 100644 --- a/core/src/test/java/google/registry/groups/GmailClientTest.java +++ b/core/src/test/java/google/registry/groups/GmailClientTest.java @@ -75,7 +75,6 @@ public class GmailClientTest { EmailMessage.create( "subject", "body", - new InternetAddress("from@example.com"), new InternetAddress("to@example.com")); Send gSend = mock(Send.class); Messages gMessages = mock(Messages.class); @@ -93,7 +92,6 @@ public class GmailClientTest { EmailMessage.create( "subject", "body", - new InternetAddress("from@example.com"), new InternetAddress("to@example.com")); getGmailClient(false).sendEmail(message); verifyNoInteractions(gmail); @@ -107,7 +105,6 @@ public class GmailClientTest { InternetAddress bccAddr = new InternetAddress("bcc@example.com"); EmailMessage emailMessage = EmailMessage.newBuilder() - .setFrom(fromAddr) .setRecipients(ImmutableList.of(toAddr)) .setSubject("My subject") .setBody("My body") @@ -148,7 +145,6 @@ public class GmailClientTest { InternetAddress replyToAddr = new InternetAddress("some-addr@another.com"); EmailMessage emailMessage = EmailMessage.newBuilder() - .setFrom(fromAddr) .setRecipients(ImmutableList.of(toAddr)) .setReplyToEmailAddress(replyToAddr) .setSubject("My subject") diff --git a/core/src/test/java/google/registry/reporting/billing/BillingEmailUtilsTest.java b/core/src/test/java/google/registry/reporting/billing/BillingEmailUtilsTest.java index 978b0e547..bf11d4558 100644 --- a/core/src/test/java/google/registry/reporting/billing/BillingEmailUtilsTest.java +++ b/core/src/test/java/google/registry/reporting/billing/BillingEmailUtilsTest.java @@ -55,7 +55,6 @@ class BillingEmailUtilsTest { return new BillingEmailUtils( gmailClient, new YearMonth(2017, 10), - new InternetAddress("my-sender@test.com"), new InternetAddress("my-receiver@test.com"), ImmutableList.of( new InternetAddress("hello@world.com"), new InternetAddress("hola@mundo.com")), @@ -75,7 +74,6 @@ class BillingEmailUtilsTest { EmailMessage emailMessage = contentCaptor.getValue(); EmailMessage expectedContent = EmailMessage.newBuilder() - .setFrom(new InternetAddress("my-sender@test.com")) .setRecipients( ImmutableList.of( new InternetAddress("hello@world.com"), new InternetAddress("hola@mundo.com"))) @@ -126,7 +124,6 @@ class BillingEmailUtilsTest { private void validateAlertMessage(EmailMessage emailMessage, String body) throws MessagingException { - assertThat(emailMessage.from()).isEqualTo(new InternetAddress("my-sender@test.com")); assertThat(emailMessage.recipients()) .containsExactly(new InternetAddress("my-receiver@test.com")); assertThat(emailMessage.subject()).isEqualTo("Billing Pipeline Alert: 2017-10"); diff --git a/core/src/test/java/google/registry/reporting/icann/IcannReportingStagingActionTest.java b/core/src/test/java/google/registry/reporting/icann/IcannReportingStagingActionTest.java index bf0c63e85..faca41c76 100644 --- a/core/src/test/java/google/registry/reporting/icann/IcannReportingStagingActionTest.java +++ b/core/src/test/java/google/registry/reporting/icann/IcannReportingStagingActionTest.java @@ -63,7 +63,6 @@ class IcannReportingStagingActionTest { action.response = response; action.stager = stager; action.retrier = new Retrier(new FakeSleeper(new FakeClock()), 3); - action.sender = new InternetAddress("sender@example.com"); action.recipient = new InternetAddress("recipient@example.com"); action.gmailClient = mock(GmailClient.class); action.cloudTasksUtils = cloudTasksHelper.getTestCloudTasksUtils(); @@ -94,8 +93,7 @@ class IcannReportingStagingActionTest { EmailMessage.create( "ICANN Monthly report staging summary [SUCCESS]", "Completed staging the following 2 ICANN reports:\na\nb", - new InternetAddress("recipient@example.com"), - new InternetAddress("sender@example.com"))); + new InternetAddress("recipient@example.com"))); assertUploadTaskEnqueued(); } @@ -110,8 +108,7 @@ class IcannReportingStagingActionTest { EmailMessage.create( "ICANN Monthly report staging summary [SUCCESS]", "Completed staging the following 4 ICANN reports:\na\nb\nc\nd", - new InternetAddress("recipient@example.com"), - new InternetAddress("sender@example.com"))); + new InternetAddress("recipient@example.com"))); assertUploadTaskEnqueued(); } @@ -129,8 +126,7 @@ class IcannReportingStagingActionTest { EmailMessage.create( "ICANN Monthly report staging summary [SUCCESS]", "Completed staging the following 4 ICANN reports:\na\nb\nc\nd", - new InternetAddress("recipient@example.com"), - new InternetAddress("sender@example.com"))); + new InternetAddress("recipient@example.com"))); assertUploadTaskEnqueued(); } @@ -153,8 +149,7 @@ class IcannReportingStagingActionTest { "ICANN Monthly report staging summary [FAILURE]", "Staging failed due to google.registry.bigquery.BigqueryJobFailureException: " + "BigqueryJobFailureException: Expected failure, check logs for more details.", - new InternetAddress("recipient@example.com"), - new InternetAddress("sender@example.com"))); + new InternetAddress("recipient@example.com"))); // Assert no upload task enqueued cloudTasksHelper.assertNoTasksEnqueued("retryable-cron-tasks"); } diff --git a/core/src/test/java/google/registry/reporting/icann/IcannReportingUploadActionTest.java b/core/src/test/java/google/registry/reporting/icann/IcannReportingUploadActionTest.java index 02677e207..88344c87e 100644 --- a/core/src/test/java/google/registry/reporting/icann/IcannReportingUploadActionTest.java +++ b/core/src/test/java/google/registry/reporting/icann/IcannReportingUploadActionTest.java @@ -78,7 +78,6 @@ class IcannReportingUploadActionTest { action.retrier = new Retrier(new FakeSleeper(new FakeClock()), 3); action.reportingBucket = "basin"; action.gmailClient = gmailClient; - action.sender = new InternetAddress("sender@example.com"); action.recipient = new InternetAddress("recipient@example.com"); action.response = response; action.clock = clock; @@ -136,8 +135,7 @@ class IcannReportingUploadActionTest { + "foo-transactions-200606.csv - SUCCESS\n" + "tld-activity-200606.csv - FAILURE\n" + "tld-transactions-200606.csv - SUCCESS", - new InternetAddress("recipient@example.com"), - new InternetAddress("sender@example.com"))); + new InternetAddress("recipient@example.com"))); } @Test @@ -169,8 +167,7 @@ class IcannReportingUploadActionTest { "Report Filename - Upload status:\n" + "tld-activity-200512.csv - SUCCESS\n" + "tld-transactions-200512.csv - SUCCESS", - new InternetAddress("recipient@example.com"), - new InternetAddress("sender@example.com"))); + new InternetAddress("recipient@example.com"))); } @Test @@ -215,8 +212,7 @@ class IcannReportingUploadActionTest { + "foo-transactions-200606.csv - SUCCESS\n" + "tld-activity-200606.csv - FAILURE\n" + "tld-transactions-200606.csv - SUCCESS", - new InternetAddress("recipient@example.com"), - new InternetAddress("sender@example.com"))); + new InternetAddress("recipient@example.com"))); } @Test @@ -275,8 +271,7 @@ class IcannReportingUploadActionTest { + "foo-transactions-200606.csv - SUCCESS\n" + "tld-activity-200606.csv - FAILURE\n" + "tld-transactions-200606.csv - SUCCESS", - new InternetAddress("recipient@example.com"), - new InternetAddress("sender@example.com"))); + new InternetAddress("recipient@example.com"))); } @Test @@ -345,8 +340,7 @@ class IcannReportingUploadActionTest { + "foo-transactions-200606.csv - SUCCESS\n" + "tld-activity-200606.csv - FAILURE\n" + "tld-transactions-200606.csv - SUCCESS", - new InternetAddress("recipient@example.com"), - new InternetAddress("sender@example.com"))); + new InternetAddress("recipient@example.com"))); Cursor newActivityCursor = loadByKey(Cursor.createScopedVKey(CursorType.ICANN_UPLOAD_ACTIVITY, Tld.get("new"))); diff --git a/core/src/test/java/google/registry/reporting/spec11/Spec11EmailUtilsTest.java b/core/src/test/java/google/registry/reporting/spec11/Spec11EmailUtilsTest.java index dd4047fd2..ca186be50 100644 --- a/core/src/test/java/google/registry/reporting/spec11/Spec11EmailUtilsTest.java +++ b/core/src/test/java/google/registry/reporting/spec11/Spec11EmailUtilsTest.java @@ -161,7 +161,6 @@ class Spec11EmailUtilsTest { List capturedContents = contentCaptor.getAllValues(); validateMessage( capturedContents.get(0), - "abuse@test.com", "the.registrar@example.com", ImmutableList.of("abuse@test.com", "bcc@test.com"), "Super Cool Registry Monthly Threat Detector [2018-07-15]", @@ -169,7 +168,6 @@ class Spec11EmailUtilsTest { Optional.of(MediaType.HTML_UTF_8)); validateMessage( capturedContents.get(1), - "abuse@test.com", "new.registrar@example.com", ImmutableList.of("abuse@test.com", "bcc@test.com"), "Super Cool Registry Monthly Threat Detector [2018-07-15]", @@ -179,7 +177,6 @@ class Spec11EmailUtilsTest { Optional.of(MediaType.HTML_UTF_8)); validateMessage( capturedContents.get(2), - "abuse@test.com", "my-receiver@test.com", ImmutableList.of(), "Spec11 Pipeline Success 2018-07-15", @@ -199,7 +196,6 @@ class Spec11EmailUtilsTest { List capturedMessages = contentCaptor.getAllValues(); validateMessage( capturedMessages.get(0), - "abuse@test.com", "the.registrar@example.com", ImmutableList.of("abuse@test.com", "bcc@test.com"), "Super Cool Registry Daily Threat Detector [2018-07-15]", @@ -207,7 +203,6 @@ class Spec11EmailUtilsTest { Optional.of(MediaType.HTML_UTF_8)); validateMessage( capturedMessages.get(1), - "abuse@test.com", "new.registrar@example.com", ImmutableList.of("abuse@test.com", "bcc@test.com"), "Super Cool Registry Daily Threat Detector [2018-07-15]", @@ -217,7 +212,6 @@ class Spec11EmailUtilsTest { Optional.of(MediaType.HTML_UTF_8)); validateMessage( capturedMessages.get(2), - "abuse@test.com", "my-receiver@test.com", ImmutableList.of(), "Spec11 Pipeline Success 2018-07-15", @@ -240,7 +234,6 @@ class Spec11EmailUtilsTest { List capturedContents = contentCaptor.getAllValues(); validateMessage( capturedContents.get(0), - "abuse@test.com", "new.registrar@example.com", ImmutableList.of("abuse@test.com", "bcc@test.com"), "Super Cool Registry Monthly Threat Detector [2018-07-15]", @@ -248,7 +241,6 @@ class Spec11EmailUtilsTest { Optional.of(MediaType.HTML_UTF_8)); validateMessage( capturedContents.get(1), - "abuse@test.com", "my-receiver@test.com", ImmutableList.of(), "Spec11 Pipeline Success 2018-07-15", @@ -273,7 +265,6 @@ class Spec11EmailUtilsTest { List capturedContents = contentCaptor.getAllValues(); validateMessage( capturedContents.get(0), - "abuse@test.com", "the.registrar@example.com", ImmutableList.of("abuse@test.com", "bcc@test.com"), "Super Cool Registry Monthly Threat Detector [2018-07-15]", @@ -281,7 +272,6 @@ class Spec11EmailUtilsTest { Optional.of(MediaType.HTML_UTF_8)); validateMessage( capturedContents.get(1), - "abuse@test.com", "new.registrar@example.com", ImmutableList.of("abuse@test.com", "bcc@test.com"), "Super Cool Registry Monthly Threat Detector [2018-07-15]", @@ -291,7 +281,6 @@ class Spec11EmailUtilsTest { Optional.of(MediaType.HTML_UTF_8)); validateMessage( capturedContents.get(2), - "abuse@test.com", "my-receiver@test.com", ImmutableList.of(), "Spec11 Pipeline Success 2018-07-15", @@ -328,7 +317,6 @@ class Spec11EmailUtilsTest { List capturedMessages = contentCaptor.getAllValues(); validateMessage( capturedMessages.get(0), - "abuse@test.com", "the.registrar@example.com", ImmutableList.of("abuse@test.com", "bcc@test.com"), "Super Cool Registry Monthly Threat Detector [2018-07-15]", @@ -336,7 +324,6 @@ class Spec11EmailUtilsTest { Optional.of(MediaType.HTML_UTF_8)); validateMessage( capturedMessages.get(1), - "abuse@test.com", "new.registrar@example.com", ImmutableList.of("abuse@test.com", "bcc@test.com"), "Super Cool Registry Monthly Threat Detector [2018-07-15]", @@ -346,7 +333,6 @@ class Spec11EmailUtilsTest { Optional.of(MediaType.HTML_UTF_8)); validateMessage( capturedMessages.get(2), - "abuse@test.com", "my-receiver@test.com", ImmutableList.of(), "Spec11 Emailing Failure 2018-07-15", @@ -360,7 +346,6 @@ class Spec11EmailUtilsTest { verify(gmailClient).sendEmail(contentCaptor.capture()); validateMessage( contentCaptor.getValue(), - "abuse@test.com", "my-receiver@test.com", ImmutableList.of(), "Spec11 Pipeline Alert: 2018-07", @@ -409,7 +394,6 @@ class Spec11EmailUtilsTest { private void validateMessage( EmailMessage message, - String from, String recipient, ImmutableList bccs, String subject, @@ -418,7 +402,6 @@ class Spec11EmailUtilsTest { throws MessagingException { EmailMessage.Builder expectedContentBuilder = EmailMessage.newBuilder() - .setFrom(new InternetAddress(from)) .addRecipient(new InternetAddress(recipient)) .setSubject(subject) .setBody(body); diff --git a/core/src/test/java/google/registry/ui/server/SendEmailUtilsTest.java b/core/src/test/java/google/registry/ui/server/SendEmailUtilsTest.java index fd635f480..d8e417368 100644 --- a/core/src/test/java/google/registry/ui/server/SendEmailUtilsTest.java +++ b/core/src/test/java/google/registry/ui/server/SendEmailUtilsTest.java @@ -39,8 +39,6 @@ class SendEmailUtilsTest { private void setRecipients(ImmutableList recipients) throws Exception { sendEmailUtils = new SendEmailUtils( - new InternetAddress("outgoing@registry.example"), - "outgoing display name", recipients, gmailClient); } @@ -141,7 +139,6 @@ class SendEmailUtilsTest { EmailMessage.newBuilder() .setSubject("Welcome to the Internet") .setBody("It is a dark and scary place.") - .setFrom(new InternetAddress("outgoing@registry.example")) .addBcc(new InternetAddress("bar@example.com")) .setRecipients(recipientBuilder.build()) .build(); @@ -186,7 +183,6 @@ class SendEmailUtilsTest { EmailMessage.newBuilder() .setSubject("Welcome to the Internet") .setBody("It is a dark and scary place.") - .setFrom(new InternetAddress("outgoing@registry.example")) .setRecipients(recipientBuilder.build()) .build(); assertThat(emailMessage).isEqualTo(expectedContent); diff --git a/core/src/test/java/google/registry/ui/server/registrar/ConsoleOteSetupActionTest.java b/core/src/test/java/google/registry/ui/server/registrar/ConsoleOteSetupActionTest.java index 39176ca17..09dc44fea 100644 --- a/core/src/test/java/google/registry/ui/server/registrar/ConsoleOteSetupActionTest.java +++ b/core/src/test/java/google/registry/ui/server/registrar/ConsoleOteSetupActionTest.java @@ -47,7 +47,6 @@ import google.registry.ui.server.SendEmailUtils; import google.registry.util.EmailMessage; import google.registry.util.RegistryEnvironment; import java.util.Optional; -import javax.mail.internet.InternetAddress; import javax.servlet.http.HttpServletRequest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Order; @@ -94,8 +93,6 @@ public final class ConsoleOteSetupActionTest { action.authResult = AuthResult.createUser(UserAuthInfo.create(user, false)); action.sendEmailUtils = new SendEmailUtils( - new InternetAddress("outgoing@registry.example"), - "UnitTest Registry", ImmutableList.of("notification@test.example", "notification2@test.example"), gmailClient); action.logoFilename = "logo.png"; diff --git a/core/src/test/java/google/registry/ui/server/registrar/ConsoleRegistrarCreatorActionTest.java b/core/src/test/java/google/registry/ui/server/registrar/ConsoleRegistrarCreatorActionTest.java index c8fb47b89..1bbe9f7f3 100644 --- a/core/src/test/java/google/registry/ui/server/registrar/ConsoleRegistrarCreatorActionTest.java +++ b/core/src/test/java/google/registry/ui/server/registrar/ConsoleRegistrarCreatorActionTest.java @@ -48,7 +48,6 @@ import google.registry.ui.server.SendEmailUtils; import google.registry.util.EmailMessage; import google.registry.util.RegistryEnvironment; import java.util.Optional; -import javax.mail.internet.InternetAddress; import javax.servlet.http.HttpServletRequest; import org.joda.money.CurrencyUnit; import org.junit.jupiter.api.BeforeEach; @@ -95,8 +94,6 @@ final class ConsoleRegistrarCreatorActionTest { action.authResult = AuthResult.createUser(UserAuthInfo.create(user, false)); action.sendEmailUtils = new SendEmailUtils( - new InternetAddress("outgoing@registry.example"), - "UnitTest Registry", ImmutableList.of("notification@test.example", "notification2@test.example"), gmailClient); action.logoFilename = "logo.png"; diff --git a/core/src/test/java/google/registry/ui/server/registrar/RegistrarSettingsActionTestCase.java b/core/src/test/java/google/registry/ui/server/registrar/RegistrarSettingsActionTestCase.java index bc1f111b5..8430272bd 100644 --- a/core/src/test/java/google/registry/ui/server/registrar/RegistrarSettingsActionTestCase.java +++ b/core/src/test/java/google/registry/ui/server/registrar/RegistrarSettingsActionTestCase.java @@ -16,8 +16,6 @@ package google.registry.ui.server.registrar; import static com.google.common.collect.Iterables.getOnlyElement; import static com.google.monitoring.metrics.contrib.LongMetricSubject.assertThat; -import static google.registry.config.RegistryConfig.getGSuiteOutgoingEmailAddress; -import static google.registry.config.RegistryConfig.getGSuiteOutgoingEmailDisplayName; import static google.registry.request.auth.AuthenticatedRegistrarAccessor.Role.ADMIN; import static google.registry.request.auth.AuthenticatedRegistrarAccessor.Role.OWNER; import static google.registry.security.JsonHttpTestUtils.createJsonPayload; @@ -106,8 +104,6 @@ public abstract class RegistrarSettingsActionTestCase { new JsonActionRunner(ImmutableMap.of(), new JsonResponse(new ResponseImpl(rsp))); action.sendEmailUtils = new SendEmailUtils( - getGSuiteOutgoingEmailAddress(), - getGSuiteOutgoingEmailDisplayName(), ImmutableList.of("notification@test.example", "notification2@test.example"), gmailClient); action.registrarConsoleMetrics = new RegistrarConsoleMetrics(); diff --git a/core/src/test/java/google/registry/ui/server/registrar/RegistryLockPostActionTest.java b/core/src/test/java/google/registry/ui/server/registrar/RegistryLockPostActionTest.java index 65411647c..e01a4379d 100644 --- a/core/src/test/java/google/registry/ui/server/registrar/RegistryLockPostActionTest.java +++ b/core/src/test/java/google/registry/ui/server/registrar/RegistryLockPostActionTest.java @@ -91,8 +91,6 @@ final class RegistryLockPostActionTest { private User userWithoutPermission; private User userWithLockPermission; - - private InternetAddress outgoingAddress; private Domain domain; private RegistryLockPostAction action; @@ -109,8 +107,6 @@ final class RegistryLockPostActionTest { createTld("tld"); domain = persistResource(DatabaseHelper.newDomain("example.tld")); - outgoingAddress = new InternetAddress("domain-registry@example.com"); - when(mockRequest.getServerName()).thenReturn("registrarconsole.tld"); action = @@ -502,7 +498,6 @@ final class RegistryLockPostActionTest { EmailMessage sentMessage = emailCaptor.getValue(); assertThat(sentMessage.subject()).matches("Registry (un)?lock verification"); assertThat(sentMessage.body()).matches(EMAIL_MESSAGE_TEMPLATE); - assertThat(sentMessage.from()).isEqualTo(new InternetAddress("domain-registry@example.com")); assertThat(sentMessage.recipients()).containsExactly(new InternetAddress(recipient)); } @@ -524,12 +519,6 @@ final class RegistryLockPostActionTest { "adminreg", new CloudTasksHelper(clock).getTestCloudTasksUtils()); return new RegistryLockPostAction( - mockRequest, - jsonActionRunner, - authResult, - registrarAccessor, - gmailClient, - domainLockUtils, - outgoingAddress); + mockRequest, jsonActionRunner, authResult, registrarAccessor, gmailClient, domainLockUtils); } } diff --git a/util/src/main/java/google/registry/util/EmailMessage.java b/util/src/main/java/google/registry/util/EmailMessage.java index 15e944231..b05520acd 100644 --- a/util/src/main/java/google/registry/util/EmailMessage.java +++ b/util/src/main/java/google/registry/util/EmailMessage.java @@ -22,7 +22,12 @@ import java.util.Collection; import java.util.Optional; import javax.mail.internet.InternetAddress; -/** Value class representing the content and metadata of an email. */ +/** + * Value class representing the content and metadata of an email. + * + *

The sender address and display name are set by the email client and are not customizable by + * the user. + */ @AutoValue public abstract class EmailMessage { @@ -30,13 +35,11 @@ public abstract class EmailMessage { return new AutoValue_EmailMessage.Builder(); } - public static EmailMessage create( - String subject, String body, InternetAddress recipient, InternetAddress from) { + public static EmailMessage create(String subject, String body, InternetAddress recipient) { return newBuilder() .setSubject(subject) .setBody(body) .setRecipients(ImmutableList.of(recipient)) - .setFrom(from) .build(); } @@ -46,9 +49,6 @@ public abstract class EmailMessage { public abstract ImmutableSet recipients(); - // TODO(b/279671974): remove `from` after migration. - public abstract InternetAddress from(); - /** Optional return email address that overrides the default. */ public abstract Optional replyToEmailAddress(); @@ -70,8 +70,6 @@ public abstract class EmailMessage { public abstract Builder setRecipients(Collection recipients); - public abstract Builder setFrom(InternetAddress from); - public abstract Builder setReplyToEmailAddress(InternetAddress replyToEmailAddress); public abstract Builder setReplyToEmailAddress(Optional replyToEmailAddress); diff --git a/util/src/main/java/google/registry/util/SendEmailService.java b/util/src/main/java/google/registry/util/SendEmailService.java deleted file mode 100644 index faada1099..000000000 --- a/util/src/main/java/google/registry/util/SendEmailService.java +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2017 The Nomulus Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package google.registry.util; - -import static com.google.common.collect.ImmutableSet.toImmutableSet; -import static com.google.common.collect.Iterables.toArray; - -import com.google.common.base.Ascii; -import com.google.common.collect.ImmutableSet; -import com.google.common.flogger.FluentLogger; -import com.google.common.net.MediaType; -import google.registry.util.EmailMessage.Attachment; -import java.io.IOException; -import java.util.Properties; -import javax.inject.Inject; -import javax.inject.Singleton; -import javax.mail.Address; -import javax.mail.BodyPart; -import javax.mail.Message; -import javax.mail.Message.RecipientType; -import javax.mail.MessagingException; -import javax.mail.Multipart; -import javax.mail.Session; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeBodyPart; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; - -/** - * Wrapper around javax.mail's email creation and sending functionality. Encompasses a retry policy - * as well. - */ -@Singleton -public class SendEmailService { - - private final Retrier retrier; - private final TransportEmailSender transportEmailSender; - - private static final FluentLogger logger = FluentLogger.forEnclosingClass(); - private static final ImmutableSet ALLOWED_ENVS = - ImmutableSet.of("PRODUCTION", "UNITTEST"); - - @Inject - SendEmailService(Retrier retrier, TransportEmailSender transportEmailSender) { - this.retrier = retrier; - this.transportEmailSender = transportEmailSender; - } - - /** - * Converts the provided message content into a {@link javax.mail.Message} and sends it with retry - * on transient failures. - */ - public void sendEmail(EmailMessage emailMessage) { - if (!ALLOWED_ENVS.contains( - Ascii.toUpperCase(System.getProperty("google.registry.environment", "UNITTEST")))) { - logger.atInfo().log( - "Email with subject %s would have been sent to recipients %s", - emailMessage.subject().substring(0, Math.min(emailMessage.subject().length(), 15)), - String.join( - " , ", - emailMessage.recipients().stream() - .map(ia -> ia.toString()) - .collect(toImmutableSet()))); - } else { - retrier.callWithRetry( - () -> { - Message msg = - new MimeMessage( - Session.getDefaultInstance(new Properties(), /* authenticator= */ null)); - msg.setFrom(emailMessage.from()); - msg.addRecipients( - RecipientType.TO, toArray(emailMessage.recipients(), InternetAddress.class)); - msg.setSubject(emailMessage.subject()); - - Multipart multipart = new MimeMultipart(); - BodyPart bodyPart = new MimeBodyPart(); - bodyPart.setContent( - emailMessage.body(), - emailMessage.contentType().orElse(MediaType.PLAIN_TEXT_UTF_8).toString()); - multipart.addBodyPart(bodyPart); - - if (emailMessage.attachment().isPresent()) { - Attachment attachment = emailMessage.attachment().get(); - BodyPart attachmentPart = new MimeBodyPart(); - attachmentPart.setContent(attachment.content(), attachment.contentType().toString()); - attachmentPart.setFileName(attachment.filename()); - multipart.addBodyPart(attachmentPart); - } - msg.addRecipients(RecipientType.BCC, toArray(emailMessage.bccs(), Address.class)); - msg.addRecipients(RecipientType.CC, toArray(emailMessage.ccs(), Address.class)); - msg.setContent(multipart); - msg.saveChanges(); - transportEmailSender.sendMessage(msg); - }, - IOException.class, - MessagingException.class); - } - } -} diff --git a/util/src/main/java/google/registry/util/TransportEmailSender.java b/util/src/main/java/google/registry/util/TransportEmailSender.java deleted file mode 100644 index ed692ee57..000000000 --- a/util/src/main/java/google/registry/util/TransportEmailSender.java +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2019 The Nomulus Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package google.registry.util; - -import javax.inject.Inject; -import javax.inject.Singleton; -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.Transport; - -/** Wrapper for sending email so that we can test {@link google.registry.util.SendEmailService}. */ -@Singleton -class TransportEmailSender { - - @Inject - TransportEmailSender() {} - - /** Sends a message using default App Engine transport. */ - void sendMessage(Message msg) throws MessagingException { - Transport.send(msg); - } -} diff --git a/util/src/test/java/google/registry/util/SendEmailServiceTest.java b/util/src/test/java/google/registry/util/SendEmailServiceTest.java deleted file mode 100644 index 77cd1fbe1..000000000 --- a/util/src/test/java/google/registry/util/SendEmailServiceTest.java +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright 2019 The Nomulus Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package google.registry.util; - -import static com.google.common.truth.Truth.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; - -import com.google.common.collect.ImmutableList; -import com.google.common.net.MediaType; -import google.registry.testing.FakeClock; -import google.registry.testing.FakeSleeper; -import google.registry.util.EmailMessage.Attachment; -import javax.mail.BodyPart; -import javax.mail.Message; -import javax.mail.Message.RecipientType; -import javax.mail.MessagingException; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeMultipart; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.junit.jupiter.MockitoExtension; - -/** Unit tests for {@link SendEmailService}. */ -@ExtendWith(MockitoExtension.class) -class SendEmailServiceTest { - - private final Retrier retrier = new Retrier(new FakeSleeper(new FakeClock()), 2); - private final TransportEmailSender wrapper = mock(TransportEmailSender.class); - private final SendEmailService sendEmailService = new SendEmailService(retrier, wrapper); - - @Captor private ArgumentCaptor messageCaptor; - - @Test - void testSuccess_simple() throws Exception { - EmailMessage content = createBuilder().build(); - sendEmailService.sendEmail(content); - Message message = getMessage(); - assertThat(message.getAllRecipients()) - .asList() - .containsExactly(new InternetAddress("fake@example.com")); - assertThat(message.getFrom()) - .asList() - .containsExactly(new InternetAddress("registry@example.com")); - assertThat(message.getRecipients(RecipientType.BCC)).isNull(); - assertThat(message.getSubject()).isEqualTo("Subject"); - assertThat(message.getContentType()).startsWith("multipart/mixed"); - assertThat(getInternalContent(message).getContent().toString()).isEqualTo("body"); - assertThat(getInternalContent(message).getContentType()).isEqualTo("text/plain; charset=utf-8"); - assertThat(((MimeMultipart) message.getContent()).getCount()).isEqualTo(1); - } - - @Test - void testSuccess_addBccs() throws Exception { - EmailMessage.Builder contentBuilder = - EmailMessage.newBuilder() - .setFrom(new InternetAddress("test@example.com")) - .setSubject("test subject") - .setBody("test body"); - for (String email : - ImmutableList.of("bcc@example.com", "bcc1@example.com", "bcc2@example.com")) { - contentBuilder.addBcc(new InternetAddress(email)); - } - - sendEmailService.sendEmail(contentBuilder.build()); - assertThat(getMessage().getRecipients(RecipientType.BCC)) - .asList() - .containsExactly( - new InternetAddress("bcc@example.com"), - new InternetAddress("bcc1@example.com"), - new InternetAddress("bcc2@example.com")); - } - - @Test - void testSuccess_setBccs() throws Exception { - EmailMessage content = - createBuilder() - .setBccs( - ImmutableList.of( - new InternetAddress("bcc@example.com"), - new InternetAddress("bcc2@example.com"))) - .build(); - sendEmailService.sendEmail(content); - assertThat(getMessage().getRecipients(RecipientType.BCC)) - .asList() - .containsExactly( - new InternetAddress("bcc@example.com"), new InternetAddress("bcc2@example.com")); - } - - @Test - void testSuccess_emptyBcc() throws Exception { - sendEmailService.sendEmail(createBuilder().setBccs(ImmutableList.of()).build()); - assertThat(getMessage().getRecipients(RecipientType.BCC)).isNull(); - } - - @Test - void testSuccess_addCcs() throws Exception { - EmailMessage.Builder contentBuilder = EmailMessage.newBuilder(); - contentBuilder - .setFrom(new InternetAddress("test@example.com")) - .setSubject("test subject") - .setBody("test body"); - for (String email : ImmutableList.of("cc@example.com", "cc1@example.com", "cc2@example.com")) { - contentBuilder.addCc(new InternetAddress(email)); - } - sendEmailService.sendEmail(contentBuilder.build()); - assertThat(getMessage().getRecipients(RecipientType.CC)) - .asList() - .containsExactly( - new InternetAddress("cc@example.com"), - new InternetAddress("cc1@example.com"), - new InternetAddress("cc2@example.com")); - } - - @Test - void testSuccess_setCcs() throws Exception { - EmailMessage content = - createBuilder() - .setCcs( - ImmutableList.of( - new InternetAddress("cc@example.com"), new InternetAddress("cc2@example.com"))) - .build(); - sendEmailService.sendEmail(content); - assertThat(getMessage().getRecipients(RecipientType.CC)) - .asList() - .containsExactly( - new InternetAddress("cc@example.com"), new InternetAddress("cc2@example.com")); - } - - @Test - void testSuccess_emptyCC() throws Exception { - sendEmailService.sendEmail(createBuilder().setCcs(ImmutableList.of()).build()); - assertThat(getMessage().getRecipients(RecipientType.CC)).isNull(); - } - - @Test - void testSuccess_contentType() throws Exception { - sendEmailService.sendEmail(createBuilder().setContentType(MediaType.HTML_UTF_8).build()); - assertThat(getInternalContent(getMessage()).getContentType()) - .isEqualTo("text/html; charset=utf-8"); - } - - @Test - void testSuccess_attachment() throws Exception { - EmailMessage content = - createBuilder() - .setAttachment( - Attachment.newBuilder() - .setFilename("filename") - .setContent("foo,bar\nbaz,qux") - .setContentType(MediaType.CSV_UTF_8) - .build()) - .build(); - sendEmailService.sendEmail(content); - Message message = getMessage(); - assertThat(((MimeMultipart) message.getContent()).getCount()).isEqualTo(2); - BodyPart attachment = ((MimeMultipart) message.getContent()).getBodyPart(1); - assertThat(attachment.getContent()).isEqualTo("foo,bar\nbaz,qux"); - assertThat(attachment.getContentType()).endsWith("name=filename"); - } - - @Test - void testSuccess_retry() throws Exception { - doThrow(new MessagingException("hi")) - .doNothing() - .when(wrapper) - .sendMessage(messageCaptor.capture()); - sendEmailService.sendEmail(createBuilder().build()); - assertThat(messageCaptor.getValue().getSubject()).isEqualTo("Subject"); - } - - @Test - void testFailure_wrongExceptionType() throws Exception { - doThrow(new RuntimeException("this is a runtime exception")).when(wrapper).sendMessage(any()); - RuntimeException thrown = - assertThrows( - RuntimeException.class, () -> sendEmailService.sendEmail(createBuilder().build())); - assertThat(thrown).hasMessageThat().isEqualTo("this is a runtime exception"); - } - - @Test - void testFailure_tooManyTries() throws Exception { - doThrow(new MessagingException("hi")) - .doThrow(new MessagingException("second")) - .when(wrapper) - .sendMessage(any()); - RuntimeException thrown = - assertThrows( - RuntimeException.class, () -> sendEmailService.sendEmail(createBuilder().build())); - assertThat(thrown).hasCauseThat().hasMessageThat().isEqualTo("second"); - assertThat(thrown).hasCauseThat().isInstanceOf(MessagingException.class); - } - - private EmailMessage.Builder createBuilder() throws Exception { - return EmailMessage.newBuilder() - .setFrom(new InternetAddress("registry@example.com")) - .addRecipient(new InternetAddress("fake@example.com")) - .setSubject("Subject") - .setBody("body"); - } - - private Message getMessage() throws MessagingException { - verify(wrapper).sendMessage(messageCaptor.capture()); - return messageCaptor.getValue(); - } - - private BodyPart getInternalContent(Message message) throws Exception { - return ((MimeMultipart) message.getContent()).getBodyPart(0); - } -}