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

    xiaoxiao2024-07-04  115

    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 MailSender和SimpleMailMessage的基本用法

    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 使用JavaMailSender和MimeMessagePreparator

    下面的例子是OrderManager接口的另一种实现,其中使用了MimeMessagePreparator类。 在这里,mailSender是JavaMailSender类型,因此我们可以使用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(); 03sender.setHost("mail.host.com"); 04  05MimeMessage message = sender.createMimeMessage(); 06 MimeMessageHelper helper = new MimeMessageHelper(message); 07 helper.setTo("test@host.com"); 08 helper.setText("Thank you for ordering!"); 09  10sender.send(message);

    29.3.1 附件和嵌入资源

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

    附件

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

    01 JavaMailSenderImpl sender = new JavaMailSenderImpl(); 02sender.setHost("mail.host.com"); 03  04MimeMessage 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")); 14helper.addAttachment("CoolImage.jpg", file); 15  16sender.send(message);

    嵌入资源

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

    01 JavaMailSenderImpl sender = new JavaMailSenderImpl(); 02sender.setHost("mail.host.com"); 03  04MimeMessage 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")); 15helper.addInline("identifier1234", res); 16  17sender.send(message);

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

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

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

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

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

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

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

    相关资源:Spring 5 英文文档全套.7z
    最新回复(0)