开发者社区> 青衫无名> 正文

《Spring 5官方文档》电子邮件

简介:
+关注继续查看

29. 电子邮件

29.1 介绍

依赖库:使用Spring框架的邮件功能需要将JavaMail的Jar包添加到依赖中。这个库可以Maven中心找到:com.sun.mail:javax.mail

Spring提供了一个实用的发送电子邮件库,它为使用者屏蔽了邮件系统的底层细节和客户端的底层资源处理。

Spring邮件相关功能在org.springframework.mail包下,其中MailSender是发送邮件的核心接口;SimpleMailMessage类是对邮件属性(发件人、收件人以等)进行简单的封装。这个包中也包含一系列的检查异常,它们是对邮件系统低级别的异常进行抽象,且均继承自MailException。有关异常的更多信息,请参阅相关javadoc。

org.springframework.mail.javamail.JavaMailSender接口继承自MailSender接口,并增加了一些特有的JavaMail功能,如MIME邮件的支持。JavaMailSender还提供了一个用于编写MIME消息的回调org.springframework.mail.javamail.MimeMessagePreparator接口。

 

29.2 使用

我们假设有一个OrderManager业务接口:

1 public interface OrderManager {
2  
3     void placeOrder(Order order);
4  
5 }

假设我们需要生成一个有订单号的邮件,并发送给相关的客户。

29.2.1 MailSenderSimpleMailMessage的基本用法

01 import org.springframework.mail.MailException;
02 import org.springframework.mail.MailSender;
03 import org.springframework.mail.SimpleMailMessage;
04  
05 public class SimpleOrderManager implements OrderManager {
06  
07     private MailSender mailSender;
08     private SimpleMailMessage templateMessage;
09  
10     public void setMailSender(MailSender mailSender) {
11         this.mailSender = mailSender;
12     }
13  
14     public void setTemplateMessage(SimpleMailMessage templateMessage) {
15         this.templateMessage = templateMessage;
16     }
17  
18     public void placeOrder(Order order) {
19  
20         // Do the business calculations...
21  
22         // Call the collaborators to persist the order...
23  
24         // Create a thread safe "copy" of the template message and customize it
25         SimpleMailMessage msg = new SimpleMailMessage(this.templateMessage);
26         msg.setTo(order.getCustomer().getEmailAddress());
27         msg.setText(
28             "Dear " + order.getCustomer().getFirstName()
29                 + order.getCustomer().getLastName()
30                 + ", thank you for placing order. Your order number is "
31                 + order.getOrderNumber());
32         try{
33             this.mailSender.send(msg);
34         }
35         catch (MailException ex) {
36             // simply log it and go on...
37             System.err.println(ex.getMessage());
38         }
39     }
40  
41 }

在xml中添加相关的Bean定义:

01 <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
02     <property name="host" value="mail.mycompany.com"/>
03 </bean>
04  
05 <!-- this is a template message that we can pre-load with default state -->
06 <bean id="templateMessage" class="org.springframework.mail.SimpleMailMessage">
07     <property name="from" value="customerservice@mycompany.com"/>
08     <property name="subject" value="Your order"/>
09 </bean>
10  
11 <bean id="orderManager" class="com.mycompany.businessapp.support.SimpleOrderManager">
12     <property name="mailSender" ref="mailSender"/>
13     <property name="templateMessage" ref="templateMessage"/>
14 </bean>

29.2.2 使用JavaMailSenderMimeMessagePreparator

下面的例子是OrderManager接口的另一种实现,其中使用了MimeMessagePreparator类。 在这里,mailSenderJavaMailSender类型,因此我们可以使用JavaMail MimeMessage类:

01 import javax.mail.Message;
02 import javax.mail.MessagingException;
03 import javax.mail.internet.InternetAddress;
04 import javax.mail.internet.MimeMessage;
05  
06 import javax.mail.internet.MimeMessage;
07 import org.springframework.mail.MailException;
08 import org.springframework.mail.javamail.JavaMailSender;
09 import org.springframework.mail.javamail.MimeMessagePreparator;
10  
11 public class SimpleOrderManager implements OrderManager {
12  
13     private JavaMailSender mailSender;
14  
15     public void setMailSender(JavaMailSender mailSender) {
16         this.mailSender = mailSender;
17     }
18  
19     public void placeOrder(final Order order) {
20  
21         // Do the business calculations...
22  
23         // Call the collaborators to persist the order...
24  
25         MimeMessagePreparator preparator = new MimeMessagePreparator() {
26  
27             public void prepare(MimeMessage mimeMessage) throws Exception {
28  
29                 mimeMessage.setRecipient(Message.RecipientType.TO,
30                         new InternetAddress(order.getCustomer().getEmailAddress()));
31                 mimeMessage.setFrom(newInternetAddress("mail@mycompany.com"));
32                 mimeMessage.setText(
33                         "Dear " + order.getCustomer().getFirstName() + " "
34                             + order.getCustomer().getLastName()
35                             + ", thank you for placing order. Your order number is "
36                             + order.getOrderNumber());
37             }
38         };
39  
40         try {
41             this.mailSender.send(preparator);
42         }
43         catch (MailException ex) {
44             // simply log it and go on...
45             System.err.println(ex.getMessage());
46         }
47     }
48  
49 }

上面中邮件代码只是作为示例,最好方式是将邮件发送代码重构到其它Bean中,并在OrderManager合适的地方调用它。

Spring框架邮件也支持标准的JavaMail实现。 了解更多信息,请参阅相关的javadocs。

29.2 使用MimeMessageHelper

org.springframework.mail.javamail.MimeMessageHelper是一个处理JavaMail消息的好工具,它屏蔽了很多JavaMail API的细节,所以使用MimeMessageHelper可以很简便的创建一个MimeMessage

01 // of course you would use DI in any real-world cases
02 JavaMailSenderImpl sender = new JavaMailSenderImpl();
03 sender.setHost("mail.host.com");
04  
05 MimeMessage message = sender.createMimeMessage();
06 MimeMessageHelper helper = new MimeMessageHelper(message);
07 helper.setTo("test@host.com");
08 helper.setText("Thank you for ordering!");
09  
10 sender.send(message);

29.3.1 附件和嵌入资源

邮件允许添加附件和内联资源。嵌入资源是你嵌入到邮件中的图片或样式,但又不希望显示为附件。

附件

下面的例子将展示如何使用MimeMessageHelper发送一个带JPEG图片附件的邮件:

01 JavaMailSenderImpl sender = new JavaMailSenderImpl();
02 sender.setHost("mail.host.com");
03  
04 MimeMessage message = sender.createMimeMessage();
05  
06 // use the true flag to indicate you need a multipart message
07 MimeMessageHelper helper = new MimeMessageHelper(message, true);
08 helper.setTo("test@host.com");
09  
10 helper.setText("Check out this image!");
11  
12 // let's attach the infamous windows Sample file (this time copied to c:/)
13 FileSystemResource file = new FileSystemResource(newFile("c:/Sample.jpg"));
14 helper.addAttachment("CoolImage.jpg", file);
15  
16 sender.send(message);

嵌入资源

下面的例子将展示如何使用MimeMessageHelper发送一个嵌入图片的邮件:

01 JavaMailSenderImpl sender = new JavaMailSenderImpl();
02 sender.setHost("mail.host.com");
03  
04 MimeMessage message = sender.createMimeMessage();
05  
06 // use the true flag to indicate you need a multipart message
07 MimeMessageHelper helper = new MimeMessageHelper(message, true);
08 helper.setTo("test@host.com");
09  
10 // use the true flag to indicate the text included is HTML
11 helper.setText("<html><body><img src='cid:identifier1234'></body></html>", true);
12  
13 // let's include the infamous windows Sample file (this time copied to c:/)
14 FileSystemResource res = new FileSystemResource(newFile("c:/Sample.jpg"));
15 helper.addInline("identifier1234", res);
16  
17 sender.send(message);

嵌入资源需要使用Content-ID(上面的例子identifier1234)添加到MIME消息中。文本和嵌入资源添加是有顺序的,需要按照先添加文本,再添加嵌入资源的顺序。否则,它将不会工作!

29.3.2 使用模板库创建电子邮件内容

在前面的例子中,我们通常使用message.setText(..)等方法创建邮件内容。在简单的情况下,像前面例子那样使用API就可以满足我们的需要了。

在典型的企业应用程序中,下面的原因让你不定会使用上面的方法创建你的邮件内容。

  • 在Java代码中创建HTML的电子邮件内容冗长,且容易出错
  • 呈现逻辑和业务逻辑混杂
  • 更改电子邮件内容的展示结构需要编写Java代码,重新编译,重新部署…

通常解决方法是使用模板框架定义电子邮件的呈现逻辑,如FreeMarker。分离呈现逻辑和业务逻辑使得你的代码更清晰。当你的邮件的内容变的复杂时,这绝对是一个最佳实践,而且Spring框架对FreeMarker有很好的支持。

转载自 并发编程网 - ifeve.com

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Spring MVC 阅读官方文档知识点总结
Spring MVC 阅读官方文档知识点总结
83 0
《Spring Data官方文档》翻译邀请
转眼间已经11月了,天气也逐渐变得冷了起来,本月并发网组织大家翻译《Spring Data官方指南》,文章比较简单,欢迎使用过或想了解Sring Data的同学参与翻译。 如何领取 通过评论领取想要翻译的文章,每次领取一章或一节(根据内容长短),翻译完后再领取其他章节。
1660 0
《Spring Data官方文档》5.3. Connecting to Cassandra with Spring至5.5. Introduction to CassandraTemplate
5.3. 连接到Spring Cassandra 5.3.1. 外部化连接属性 你需要连接到Cassandra来创建配置文件信息。接触点是键空间的所必需的最小字段,但是为了清楚起见,最好能添加端口。
2065 0
《Spring Data 官方文档》5.7 查询CQL表
5.7. 查询CQL表 有几种选择和查询的风格,您可以从中选择。 请参阅CassandraTemplate API文档,了解所有可用的重载。 查询表的多行数据,并将结果映射到POJO。
1259 0
《Spring Data 官方文档》5.8. 使用自定义转换器重载默认映射至5.10. 异常解释
5.8. 使用自定义转换器重载默认映射 为了对映射过程有更细粒度的控制,你可以使用’CassandraConverter’实现来注册Spring转换器,例如’MappingCassandraConverter’。
1499 0
《Spring Data 官方文档》6. Cassandra 存储库
6. Cassandra 存储库 6.1. 简介 本章将指出Cassandra所提供的存储库的特色。它基于Spring Data Repositories中所提供的核心存储库, 需要您对这里所说的基本概念有一定的了解。
1366 0
+关注
青衫无名
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多