8. 发送邮件
Spring 内置了基于 Java Mail API 发送电子邮件的支持,以避免在使用 Java Mail API 时调用任何静态方法,从而提升应用程序的可测试性。Spring Cloud AWS 支持将 Amazon SES 作为 Spring 邮件抽象的实现。
因此,Spring Cloud AWS 用户可以选择使用 Spring Cloud AWS 对 Amazon SES 服务的实现,或使用基于标准 Java Mail API 的实现,该实现通过 SMTP 将电子邮件发送至 Amazon SES。
|
建议优先使用 Spring Cloud AWS 实现而非 SMTP,主要原因在于性能方面。Spring Cloud AWS 仅需一次 API 调用即可发送邮件消息,而 SMTP 协议则需多次请求(EHLO、MAIL FROM、RCPT TO、DATA、QUIT)才能完成邮件发送。 |
8.1. 配置邮件发送器
Spring Cloud AWS 提供了一个 XML 元素,用于配置 Spring org.springframework.mail.MailSender 实现,以供客户端使用。默认邮件发送器无需 Java Mail 依赖即可工作,并且能够以简单邮件消息的形式发送不带附件的消息。包含必要元素的配置示例如下:
<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 注入到其应用代码中,并直接发送基于文本的简单电子邮件消息。下面的示例演示了如何创建一条简单的邮件消息。
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的依赖配置是以下所示配置中唯一的更改。
<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 设置。 |
发送邮件需要应用程序开发人员使用 JavaMailSender 来发送电子邮件,如下例所示。
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)。
<beans ...>
<aws-context:context-region region="eu-central-1" />
<aws-mail:mail-sender id="testSender" region="eu-west-1"/>
</beans>
8.5. 验证电子邮件
为避免对 Amazon SES 邮件服务的任何垃圾邮件攻击,没有生产访问权限的应用程序必须验证每个电子邮件接收者,否则邮件发送者将抛出1。
生产环境访问 可以申请,且将无需邮箱地址验证。