8. 发送邮件

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

因此,Spring Cloud AWS 用户可以决定使用 Amazon SES 服务的 Spring Cloud AWS 实现,或者 使用基于标准 Java 邮件 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 元素来配置 Springorg.springframework.mail.MailSender实现 客户端。默认邮件发件人无需 Java Mail 依赖项即可工作,并且能够在没有 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 来发送邮件 消息。无需 SMTP 设置 在亚马逊 AWS 端。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 并非在 亚马逊云科技云。因此,在不支持邮件的区域中托管和运行的应用程序 服务在使用邮件服务时会产生错误。因此,必须覆盖邮件的区域 发件人配置。下面的示例显示了不提供 客户端被覆盖以使用有效区域 (EU-WEST-1) 的 SES 服务。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 邮件服务进行任何垃圾邮件攻击,没有生产访问权限的应用程序必须验证每个 电子邮件接收者,否则邮件发送者将抛出com.amazonaws.services.simpleemail.model.MessageRejectedException.spring-doc.cadn.net.cn

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