Skip to content

Commit

Permalink
Merge 7737c8e into e549445
Browse files Browse the repository at this point in the history
  • Loading branch information
musketyr committed Aug 4, 2020
2 parents e549445 + 7737c8e commit 37fef35
Show file tree
Hide file tree
Showing 11 changed files with 91 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Optional;
import java.util.Properties;

import static javax.mail.Message.RecipientType.TO;
Expand All @@ -53,9 +54,11 @@ public class DefaultSimpleEmailService implements SimpleEmailService {
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultSimpleEmailService.class);

private final SesClient client;
private final SimpleEmailServiceConfiguration configuration;

DefaultSimpleEmailService(SesClient client) {
DefaultSimpleEmailService(SesClient client, SimpleEmailServiceConfiguration configuration) {
this.client = client;
this.configuration = configuration;
}

public EmailDeliveryStatus send(TransactionalEmail email) {
Expand Down Expand Up @@ -106,10 +109,15 @@ private static EmailDeliveryStatus handleSend(TransactionalEmail email, Runnable
private EmailDeliveryStatus sendEmailWithAttachment(TransactionalEmail email) throws MessagingException, IOException {
Session session = Session.getInstance(new Properties());
MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.setSubject(email.getSubject());
mimeMessage.setSubject(configuration.getSubjectPrefix().isPresent()
? configuration.getSubjectPrefix().get() + " " + email.getSubject()
: email.getSubject()
);

if (!StringUtils.isEmpty(email.getFrom())) {
mimeMessage.setFrom(new InternetAddress(email.getFrom()));
} else if (configuration.getSourceEmail().isPresent()) {
mimeMessage.setFrom(new InternetAddress(configuration.getSourceEmail().get()));
}

if (!StringUtils.isEmpty(email.getReplyTo())) {
Expand Down Expand Up @@ -147,8 +155,7 @@ private EmailDeliveryStatus sendEmailWithAttachment(TransactionalEmail email) th
SendRawEmailRequest rawEmailRequest = SendRawEmailRequest.builder()
.rawMessage(b -> b.data(SdkBytes.fromByteArray(outputStream.toByteArray())))
.destinations(email.getRecipients())
.source(email.getFrom())
.build();
.source(Optional.ofNullable(email.getFrom()).orElseGet(() -> configuration.getSourceEmail().orElse(null))).build();

return handleSend(email, () -> client.sendRawEmail(rawEmailRequest));
}
Expand All @@ -157,10 +164,15 @@ private EmailDeliveryStatus sendWithoutAttachments(TransactionalEmail email) {
SendEmailRequest.Builder builder = SendEmailRequest.builder()
.destination(b -> b.toAddresses(email.getRecipients()))
.message(b -> {
b.subject(c -> c.data(email.getSubject()));
b.subject(c -> c.data(
configuration.getSubjectPrefix().isPresent()
? configuration.getSubjectPrefix().get() + " " + email.getSubject()
: email.getSubject()
)
);
b.body(body -> body.html(c -> c.data(email.getHtmlBody())));
})
.source(email.getFrom());
.source(Optional.ofNullable(email.getFrom()).orElseGet(() -> configuration.getSourceEmail().orElse(null)));

if (email.getReplyTo() != null && email.getReplyTo().length() > 0) {
builder.replyToAddresses(email.getReplyTo());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,28 @@
import com.agorapulse.micronaut.amazon.awssdk.core.DefaultRegionAndEndpointConfiguration;
import io.micronaut.context.annotation.ConfigurationProperties;

import java.util.Optional;

@ConfigurationProperties("aws.ses")
public class SimpleEmailServiceConfiguration extends DefaultRegionAndEndpointConfiguration {

private Optional<String> sourceEmail = Optional.empty();
private Optional<String> subjectPrefix = Optional.empty();

public Optional<String> getSourceEmail() {
return sourceEmail;
}

public void setSourceEmail(Optional<String> sourceEmail) {
this.sourceEmail = sourceEmail;
}

public Optional<String> getSubjectPrefix() {
return subjectPrefix;
}

public void setSubjectPrefix(Optional<String> subjectPrefix) {
this.subjectPrefix = subjectPrefix;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ public SesAsyncClient sesAsyncClient(

@Bean
@Singleton
public SimpleEmailService simpleEmailService(SesClient client) {
return new DefaultSimpleEmailService(client);
public SimpleEmailService simpleEmailService(SesClient client, SimpleEmailServiceConfiguration configuration) {
return new DefaultSimpleEmailService(client, configuration);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class SendEmailSpec extends Specification {
TemporaryFolder tmp = new TemporaryFolder()

@Subject
SimpleEmailService service = new DefaultSimpleEmailService(simpleEmailService)
SimpleEmailService service = new DefaultSimpleEmailService(simpleEmailService, new SimpleEmailServiceConfiguration())

void "send email"() {
given:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public class SendEmailTest {

private SesClient simpleEmailService = mock(SesClient.class);

private SimpleEmailService service = new DefaultSimpleEmailService(simpleEmailService);
private SimpleEmailService service = new DefaultSimpleEmailService(simpleEmailService, new SimpleEmailServiceConfiguration());

@Test
public void testSendEmail() throws IOException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,13 @@ class SimpleEmailServiceSpec extends Specification {
SesClient simpleEmailService = Mock(SesClient)

@Subject
SimpleEmailService service = new DefaultSimpleEmailService(simpleEmailService)
SimpleEmailService service = new DefaultSimpleEmailService(
simpleEmailService,
new SimpleEmailServiceConfiguration(
sourceEmail: Optional.of('Vladimir Orany <vlad@agorapulse.com>'),
subjectPrefix: Optional.of('[TEST]')
)
)

void "test transactionalEmailWithClosure"() {
when:
Expand Down Expand Up @@ -131,7 +137,6 @@ class SimpleEmailServiceSpec extends Specification {
EmailDeliveryStatus deliveryIndicator = service.send {
to 'test.to@example.com'
subject 'Groovy AWS SDK SES Subject'
from 'test.from@example.com'
replyTo 'test.reply@example.com'
}
then:
Expand All @@ -147,13 +152,14 @@ class SimpleEmailServiceSpec extends Specification {
EmailDeliveryStatus deliveryIndicator = service.send {
to 'test.to@example.com'
subject 'Groovy AWS SDK SES Subject'
from 'test.from@example.com'
replyTo 'test.reply@example.com'
}
then:
deliveryIndicator == EmailDeliveryStatus.STATUS_BLACKLISTED

simpleEmailService.sendEmail(_) >> { SendEmailRequest request ->
request.source() == 'Vladimir Orany <vlad@agorapulse.com>'
request.message().subject().data().startsWith('[TEST] ')
throw AwsServiceException.builder().message('Address blacklisted').build()
}
}
Expand Down Expand Up @@ -187,7 +193,6 @@ class SimpleEmailServiceSpec extends Specification {
subject subjectStr
htmlBody '<p>This is an example body</p>'
to 'test.to@example.com'
from 'test.from@example.com'
attachment {
filepath f.absolutePath
}
Expand All @@ -200,6 +205,7 @@ class SimpleEmailServiceSpec extends Specification {
deliveryIndicator == EmailDeliveryStatus.STATUS_DELIVERED

simpleEmailService.sendRawEmail(_) >> { SendRawEmailRequest request ->
request.source() == 'Vladimir Orany <vlad@agorapulse.com>'
return SendRawEmailResponse.builder().messageId('foobar').build()
}
}
Expand All @@ -212,7 +218,6 @@ class SimpleEmailServiceSpec extends Specification {
subject subjectStr
htmlBody '<p>This is an example body</p>'
to 'test.to@example.com'
from 'test.from@example.com'
attachment {
filename f.name
filepath f.absolutePath
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,11 @@ class DefaultSimpleEmailService implements SimpleEmailService {
}

private final AmazonSimpleEmailService client
private final SimpleEmailServiceConfiguration configuration

DefaultSimpleEmailService(AmazonSimpleEmailService client) {
DefaultSimpleEmailService(AmazonSimpleEmailService client, SimpleEmailServiceConfiguration configuration) {
this.client = client
this.configuration = configuration
}

EmailDeliveryStatus send(TransactionalEmail email) throws Exception {
Expand All @@ -95,13 +97,15 @@ class DefaultSimpleEmailService implements SimpleEmailService {
}
}

@SuppressWarnings(['LineLength', 'ElseBlockBraces', 'JavaIoPackageAccess'])
@SuppressWarnings(['LineLength', 'ElseBlockBraces', 'JavaIoPackageAccess', 'AbcMetric'])
private EmailDeliveryStatus sendEmailWithAttachment(TransactionalEmail email) throws UnsupportedAttachmentTypeException {
Session session = Session.getInstance(new Properties())
MimeMessage mimeMessage = new MimeMessage(session)

if (email.from) {
mimeMessage.from = new InternetAddress(email.from)
} else if (configuration.sourceEmail.present) {
mimeMessage.from = new InternetAddress(configuration.sourceEmail.get())
}

if (email.replyTo) {
Expand All @@ -112,7 +116,10 @@ class DefaultSimpleEmailService implements SimpleEmailService {
mimeMessage.addRecipients(TO, new InternetAddress(recipient))
}

mimeMessage.subject = email.subject
mimeMessage.subject = configuration.subjectPrefix.map { prefix ->
"$prefix $email.subject".toString()
} orElse(email.subject)

MimeMultipart mimeMultipart = new MimeMultipart()

BodyPart p = new MimeBodyPart()
Expand Down Expand Up @@ -141,7 +148,7 @@ class DefaultSimpleEmailService implements SimpleEmailService {
SendRawEmailRequest rawEmailRequest = new SendRawEmailRequest(rawMessage)

rawEmailRequest.destinations = email.recipients
rawEmailRequest.source = email.from
rawEmailRequest.source = email.from ?: configuration.sourceEmail.orElse(null)

return handleSend(email) {
client.sendRawEmail(rawEmailRequest)
Expand All @@ -161,12 +168,19 @@ class DefaultSimpleEmailService implements SimpleEmailService {
@SuppressWarnings(['LineLength', 'ElseBlockBraces'])
private EmailDeliveryStatus sendWithoutAttachments(TransactionalEmail email) {
Destination destination = new Destination(email.recipients)
Content messageSubject = new Content(email.subject)

String subject = configuration.subjectPrefix.map { prefix ->
"$prefix $email.subject".toString()
} orElse(email.subject)

Content messageSubject = new Content(subject)

Body messageBody = new Body().withHtml(new Content(email.htmlBody))
Message message = new Message(messageSubject, messageBody)

return handleSend(email) {
SendEmailRequest sendEmailRequest = new SendEmailRequest(email.from, destination, message)
String from = email.from ?: configuration.sourceEmail.orElse(null)
SendEmailRequest sendEmailRequest = new SendEmailRequest(from, destination, message)
if (email.replyTo) {
sendEmailRequest.replyToAddresses = singletonList(email.replyTo)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,7 @@ import javax.inject.Named
@Requires(classes = AmazonSimpleEmailService)
class SimpleEmailServiceConfiguration extends DefaultRegionAndEndpointConfiguration {

Optional<String> sourceEmail = Optional.empty()
Optional<String> subjectPrefix = Optional.empty()

}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,10 @@ class SendEmailSpec extends Specification {
TemporaryFolder tmp = new TemporaryFolder()

@Subject
SimpleEmailService service = new DefaultSimpleEmailService(simpleEmailService)
SimpleEmailService service = new DefaultSimpleEmailService(
simpleEmailService,
new SimpleEmailServiceConfiguration()
)

void "send email"() {
given:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,10 @@ public class SendEmailTest {

private AmazonSimpleEmailService simpleEmailService = mock(AmazonSimpleEmailService.class);

private SimpleEmailService service = new DefaultSimpleEmailService(simpleEmailService);
private SimpleEmailService service = new DefaultSimpleEmailService(
simpleEmailService,
new SimpleEmailServiceConfiguration()
);

@Test
public void testSendEmail() throws IOException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,10 @@ class SimpleEmailServiceSpec extends Specification {
AmazonSimpleEmailService simpleEmailService = Mock(AmazonSimpleEmailService)

@Subject
SimpleEmailService service = new DefaultSimpleEmailService(simpleEmailService)
SimpleEmailService service = new DefaultSimpleEmailService(simpleEmailService, new SimpleEmailServiceConfiguration(
sourceEmail: Optional.of('Vladimir Orany <vlad@agorapulse.com>'),
subjectPrefix: Optional.of('[TEST]')
))

void "test transactionalEmailWithClosure"() {
when:
Expand Down Expand Up @@ -147,13 +150,14 @@ class SimpleEmailServiceSpec extends Specification {
EmailDeliveryStatus deliveryIndicator = service.send {
to 'test.to@example.com'
subject 'Groovy AWS SDK SES Subject'
from 'test.from@example.com'
replyTo 'test.reply@example.com'
}
then:
deliveryIndicator == EmailDeliveryStatus.STATUS_BLACKLISTED

simpleEmailService.sendEmail(_) >> { SendEmailRequest request ->
assert request.source == 'Vladimir Orany <vlad@agorapulse.com>'
assert request.message.subject.data.startsWith('[TEST] ')
throw new AmazonServiceException('Address blacklisted')
}
}
Expand All @@ -163,7 +167,6 @@ class SimpleEmailServiceSpec extends Specification {
EmailDeliveryStatus deliveryIndicator = service.send {
to 'test.to@example.com'
subject 'Groovy AWS SDK SES Subject'
from 'test.from@example.com'
replyTo 'test.reply@example.com'
}
then:
Expand All @@ -187,7 +190,6 @@ class SimpleEmailServiceSpec extends Specification {
subject subjectStr
htmlBody '<p>This is an example body</p>'
to 'test.to@example.com'
from 'test.from@example.com'
attachment {
filepath f.absolutePath
}
Expand All @@ -196,6 +198,7 @@ class SimpleEmailServiceSpec extends Specification {
deliveryIndicator == EmailDeliveryStatus.STATUS_DELIVERED

simpleEmailService.sendRawEmail(_) >> { SendRawEmailRequest request ->
assert request.source == 'Vladimir Orany <vlad@agorapulse.com>'
return new SendRawEmailResult().withMessageId('foobar')
}
}
Expand Down

0 comments on commit 37fef35

Please sign in to comment.