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 元素来配置 Springorg.springframework.mail.MailSender
实现要使用的客户端。默认邮件发件人无需 Java 邮件依赖项即可工作,并且能够在没有附件作为简单邮件的情况下发送邮件。具有必要元素的配置将如下所示:
<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 Mail API,但下面仍然使用 Amazon SES API 来发送邮件 消息。 无需 SMTP 设置在亚马逊 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 并非在亚马逊云科技云的所有区域都可用。因此,在不支持邮件的区域中托管和运行的应用程序服务将在使用邮件服务时产生错误。因此,必须为邮件覆盖区域发件人配置。以下示例显示了不提供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
.
可以请求生产访问权限并将禁用邮件地址验证的需要。