8. 发送邮件
Spring 内置支持基于 Java Mail API 发送电子邮件,以避免在使用 Java Mail API 时进行任何静态方法调用,从而支持应用程序的可测试性。 Spring Cloud AWS 支持 Amazon SES 作为 Spring Mail 抽象的实现。
因此,Spring Cloud AWS 用户可以决定使用 Amazon SES 服务的 Spring Cloud AWS 实现,或者 使用基于标准 Java 邮件 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 Mail 依赖项即可工作,并且能够在没有 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 来发送邮件 消息。无需 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 并非在 亚马逊云科技云。因此,在不支持邮件的区域中托管和运行的应用程序 服务在使用邮件服务时会产生错误。因此,必须覆盖邮件的区域 发件人配置。下面的示例显示了不提供 客户端被覆盖以使用有效区域 (EU-WEST-1) 的 SES 服务。
<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
.
可以请求生产访问权限 并将禁用邮件地址验证的需要。