8. 发送邮件

Spring 内置了基于 Java Mail API 发送电子邮件的支持,以避免在使用 Java Mail API 时调用任何静态方法,从而提升应用程序的可测试性。Spring Cloud AWS 支持将 Amazon SES 作为 Spring 邮件抽象的实现。spring-doc.cadn.net.cn

因此,Spring Cloud AWS 用户可以选择使用 Spring Cloud AWS 对 Amazon SES 服务的实现,或使用基于标准 Java Mail API 的实现,该实现通过 SMTP 将电子邮件发送至 Amazon SES。spring-doc.cadn.net.cn

建议优先使用 Spring Cloud AWS 实现而非 SMTP,主要原因在于性能方面。Spring Cloud AWS 仅需一次 API 调用即可发送邮件消息,而 SMTP 协议则需多次请求(EHLO、MAIL FROM、RCPT TO、DATA、QUIT)才能完成邮件发送。spring-doc.cadn.net.cn

8.1. 配置邮件发送器

Spring Cloud AWS 提供了一个 XML 元素,用于配置 Spring org.springframework.mail.MailSender 实现,以供客户端使用。默认邮件发送器无需 Java Mail 依赖即可工作,并且能够以简单邮件消息的形式发送不带附件的消息。包含必要元素的配置示例如下:spring-doc.cadn.net.cn

<beans xmlns:aws-mail="http://www.springframework.org/schema/cloud/aws/mail"
   xsi:schemaLocation="http://www.springframework.org/schema/cloud/aws/mail
      http://www.springframework.org/schema/cloud/aws/mail/spring-cloud-aws-mail.xsd">

    <aws-context:context-credentials>
      ..
    </aws-context:context-credentials>

    <aws-context:context-region region="eu-west-1" />

    <aws-mail:mail-sender id="testSender" />

</beans>

8.2. 发送简单邮件

应用开发者可以将 MailSender 注入到其应用代码中,并直接发送基于文本的简单电子邮件消息。下面的示例演示了如何创建一条简单的邮件消息。spring-doc.cadn.net.cn

public class MailSendingService {

    private MailSender mailSender;

    @Autowired
    public MailSendingService(MailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void sendMailMessage() {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setFrom("[email protected]");
        simpleMailMessage.setTo("[email protected]");
        simpleMailMessage.setSubject("test subject");
        simpleMailMessage.setText("test content");
        this.mailSender.send(simpleMailMessage);
    }
}

8.3. 发送附件

通过电子邮件发送附件需要创建并发送MIME消息。为了创建MIME消息,需要Java Mail依赖项,并将其包含在类路径中。Spring Cloud AWS将检测到该依赖项,并创建一个org.springframework.mail.javamail.JavaMailSender实现,以允许创建和构建MIME消息并将其发送出去。对Java Mail API的依赖配置是以下所示配置中唯一的更改。spring-doc.cadn.net.cn

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mailapi</artifactId>
    <version>1.4.1</version>
    <exclusions>
        <!-- exclusion because we are running on Java 1.7 that includes the activation API by default-->
        <exclusion>
            <artifactId>activation</artifactId>
            <groupId>javax.activation</groupId>
        </exclusion>
    </exclusions>
</dependency>

尽管存在对 Java 邮件 API 的依赖,但实际发送邮件消息时仍使用 Amazon SES API。在 Amazon AWS 侧无需进行 SMTP 设置spring-doc.cadn.net.cn

发送邮件需要应用程序开发人员使用 JavaMailSender 来发送电子邮件,如下例所示。spring-doc.cadn.net.cn

public class MailSendingService {

    private JavaMailSender mailSender;

    @Autowired
    public MailSendingService(JavaMailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void sendMailMessage() {
        this.mailSender.send(new MimeMessagePreparator() {

            @Override
            public void prepare(MimeMessage mimeMessage) throws Exception {
                MimeMessageHelper helper =
                    new MimeMessageHelper(mimeMessage, true, "UTF-8");
                helper.addTo("[email protected]");
                helper.setFrom("[email protected]");
                helper.addAttachment("test.txt", ...);
                helper.setSubject("test subject with attachment");
                helper.setText("mime body", false);
            }
        });
    }
}

8.4. 配置区域

Amazon SES 并非在所有 Amazon Web Services 云的 区域 中都可用。因此,若在不支持邮件服务的区域中托管和运行的应用程序,在使用邮件服务时将产生错误。因此,必须为邮件发送器配置重写区域。以下示例展示了一个典型的组合:区域(EU-CENTRAL-1)不提供 SES 服务,而客户端则被重写以使用一个有效区域(EU-WEST-1)。spring-doc.cadn.net.cn

<beans ...>

 <aws-context:context-region region="eu-central-1" />
 <aws-mail:mail-sender id="testSender" region="eu-west-1"/>

</beans>

8.5. 验证电子邮件

为避免对 Amazon SES 邮件服务的任何垃圾邮件攻击,没有生产访问权限的应用程序必须验证每个电子邮件接收者,否则邮件发送者将抛出1spring-doc.cadn.net.cn

生产环境访问 可以申请,且将无需邮箱地址验证。spring-doc.cadn.net.cn