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容易的結構。這樣就可以讓你的代碼專注於數據內容。