8. 发送邮件

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

因此,Spring Cloud AWS 用户可以决定使用 Amazon SES 服务的 Spring Cloud AWS 实现,或者 使用基于 Java Mail API 的标准实施,通过 SMTP 将电子邮件发送到 Amazon SES。spring-doc.cn

最好使用 Spring Cloud AWS 实现而不是 SMTP,主要是出于性能原因。 Spring Cloud AWS 使用一个 API 调用来发送邮件消息,而 SMTP 协议发出多个请求(EHLO、MAIL FROM、RCPT TO、DATA、QUIT) 直到它发送电子邮件。spring-doc.cn

8.1. 配置邮件发件人

Spring Cloud AWS 提供了一个 XML 元素来为 client 要使用的 client 来使用。默认邮件发件人在没有 Java Mail 依赖项的情况下工作,并且能够在没有 附件作为简单邮件消息。具有必要元素的配置将如下所示:org.springframework.mail.MailSenderspring-doc.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. 发送简单的邮件

应用程序开发人员可以将 注入到他们的应用程序代码中,并直接发送基于简单文本的电子邮件 消息。下面的示例演示了如何创建简单的邮件消息。MailSenderspring-doc.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 依赖项是必需的,并且必须包含在 Classpath 中。Spring Cloud AWS 将检测 dependency 并创建一个允许 create 和 构建 MIME 消息并发送它们。Java Mail API 的依赖项配置是配置中的唯一更改 如下所示。org.springframework.mail.javamail.JavaMailSenderspring-doc.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 Mail API 的依赖关系,下面仍使用 Amazon SES API 来发送邮件 消息。无需设置 SMTP 在 Amazon AWS 端。spring-doc.cn

发送邮件要求应用程序开发人员使用 发送电子邮件,如示例中所示 下面。JavaMailSenderspring-doc.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 云。因此,在不支持邮件的区域托管和运行的应用程序 服务将在使用 Mail 服务时产生错误。因此,必须为邮件覆盖区域 sender 配置。以下示例显示了一个区域 (EU-CENTRAL-1) 的典型组合,该区域不提供 一种 SES 服务,其中的客户端被覆盖以使用有效区域 (EU-WEST-1)。spring-doc.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 邮件服务的任何垃圾邮件攻击,没有生产访问权限的应用程序必须验证每个 电子邮件接收器,否则邮件发件人将抛出 .com.amazonaws.services.simpleemail.model.MessageRejectedExceptionspring-doc.cn

可以请求生产访问权限 ,并且将禁用对邮件地址验证的需要。spring-doc.cn