6. email
6.1介绍
spring 框架提供了一个发送邮箱的实用库,这样就可以让避免让开发者更深层次地了解邮箱系统而带来的开发效率问题。org.springframework.mail 包提供了spring框架邮箱的底层支持。发邮件的核心接口为MailSender接口;SimpleMailMessage是一个封装了简单邮件的发送和接收功能的简单类。该包也同样包含了检测异常模块,该模块基于MailException异常提供了底层邮件系统更高级的接口层。
org.springframework.mail.javamail.JavaMailSender接口增加了JavaMail的更多特性,如对MIME的支持,JavaMailSender也同样提供了对
MimeMessage的接口调用。org.springframework.mail.javamail.MimeMessagePreparator。
6.2用法
假定有个业务接口,叫OrderManager:
public interface OrderManager { void placeOrder(Order order); }
同样地,假定邮件信息要携带一个order number和一些用户所需的相关信息,该order number 需要生成。
6.2.1 基础MailSender和SimpleMailMessage用法
import org.springframework.mail.MailException; import org.springframework.mail.MailSender; import org.springframework.mail.SimpleMailMessage; public class SimpleOrderManager implements OrderManager { private MailSender mailSender; private SimpleMailMessage templateMessage; public void setMailSender(MailSender mailSender) { this.mailSender = mailSender; } public void setTemplateMessage(SimpleMailMessage templateMessage) { this.templateMessage = templateMessage; } public void placeOrder(Order order) { // Do the business calculations... // Call the collaborators to persist the order... // Create a thread safe "copy" of the template message and customize it SimpleMailMessage msg = new SimpleMailMessage(this.templateMessage); msg.setTo(order.getCustomer().getEmailAddress()); msg.setText( "Dear " + order.getCustomer().getFirstName() + order.getCustomer().getLastName() + ", thank you for placing order. Your order number is " + order.getOrderNumber()); try{ this.mailSender.send(msg); } catch (MailException ex) { // simply log it and go on... System.err.println(ex.getMessage()); } } }
下面是相关bean的定义:
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host" value="mail.mycompany.com"/> </bean> <!-- this is a template message that we can pre-load with default state --> <bean id="templateMessage" class="org.springframework.mail.SimpleMailMessage"> <property name="from" value="[email protected]"/> <property name="subject" value="Your order"/> </bean> <bean id="orderManager" class="com.mycompany.businessapp.support.SimpleOrderManager"> <property name="mailSender" ref="mailSender"/> <property name="templateMessage" ref="templateMessage"/> </bean>
6.2.2 JavaMailSender 和 MimeMessage的用法
org.springframework.mail.javamail.MimeMessageHelper对处理javaMail信息很方便,该包封装了一个基础JAVAMAIL API,可以用MimeMessageHelper更方便了创建MimeMessae:
JavaMailSenderImpl sender = new JavaMailSenderImpl(); sender.setHost("mail.host.com"); MimeMessage message = sender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message); helper.setTo("[email protected]"); helper.setText("Thank you for ordering!"); sender.send(message);
6.3.1发送附件和内联资源
复杂的邮件信息应该允许附件和内联资源。内联资源比如一些图片,你想要的样式等等。这些资源你不想用附件的形式发送。
附件:
以下就是利用MimeMessageHelper去发送一个简单带有一张JPEG图片附件的邮件。
JavaMailSenderImpl sender = new JavaMailSenderImpl(); sender.setHost("mail.host.com"); MimeMessage message = sender.createMimeMessage(); // use the true flag to indicate you need a multipart message MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setTo("[email protected]"); helper.setText("Check out this image!"); // let's attach the infamous windows Sample file (this time copied to c:/) FileSystemResource file = new FileSystemResource(new File("c:/Sample.jpg")); helper.addAttachment("CoolImage.jpg", file); sender.send(message);
内联资源:
以下就是利用MimeMessageHelper去发送一个带有一张JPEG图片的邮件。
JavaMailSenderImpl sender = new JavaMailSenderImpl(); sender.setHost("mail.host.com"); MimeMessage message = sender.createMimeMessage(); // use the true flag to indicate you need a multipart message MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setTo("[email protected]"); // use the true flag to indicate the text included is HTML helper.setText("<html><body><img src='cid:identifier1234'></body></html>", true); // let's include the infamous windows Sample file (this time copied to c:/) FileSystemResource res = new FileSystemResource(new File("c:/Sample.jpg")); helper.addInline("identifier1234", res); sender.send(message);
6.3.2 创建模板库邮箱内容
上面内容例子代码显示一些简单例子方法调用,这样的操作也是ok的,这些方法调用都是运用了最基础的API。
在你典型企业应用中,你或许就不能用上述的例子方法来创建邮件内容了。
1.用Java创建基于HTML邮件内容是很冗长的,且易产生错误警告。
2.对业务逻辑和展示逻辑没有一个很好的划分。
3.更改邮件内容需要重写java,重新编译,重新部署。
解决上述问题的方法就是用模板库,比如freemarker来定义一个展示email容易的结构。这样就可以让你的代码专注于数据内容。