spring郵件發送(轉)

s pring對郵件發送支持的很好,咱們只要配置好郵件發送器,寫好郵件發送具體操做類的方法,那麼實現就不是很難的事,不過這個過程當中常常會出現這樣或那樣的錯誤,因此待講完本篇後我會整體總結下spring郵件發送容易發生的錯誤及解決辦法

關於郵件發送,不外乎有這麼幾種狀況,一種是純文本的發送,一種是HTML形式的發送,一種就是發送時帶有附件,一種就是發送時採起的事羣發,針對這幾個我將一一來說下,個人代碼中將第一中歸爲一大類,後面三種歸爲一代類,因此將會出現兩種配置文件html

第一大類郵件發送【純文本發送】java

必須包:spring.jar,common-logging.jar,mail.jar,servlet.jar,common-collection.jarweb

首先咱們來看spring配置文件applicationContext.xmlspring

Xml代碼   收藏代碼
  1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"  
  4.     xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xsi:schemaLocation="  
  6.             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  7.             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  8.             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  9.     <!--定義郵件發送器,配置好發送者詳細信息-->  
  10.     <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">  
  11.         <property name="host" value="smtp.163.com" />  
  12.         <property name="port" value="25" />  
  13.         <property name="username" value="emailusername" />  
  14.         <property name="password" value="emailpassword" />  
  15.         <property name="defaultEncoding" value="utf-8" />  
  16.         <property name="javaMailProperties">  
  17.             <props>  
  18.                 <prop key="mail.smtp.auth">true</prop>  
  19.             </props>  
  20.         </property>  
  21.     </bean>  
  22.   
  23.     <bean id="emailService" class="com.javacrazyer.comon.SendOrderConfirmationEmailAdvice">  
  24.         <property name="mailSender" ref="mailSender" />  
  25.     </bean>  
  26.   
  27. </beans></span>  

用到的實體類Order.javamvc

Java代碼   收藏代碼
  1. <span style="font-size: medium;">package com.javacrazyer.comon;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class Order implements Serializable {  
  6.   
  7.     /* Private Fields */  
  8.   
  9.     private int orderId;  
  10.     private String username;  
  11.     private String useremail;  
  12.   
  13.     public int getOrderId() {  
  14.         return orderId;  
  15.     }  
  16.   
  17.     public void setOrderId(int orderId) {  
  18.         this.orderId = orderId;  
  19.     }  
  20.   
  21.     public String getUsername() {  
  22.         return username;  
  23.     }  
  24.   
  25.     public void setUsername(String username) {  
  26.         this.username = username;  
  27.     }  
  28.   
  29.     public String getUseremail() {  
  30.         return useremail;  
  31.     }  
  32.   
  33.     public void setUseremail(String useremail) {  
  34.         this.useremail = useremail;  
  35.     }  
  36.   
  37. }  
  38. </span>  

 

 郵件發送類的接口類MailService.javaapp

Java代碼   收藏代碼
  1. <span style="font-size: medium;">package com.javacrazyer.comon;  
  2.   
  3.   
  4. /** 
  5.  * 使用Spring發送郵件 
  6.  *  
  7.  */  
  8.   
  9. public interface MailService {  
  10.       
  11.       
  12.     void sendOrderMail(Order order);  
  13.   
  14. }  
  15. </span>  

 

具體實現的郵件發送類SendOrderConfirmationEmailAdvice.java框架

Java代碼   收藏代碼
  1. <span style="font-size: medium;">package com.javacrazyer.comon;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStreamReader;  
  6.   
  7. import org.springframework.mail.MailSender;  
  8. import org.springframework.mail.SimpleMailMessage;  
  9.   
  10. public class SendOrderConfirmationEmailAdvice implements MailService{  
  11.   
  12.     private String from="emailusername@163.com"//發送人郵箱地址,必須與spring配置文件中的郵箱地址同樣  
  13.     private String registeTemplateName = "com/javacrazyer/comon/mail_registe.txt";  
  14.     private MailSender mailSender;  
  15.   
  16.     public void setMailSender(MailSender mailSender) {  
  17.         this.mailSender = mailSender;  
  18.     }  
  19.   
  20.   
  21.     public void sendOrderMail(Order order) {  
  22.         //SimpleMialMessage只能用來發送TEXT格式的郵件  
  23.         SimpleMailMessage mail = new SimpleMailMessage();  
  24.         mail.setFrom(this.from);  
  25.         mail.setTo(order.getUseremail());  
  26.         mail.setSubject("恭喜你成功註冊成爲SOMEDAY商城的會員!");  
  27.         mail.setText(loadTemplateContent(registeTemplateName).replaceAll("\\$\\{LOGINNAME\\}", order.getUsername()));  
  28.         this.mailSender.send(mail);  
  29.   
  30.     }  
  31.   
  32.   
  33.       
  34.     private String loadTemplateContent(String templateName){  
  35.         StringBuilder sb = new StringBuilder();  
  36.         BufferedReader br= null;  
  37.         try{  
  38.             br = new BufferedReader(  
  39.                     new InputStreamReader(  
  40.                         Thread.currentThread()  
  41.                               .getContextClassLoader()  
  42.                               .getResourceAsStream(templateName), "UTF-8"));  
  43.               
  44.             String lineSeparator = System.getProperty("line.separator");  
  45.             for(String str = null; (str = br.readLine()) != null;){  
  46.                 sb.append(str);  
  47.                 sb.append(lineSeparator);  
  48.             }  
  49.         }catch(IOException e){  
  50.             e.printStackTrace();  
  51.         }finally{  
  52.             if(br != null){  
  53.                 try {  
  54.                     br.close();  
  55.                 } catch (IOException e) {  
  56.                     e.printStackTrace();  
  57.                 }  
  58.             }  
  59.         }  
  60.           
  61.         return sb.toString();  
  62.     }  
  63.   
  64.   
  65.   
  66. }</span>  

 用到的mail_registe.txt函數

Java代碼   收藏代碼
  1. <span style="font-size: medium;">親愛的${LOGINNAME}:您好!  
  2. 恭喜你成爲SOMEDAY商城的會員!  
  3.   
  4. 你的登陸用戶名爲:${LOGINNAME}  
  5. 你的登陸口令爲:******(隱藏)  
  6.   
  7. 本站網址:http://www.yoursitename.cn  
  8. 聯繫郵箱:hr@yoursite.cn</span>  

 

測試發送測試

Java代碼   收藏代碼
  1. <span style="font-size: medium;">package com.javacrazyer.service.test;  
  2.   
  3. import org.junit.Test;  
  4. import org.springframework.context.ApplicationContext;  
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  6.   
  7. import com.javacrazyer.comon.MailService;  
  8. import com.javacrazyer.comon.Order;  
  9.   
  10. public class UserServiceTest {  
  11.   
  12.     @Test  
  13.     public void test() throws InterruptedException {  
  14.         ApplicationContext context = new ClassPathXmlApplicationContext(  
  15.                 "applicationContext.xml");  
  16.         MailService sf = (MailService) context.getBean("emailService");  
  17.         Order order = new Order();  
  18.         order.setUsername("cheneywu");  
  19.         order.setUseremail("xxxxxx@qq.com");  
  20.         sf.sendOrderMail(order);  
  21.     }  
  22. }</span>  

 注意查收郵箱中的信息哦ui


第二大類郵件發送【HTML格式的發送,羣發,附件】

  除了上面包外,還須要spring-webmvc.jar,freemarker.jar,爲何須要freemarker呢,由於要發送HTML格式的 文件,因此要先寫好HTML內容的文件,而後用模板freemarker匹配其中的值,Spring中對freemarker也有很好的支持

 spring配置文件applicatonContext-html.xml

Xml代碼   收藏代碼
  1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"  
  4.     xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xsi:schemaLocation="  
  6.             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  7.             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  8.             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  9.     <bean id="freeMarker"  
  10.         class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">  
  11.         <property name="templateLoaderPath" value="classpath:mailTemplate" />  
  12.         <!--指定模板文件目錄-->  
  13.         <property name="freemarkerSettings"><!-- 設置FreeMarker環境屬性-->  
  14.             <props>  
  15.                 <prop key="template_update_delay">1800</prop><!--刷新模板的週期,單位爲秒-->  
  16.                 <prop key="default_encoding">UTF-8</prop><!--模板的編碼格式 -->  
  17.                 <prop key="locale">zh_CN</prop><!-- 本地化設置-->  
  18.             </props>  
  19.         </property>  
  20.     </bean>  
  21.   
  22.     <!-- 注意:這裏的參數(如用戶名、密碼)都是針對郵件發送者的 -->  
  23.     <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">  
  24.         <property name="host" value="smtp.163.com" />  
  25.         <property name="port" value="25" />  
  26.         <property name="username" value="emailusername" />  
  27.         <property name="password" value="emailpassword" />  
  28.         <property name="defaultEncoding" value="utf-8" />  
  29.         <property name="javaMailProperties">  
  30.             <props>  
  31.                 <prop key="mail.smtp.auth">true</prop>  
  32.             </props>  
  33.         </property>  
  34.     </bean>  
  35.     <bean id="emailService" class="com.javacrazyer.comon.EmailService">  
  36.         <property name="mailSender" ref="mailSender"></property>  
  37.         <property name="freeMarkerConfigurer" ref="freeMarker"></property>  
  38.     </bean>  
  39. </beans>    </span>  

 模板文件目mailTemplate下的模板文件registe.ftl 【這個文件無名字、後綴無所謂,只要內容是HTML內容便可】

Html代碼   收藏代碼
  1. <span style="font-size: medium;"><html>    
  2.    <head>    
  3.       <meta http-equiv="content-type" content="text/html;charset=utf8">    
  4.    </head>    
  5.    <body>    
  6.        恭喜您成功註冊!您的用戶名爲:<font color='red' size='30'>${LOGINNAME}</font>    
  7.    </body>    
  8. </html>  </span>  

 具體郵件發送類EmailService.java

  

Java代碼   收藏代碼
  1. <span style="font-size: medium;">package com.javacrazyer.comon;  
  2.   
  3. import java.io.File;  
  4. import java.io.UnsupportedEncodingException;  
  5. import java.util.HashMap;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8.   
  9. import javax.mail.Message;  
  10. import javax.mail.MessagingException;  
  11. import javax.mail.internet.InternetAddress;  
  12. import javax.mail.internet.MimeMessage;  
  13. import javax.mail.internet.MimeUtility;  
  14.   
  15. import org.springframework.mail.MailSender;  
  16. import org.springframework.mail.javamail.JavaMailSender;  
  17. import org.springframework.mail.javamail.MimeMessageHelper;  
  18. import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;  
  19. import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;  
  20.   
  21. import freemarker.template.Template;  
  22.   
  23. public class EmailService implements MailService {  
  24.   
  25.     private JavaMailSender mailSender;  
  26.     private FreeMarkerConfigurer freeMarkerConfigurer = null// FreeMarker的技術類  
  27.   
  28.     public void setMailSender(JavaMailSender mailSender) {  
  29.         this.mailSender = mailSender;  
  30.     }  
  31.   
  32.   
  33.   
  34.     public void setFreeMarkerConfigurer(  
  35.             FreeMarkerConfigurer freeMarkerConfigurer) {  
  36.         this.freeMarkerConfigurer = freeMarkerConfigurer;  
  37.     }  
  38.     /** 
  39.      * 發送帶模板的單個html格式郵件 
  40.      */  
  41.     public void sendOrderMail(Order order) {  
  42.         MimeMessage msg = mailSender.createMimeMessage();  
  43.         // 設置utf-8或GBK編碼,不然郵件會有亂碼,true表示爲multipart郵件  
  44.   
  45.         try {  
  46.             MimeMessageHelper helper = new MimeMessageHelper(msg, true"utf-8");  
  47.             helper.setTo(order.getUseremail()); // 郵件接收地址  
  48.             helper.setFrom("emailusername@163.com"); // 郵件發送地址,這裏必須和xml裏的郵件地址相同一致  
  49.             helper.setSubject("你好,恭喜你註冊成功"); // 主題  
  50.             String htmlText;  
  51.             htmlText = getMailText(order.getUsername());  
  52.             helper.setText(htmlText, true); // 郵件內容,注意加參數true,表示啓用html格式  
  53.         } catch (Exception e) {  
  54.             // TODO Auto-generated catch block  
  55.             e.printStackTrace();  
  56.         } // 使用模板生成html郵件內容  
  57.   
  58.         mailSender.send(msg); // 發送郵件  
  59.     }  
  60.   
  61.     /** 
  62.      * 批量發送帶附件的html格式郵件,帶附件 
  63.      */  
  64.     public void sendBatchEmail(Order order, List<String> address) {  
  65.           
  66.         MimeMessage msg = mailSender.createMimeMessage();  
  67.   
  68.         try {  
  69.             MimeMessageHelper helper = new MimeMessageHelper(msg, true"utf-8");  
  70.             String toList = getMailList(address);  
  71.             InternetAddress[] iaToList = new InternetAddress().parse(toList);  
  72.             msg.setRecipients(Message.RecipientType.TO, iaToList);  
  73.             helper.setFrom("emailusername@163.com");  
  74.             helper.setSubject("你好,恭喜你註冊成功");  
  75.             String htmlText = getMailText(order.getUsername());  
  76.             helper.setText(htmlText, true);  
  77.             // 添加內嵌文件,第1個參數爲cid標識這個文件,第2個參數爲資源  
  78.             helper.addInline("a"new File("E:/11.jpg")); // 附件內容  
  79.             helper.addInline("b"new File("E:/12.jpg"));  
  80.             File file = new File("E:/各類框架圖介紹.docx");  
  81.             // 這裏的方法調用和插入圖片是不一樣的,使用MimeUtility.encodeWord()來解決附件名稱的中文問題  
  82.             helper.addAttachment(MimeUtility.encodeWord(file.getName()), file);  
  83.         } catch (MessagingException e) {  
  84.             // TODO Auto-generated catch block  
  85.             e.printStackTrace();  
  86.         } catch (UnsupportedEncodingException e) {  
  87.             // TODO Auto-generated catch block  
  88.             e.printStackTrace();  
  89.         } catch (Exception e) {  
  90.             // TODO Auto-generated catch block  
  91.             e.printStackTrace();  
  92.         }  
  93.   
  94.         // 若是主題出現亂碼,可使用該函數,也可使用下面的函數  
  95.         // helper.setSubject(MimeUtility.encodeText(String text,String  
  96.         // charset,String encoding))  
  97.         // 第2個參數表示字符集,第三個爲目標編碼格式。  
  98.         // MimeUtility.encodeWord(String word,String charset,String encoding)  
  99.         mailSender.send(msg);  
  100.     }  
  101.   
  102.     /** 
  103.      * 集合轉換字符串 
  104.      */  
  105.     public String getMailList(List<String> to) {  
  106.         StringBuffer toList = new StringBuffer();  
  107.         int length = to.size();  
  108.         if (to != null && length < 2) {  
  109.             toList.append(to.get(0));  
  110.         } else {  
  111.             for (int i = 0; i < length; i++) {  
  112.                 toList.append(to.get(i));  
  113.                 if (i != (length - 1)) {  
  114.                     toList.append(",");  
  115.                 }  
  116.             }  
  117.         }  
  118.         return toList.toString();  
  119.     }  
  120.   
  121.     // 經過模板構造郵件內容,參數content將替換模板文件中的${content}標籤。  
  122.     private String getMailText(String content) throws Exception {  
  123.         String htmlText = "";  
  124.         // 經過指定模板名獲取FreeMarker模板實例  
  125.         Template tpl = freeMarkerConfigurer.getConfiguration().getTemplate(  
  126.                 "registe.ftl");  
  127.         Map map = new HashMap(); // FreeMarker經過Map傳遞動態數據  
  128.         map.put("LOGINNAME", content); // 注意動態數據的key和模板標籤中指定的屬性相匹配  
  129.         // 解析模板並替換動態數據,最終content將替換模板文件中的${content}標籤。  
  130.         htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(tpl, map);  
  131.         return htmlText;  
  132.     }  
  133.   
  134. }</span>  

  單一發送HTML格式的郵件測試

  

 

 

Java代碼   收藏代碼
  1. <span style="font-size: medium;">package com.javacrazyer.service.test;  
  2.   
  3. import org.junit.Test;  
  4. import org.springframework.context.ApplicationContext;  
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  6.   
  7. import com.javacrazyer.comon.MailService;  
  8. import com.javacrazyer.comon.Order;  
  9.   
  10. public class UserServiceTest {  
  11.   
  12.     @Test  
  13.     public void test() throws InterruptedException {  
  14.         ApplicationContext context = new ClassPathXmlApplicationContext(  
  15.                 "applicationContext-html.xml");  
  16.         MailService sf = (MailService) context.getBean("emailService");  
  17.         Order order = new Order();  
  18.         order.setUsername("cheneywu");  
  19.         order.setUseremail("xxxxxx@qq.com");  
  20.         sf.sendOrderMail(order);  
  21.     }  
  22. }  
  23. </span>  

 收到郵件了


羣發,帶附件的測試

Java代碼   收藏代碼
  1. <span style="font-size: medium;">package com.javacrazyer.service.test;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import org.junit.Test;  
  7. import org.springframework.context.ApplicationContext;  
  8. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  9.   
  10. import com.javacrazyer.comon.EmailService;  
  11. import com.javacrazyer.comon.Order;  
  12.   
  13. public class UserServiceTest {  
  14.   
  15.     @Test  
  16.     public void test() throws InterruptedException {  
  17.         ApplicationContext context = new ClassPathXmlApplicationContext(  
  18.                 "applicationContext-html.xml");  
  19.         EmailService sf = (EmailService) context.getBean("emailService");  
  20.         Order order = new Order();  
  21.         order.setUsername("cheneywu");  
  22.         List<String> maillist = new ArrayList<String>();  
  23.         maillist.add("XXXXXX@qq.com");  
  24.         maillist.add("YYYYYY@qq.com");  
  25.         sf.sendBatchEmail(order, maillist);  
  26.     }  
  27. }  
  28. </span>  

 收到郵件了哦


 看到了沒有,這個上邊有兩個接收人,下邊的是附件

相關文章
相關標籤/搜索