8. 发送邮件
Spring 内置了对基于 Java Mail API 发送电子邮件的支持,以避免在使用 Java Mail API 时进行任何静态方法调用,从而支持应用程序的可测试性。 Spring Cloud AWS 支持将 Amazon SES 作为 Spring Mail 抽象的实现。
因此,Spring Cloud AWS 用户可以决定使用 Amazon SES 服务的 Spring Cloud AWS 实现,或者 使用基于 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 元素来为
client 要使用的 client 来使用。默认邮件发件人在没有 Java Mail 依赖项的情况下工作,并且能够在没有
附件作为简单邮件消息。具有必要元素的配置将如下所示:org.springframework.mail.MailSender
<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 依赖项是必需的,并且必须包含在 Classpath 中。Spring Cloud AWS 将检测
dependency 并创建一个允许 create 和
构建 MIME 消息并发送它们。Java Mail API 的依赖项配置是配置中的唯一更改
如下所示。org.springframework.mail.javamail.JavaMailSender
<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 端。 |
发送邮件要求应用程序开发人员使用 发送电子邮件,如示例中所示
下面。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 云。因此,在不支持邮件的区域托管和运行的应用程序 服务将在使用 Mail 服务时产生错误。因此,必须为邮件覆盖区域 sender 配置。以下示例显示了一个区域 (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 邮件服务的任何垃圾邮件攻击,没有生产访问权限的应用程序必须验证每个
电子邮件接收器,否则邮件发件人将抛出 .com.amazonaws.services.simpleemail.model.MessageRejectedException
可以请求生产访问权限 ,并且将禁用对邮件地址验证的需要。