awspring / spring-cloud-aws

The New Home for Spring Cloud AWS
http://awspring.io
Apache License 2.0
830 stars 283 forks source link

Unable to send when no to: address supplied. #1173

Open buckett opened 1 week ago

buckett commented 1 week ago

Type: Bug

Component: SES

Describe the bug Unable to send an email that doesn't have an TO: address.

We were attempting to send an email that just has lots of BCCs (no TO: address) and this worked with JavaMail, but when we switched to using the Spring Cloud AWS integration it started failing. According to the documentation on SES it states:

The message must include at least one recipient email address. The recipient address can be a To: address, a CC: address, or a BCC: address.

Sample

    SimpleMailMessage template = new SimpleMailMessage();
    template.setFrom("Sender <sender@other.test>");
    template.setSubject("Subject");
    template.setBody("Nothing to see here");

    SimpleMailMessage message = new SimpleMailMessage(template);
    message.setBcc("User 1 <user1@server.test>", "User 2 <user2@server.test>");
    mailsender.send(message).

Workaround

To workaround this you can set the to address to be new String[]{} which is the same as passing nothing. This ends up setting the to address to not be null, but doesn't cause problems with the SES implementation.

    message.setTo();

Passing null doesn't work as this creates an array with one item (of value null) which then fails because it's not a valid email.

buckett commented 1 week ago

The stack trace we were seeing:

java.lang.NullPointerException: null
    at java.util.Objects.requireNonNull
    at java.util.Arrays$ArrayList.<init>
    at java.util.Arrays.asList
    at software.amazon.awssdk.services.ses.model.Destination$BuilderImpl.toAddresses(Destination.java:391)
    at io.awspring.cloud.ses.SimpleEmailServiceMailSender.prepareMessage(SimpleEmailServiceMailSender.java:114)
    at io.awspring.cloud.ses.SimpleEmailServiceMailSender.send(SimpleEmailServiceMailSender.java:84)
    at io.awspring.cloud.ses.SimpleEmailServiceMailSender.send(SimpleEmailServiceMailSender.java:74)
    [..snipped..]