一、簡介
????????Spring 提供了非常好用的 JavaMailSender 接口實現郵件發送。在 SpringBoot 的 Starter 模塊中也為此提供了自動化配置。下面通過實例看看如何在 SpringBoot 中使用 JavaMailSender 發送郵件。
?org.springframework.mail
是Spring Framework對郵件支持的基礎包,發送郵件的核心接口MailSender
,SimpleMailMessage
封裝了發送簡單郵件的屬性 ,這個包還包含檢查異常的層次結構,這些層次結構在較低級別的郵件系統異常上提供了更高級別的抽象,而根異常是MailException
。
org.springframework.mail.javamail.JavaMailSender接口添加了專門的JavaMail功能,例如MIME消息支持到MailSender接口 (從其繼承)。JavaMailSender還提供了一個名為org.springframework.mail.javamail.MimeMessagePreparator的回調接口,用于準備一個MimeMessage。
二、使用 SpringBoot 創建 Java Web 項目,添加郵件相關依賴包
??在 SpringBoot 工程中的 pom.xml 中引入 spring-boot-starter-mail 依賴。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>
三、使用
假設我們有一個名為OrderManager的業務類,如下面的示例所示:
public interface OrderManager {void placeOrder(Order order) throws MessagingException;
}
3、1MailSender和SimpleMailMessage的基本用法
public class SimpleOrderManager implements OrderManager {@Value("${spring.mail.from}")private String mailFrom;@Resourceprivate MailSender mailSender;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 itSimpleMailMessage msg = new SimpleMailMessage();msg.setTo(order.getCustomer().getEmailAddress());msg.setFrom(mailFrom);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());}}}
3.2 JavaMailSender 和MimeMessagePreparator的用法
@Service
public class SimpleOrderManagerPreparator implements OrderManager {@Value("${spring.mail.from}")private String mailFrom;@Resourceprivate JavaMailSender mailSender;public void setMailSender(JavaMailSender mailSender) {this.mailSender = mailSender;}@Overridepublic void placeOrder(final Order order) {// Do the business calculations...// Call the collaborators to persist the order...MimeMessagePreparator preparator = new MimeMessagePreparator() {public void prepare(MimeMessage mimeMessage) throws Exception {mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(order.getCustomer().getEmailAddress()));mimeMessage.setFrom(new InternetAddress(mailFrom));mimeMessage.setText("Dear " + order.getCustomer().getFirstName() + " " +order.getCustomer().getLastName() + ", thanks for your order. " +"Your order number is " + order.getOrderNumber() + ".");}};try {this.mailSender.send(preparator);} catch (MailException ex) {// simply log it and go on...System.err.println(ex.getMessage());}}}
郵件代碼可以作為一個切面,可以在OrderManager目標上的適當連接點處運行。
3.3 JavaMail MimeMessageHelper的使用
使用MimeMessageHelper可以代替基礎的JavaMail API。
@Service
public class SimpleOrderManagerHelper implements OrderManager {@Value("${spring.mail.from}")private String mailFrom;@Resourceprivate JavaMailSender mailSender;public void placeOrder(Order order) throws MessagingException {// Do the business calculations...// Call the collaborators to persist the order...// Create a thread safe "copy" of the template message and customize itMimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message);helper.setTo(order.getCustomer().getEmailAddress());helper.setFrom(mailFrom);helper.setText("Dear " + order.getCustomer().getFirstName()+ order.getCustomer().getLastName()+ ", thank you for placing order. Your order number is "+ order.getOrderNumber());try {this.mailSender.send(message);} catch (MailException ex) {// simply log it and go on...System.err.println(ex.getMessage());}}
}
3.4 發送附件
下面的示例將展示如何使用MimeMessageHelper發送帶有單個JPEG圖像附件的電子郵件:
@Service
public class SimpleOrderManagerAttachments implements OrderManager {@Value("${spring.mail.from}")private String mailFrom;@Resourceprivate JavaMailSender mailSender;public void placeOrder(Order order) throws MessagingException {// Do the business calculations...// Call the collaborators to persist the order...// Create a thread safe "copy" of the template message and customize itMimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setTo(order.getCustomer().getEmailAddress());helper.setFrom(mailFrom);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("./sample.png"));helper.addAttachment("CoolImage.jpg", file);try {this.mailSender.send(message);} catch (MailException ex) {// simply log it and go on...System.err.println(ex.getMessage());}}
}
發送附件和內聯資源
多部分電子郵件消息允許附件和內聯資源。內聯資源的示例包括要在郵件中使用但不想顯示為附件的圖像或樣式表。
附件
下面的示例向您展示如何使用MimeMessageHelper發送帶有單個JPEG圖像附件的電子郵件:
3.5 內聯資源
下面的示例將展示如何使用MimeMessageHelper發送帶有內聯映像的電子郵件:
@Service
public class SimpleOrderManagerInlineResources implements OrderManager {@Value("${spring.mail.from}")private String mailFrom;@Resourceprivate JavaMailSender mailSender;public void placeOrder(Order order) throws MessagingException {// Do the business calculations...// Call the collaborators to persist the order...// Create a thread safe "copy" of the template message and customize itMimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setTo(order.getCustomer().getEmailAddress());helper.setFrom(mailFrom);helper.setText("<html><body><img src='cid:identifier1234'></body></html>", true);// let's attach the infamous windows Sample file (this time copied to c:/)FileSystemResource res = new FileSystemResource(new File("./sample.png"));helper.addInline("identifier1234", res);try {this.mailSender.send(message);} catch (MailException ex) {// simply log it and go on...System.err.println(ex.getMessage());}}
}
????????通過使用指定的Content-ID 將內聯資源添加到MimeMessage。添加文本和資源的順序非常重要。請務必先添加文本,然后再添加資源。如果您以相反的方式進行操作,則無法正常工作。