隨筆-126  評論-247  文章-5  trackbacks-0

          前言:談過如何用 Spring 發送普通 Email 和帶有附件的 Email 之后,接著來談一下如何用 Spring 來發送 Html 式的 Email。
          發送 Html 格式的 Email 也是很必要的,現在的很多網站在用戶注冊之后都會發一封 Email 到用戶的郵箱,用戶需要點擊
          郵件中的鏈接來完成注冊,這個鏈接如果是用普通文本式的 Email 來發送的話,這個鏈接是不能被點擊的,因為它是文本內容,
          所以有必要要學一下 怎么樣發送 Html 式的 Email。但這個初次嘗試起來有點糾結,先來看問題,然后再貼代碼:
          在測試的時候,遇到兩個問題,問題一: 中文亂碼 ,問題二:資源無法顯示;下面是收到的郵件截圖:




          問題一可以在 Spring 的 API 中找到答案,就是要花點時間來調試

          說到問題二,這個有點讓人頭疼,因為官方文檔是這么說的(Spring 2.5.6):


          我測試的時候也是按著官方文檔的示例來實驗的,但事實證明,這是不行的,收到的郵件,這個圖片資源總是顯示不出來,
          右鍵查看一下沒有顯示出來的資源屬性:


          這個問題在官方文檔上沒有做出相關的解釋,于是自己試著去實驗,原來是 jar 包版本的問題,當然,這不可能是一下子就
          能想得到是 jar 包出的問題,也沒有一個人會輕易的去懷疑官方的東西吧,不過這個算是 Spring 2.5.6 的 Bug 吧。
          我把 Spring 2.5.6 的 spring-context-support 的 jar 包換成 Spring 3.1.0 的 spring-context-support jar 包之后來實驗,OK,問題解決。
          順便說一下 Spring 的 spring-context-support 這個 jar 包,就像你看到的,support,就是 Spring 支持的一些擴展服務(如果沒有解釋錯誤的話-_-|)
          這個 jar 包封裝了一些 Email 和 Scheduling(Spring 定時服務,計劃任務),還有 Freemarker、Velocity,下次會說一下 Spring 定時服務。
          好了,就到這吧,接下來貼代碼:

          環境:
          Spring     2.5.6
          Spring-context-support 3.1.0
          Javamail  1.4.4
          Maven     3.0.4
          Myeclipse 8.6.1

          項目結構:


          spring-smtp-mail-inline.xml
          <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation
          ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
            
              
          <bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
                 
          <!-- 服務器 -->
                  
          <property name="host" value="smtp.yeah.net" />
                  
          <!-- 端口號 -->
                  
          <property name="port" value="25" />
                  
          <!-- 用戶名 -->
                  
          <property name="username" value=fancydeepin@yeah.net />
                  
          <!--  密碼   -->
                  
          <property name="password" value="***********"/>
                  
          <!-- SMTP服務器驗證 -->
                  
          <property name="javaMailProperties">
                      
          <props>
                         
          <!-- 驗證身份 -->
                        
          <prop key="mail.smtp.auth">true</prop>
                    
          </props>
                  
          </property>
              
          </bean>
              
          <!-- 
                 目前我用過的EMAIL賬號都是網易的,下面列出網易的SMTP服務器名和端口號:
                 網易郵箱         SMTP服務器     SMTP端口    POP3服務器     POP3端口
                 @126.com    smtp.126.com      25         pop3.126.com     110
                 @163.com    smtp.163.com      25         pop3.163.com     110
                 @yeah.net   smtp.yeah.net      25         pop3.yeah.net    110
              
          -->
              
              
          <bean id="simpleMailMessage" class="org.springframework.mail.SimpleMailMessage">
                
          <!-- 發件人email -->
                  
          <property name="from" value="fancydeepin@yeah.net" />
                  
          <!-- 
                   收件人email
                  <property name="to" value="to@yeah.net" />
                  email主題(標題)
                  <property name="subject" value="Subject" />
                  email主題內容
                  <property name="text">
                    <value>ContentText</value>
                  </property>
                  
          -->
              
          </bean>
              
              
          <bean id="simpleMail" class="com.fancy.util.Email">
                  
          <property name="javaMailSender" ref="javaMailSender" />
                  
          <property name="simpleMailMessage" ref="simpleMailMessage" />
              
          </bean>
              
          </beans>

          Email.java
          package com.fancy.util;

          import javax.mail.internet.MimeMessage;
          import org.springframework.core.io.ClassPathResource;
          import org.springframework.mail.SimpleMailMessage;
          import org.springframework.mail.javamail.JavaMailSender;
          import org.springframework.mail.javamail.MimeMessageHelper;
          /**
           * -----------------------------------------
           * @文件: Email.java
           * @作者: fancy
           * @郵箱: fancydeepin@yeah.net
           * @時間: 2012-6-12
           * @描述: 發送Email工具類
           * -----------------------------------------
           
          */

          public class Email {
              
              
          private JavaMailSender javaMailSender;
              
          private SimpleMailMessage simpleMailMessage;
              
            
          /**
               * @方法名: sendMail 
               * @參數名:
          @param subject  郵件主題
               * @參數名:
          @param content 郵件主題內容
               * @參數名:
          @param to         收件人Email地址
               * @描述語: 發送郵件
               
          */

              
          public void sendMail(String subject, String content, String to) {
                  
                  
          try {
                      MimeMessage mimeMessage 
          = javaMailSender.createMimeMessage();
                    
          /**
                       * new MimeMessageHelper(mimeMessage,true)之true個人見解:
                       * 關于true參數,官方文檔是這樣解釋的:
                       * use the true flag to indicate you need a multipart message
                       * 翻譯過來就是:使用true,以表明你需要多個消息
                       * 再去翻一下MimeMessageHelper的API,找到這樣一句話:
                       * supporting alternative texts, inline elements and attachments
                       * 也就是說,如果要支持內聯元素(HTML)和附件就必須給定第二個參數為true
                       * 否則拋出 java.lang.IllegalStateException 異常
                       
          */

                    
          /**
                       * 剛開始收到郵件顯示中文亂碼,于是趕緊查看官方文檔,沒有提到,再查閱API,也沒有查到Set編碼的方法,
                       * 于是就在HTML里面自己指定編碼,也不起作用,郵件還是顯示中文亂碼;
                       * 最后的結論是:如果HTML內容含有中文必須指定HTML的編碼,默認是ISO-8859-1,所以會顯示中文亂碼
                       * 在MimeMessageHelper的構造方法中找到:
                       * MimeMessageHelper(MimeMessage mimeMessage, boolean multipart, String encoding)
                       * 實驗一下,OK,原來編碼是在這兒設置,沒事了,中文正常顯示
                       
          */

                      MimeMessageHelper messageHelper 
          = new MimeMessageHelper(mimeMessage,true,"UTF-8");
                      messageHelper.setFrom(simpleMailMessage.getFrom()); 
          //設置發件人Email
                      messageHelper.setSubject(subject); //設置郵件主題
                      messageHelper.setText(content);   //設置郵件主題內容
                      messageHelper.setTo(to);          //設定收件人Email
                      
          //步驟 1
                      //資源的引用方法:cid:你自己設置的資源ID

                      messageHelper.setText( 
                      
          "<html>" + 
                        
          "<body>" +
                          
          "<BR>" +
                          
          "<div align='center'>" +
                            
          "<img src='cid:imageid'/>" +
                            
          "<BR>" +
                            
          "<h4>" +
                              
          "返回 fancydeepin 的Blogjava:" +
                              
          "<a href='http://www.aygfsteel.com/fancydeepin/'>http://www.aygfsteel.com/fancydeepin/</a>" +
                            
          "</h4>" +
                          
          "</div>" +
                        
          "</body>" +
                      
          "</html>"true);
                    
          /**
                       * ClassPathResource:很明顯就是類路徑資源,我這里的附件是在項目里的,所以需要用ClassPathResource
                       * 如果是系統文件資源就不能用ClassPathResource,而要用FileSystemResource,例:
                       * FileSystemResource file = new FileSystemResource(new File("D:/woniu.png"));
                       
          */

                    
          /**
                       * 如果想在HTML中使用資源,必須在HTML中通過資源 ID 先引用資源,然后才來加載資源
                       
          */

                      
          //步驟 2
                      ClassPathResource image = new ClassPathResource("images/body.png");
                      messageHelper.addInline(
          "imageid", image);
                      javaMailSender.send(mimeMessage);    
          //發送HTML郵件
                      
                  }
           catch (Exception e) {System.out.println("異常信息:" + e);}
              }

              
          //Spring 依賴注入
              public void setSimpleMailMessage(SimpleMailMessage simpleMailMessage) {
                  
          this.simpleMailMessage = simpleMailMessage;
              }

              
          //Spring 依賴注入
              public void setJavaMailSender(JavaMailSender javaMailSender) {
                  
          this.javaMailSender = javaMailSender;
              }

          }


          接下來的是測試類,這里的測試類我又用了兩個,一個是 Main 方法測試,另外一個 Junit 測試,個人不太喜歡 Junit 的測試,下面貼 Main 方法的測試
          Test.java
          package test;

          import org.springframework.context.ApplicationContext;
          import org.springframework.context.support.ClassPathXmlApplicationContext;
          import com.fancy.util.Email;
          /**
           * -----------------------------------------
           * @文件: Test.java
           * @作者: fancy
           * @郵箱: fancydeepin@yeah.net
           * @時間: 2012-6-12
           * @描述: 測試HTML郵箱發送類
           * -----------------------------------------
           
          */

          public class Test {

              
          public static void main(String[] args) {
                  ApplicationContext context 
          = new ClassPathXmlApplicationContext("spring-smtp-mail-inline.xml");
                  Email mail 
          = (Email)context.getBean("simpleMail");
                  mail.sendMail(
          "Spring SMTP Mail HTML Subject""Spring SMTP HTML Text Content""fancyzero@yeah.net");
                  
          //mail.sendMail("標題", "內容", "收件人郵箱");
              }

          }


          pom.xml
          <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation
          ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
            
          <modelVersion>4.0.0</modelVersion>
            
          <groupId>com.fancy</groupId>
            
          <artifactId>spring-mail-inline-example</artifactId>
            
          <version>1.0</version>
            
          <packaging>jar</packaging>
            
          <name>spring-mail-inline-example</name>
            
          <url>http://maven.apache.org</url>
            
          <properties>
              
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            
          </properties>

            
          <dependencies>
              
          <!-- Spring framework -->
              
          <dependency>
                
          <groupId>org.springframework</groupId>
                
          <artifactId>spring</artifactId>
                
          <version>2.5.6</version>
              
          </dependency>
              
          <!-- Spring Support -->
              
          <dependency>
                
          <groupId>org.springframework</groupId>
                
          <artifactId>spring-context-support</artifactId>
                
          <version>3.1.0.RELEASE</version>
              
          </dependency>
              
          <!-- Javamail API -->
              
          <dependency>
                
          <groupId>javax.mail</groupId>
                
          <artifactId>mail</artifactId>
                
          <version>1.4.4</version>
              
          </dependency>
              
          <!-- Junit -->
              
          <dependency>
                
          <groupId>junit</groupId>
                
          <artifactId>junit</artifactId>
                
          <version>3.8.1</version>
                
          <scope>test</scope>
              
          </dependency>
            
          </dependencies>
            
          </project>

          Run Test.java,收到并打開郵件:


          OK,沒問題了這回。最后提一下在 Email.java 中為什么步驟1和步驟2不能倒過來的原因,其實你看到這里也可以自己試一下,你會
          發現倒過來真的不行的,原因嘛,這個官方文檔有提到一點,這個我就不貼了,我貼一下 API 中對這個的解釋,在 API 中還給出了
          如何通過資源 ID 來引用資源的,英文的,自己看哦:





            
          posted on 2012-06-12 13:05 fancydeepin 閱讀(4238) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 陵川县| 阿拉善右旗| 山西省| 沧源| 信丰县| 武邑县| 阜阳市| 庆城县| 保德县| 吉水县| 新蔡县| 钟祥市| 宜君县| 桑日县| 云南省| 蓬安县| 常德市| 南阳市| 洪泽县| 双城市| 涞源县| 平利县| 新蔡县| 丰宁| 禹州市| 图木舒克市| 和硕县| 张家港市| 巨鹿县| 兖州市| 永清县| 宁明县| 怀来县| 德安县| 清远市| 岚皋县| 班戈县| 嵩明县| 延长县| 花莲县| 安西县|