<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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




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

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


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


    這個問題在官方文檔上沒有做出相關(guān)的解釋,于是自己試著去實驗,原來是 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 支持的一些擴展服務(wù)(如果沒有解釋錯誤的話-_-|)
    這個 jar 包封裝了一些 Email 和 Scheduling(Spring 定時服務(wù),計劃任務(wù)),還有 Freemarker、Velocity,下次會說一下 Spring 定時服務(wù)。
    好了,就到這吧,接下來貼代碼:

    環(huán)境:
    Spring     2.5.6
    Spring-context-support 3.1.0
    Javamail  1.4.4
    Maven     3.0.4
    Myeclipse 8.6.1

    項目結(jié)構(gòu):


    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">
           
    <!-- 服務(wù)器 -->
            
    <property name="host" value="smtp.yeah.net" />
            
    <!-- 端口號 -->
            
    <property name="port" value="25" />
            
    <!-- 用戶名 -->
            
    <property name="username" value=fancydeepin@yeah.net />
            
    <!--  密碼   -->
            
    <property name="password" value="***********"/>
            
    <!-- SMTP服務(wù)器驗證 -->
            
    <property name="javaMailProperties">
                
    <props>
                   
    <!-- 驗證身份 -->
                  
    <prop key="mail.smtp.auth">true</prop>
              
    </props>
            
    </property>
        
    </bean>
        
    <!-- 
           目前我用過的EMAIL賬號都是網(wǎng)易的,下面列出網(wǎng)易的SMTP服務(wù)器名和端口號:
           網(wǎng)易郵箱         SMTP服務(wù)器     SMTP端口    POP3服務(wù)器     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">
          
    <!-- 發(fā)件人email -->
            
    <property name="from" value="fancydeepin@yeah.net" />
            
    <!-- 
             收件人email
            <property name="to" value="to@yeah.net" />
            email主題(標題)
            <property name="subject" value="Subject" />
            email主題內(nèi)容
            <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
     * @描述: 發(fā)送Email工具類
     * -----------------------------------------
     
    */

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

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

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

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

                messageHelper.setText( 
                
    "<html>" + 
                  
    "<body>" +
                    
    "<BR>" +
                    
    "<div align='center'>" +
                      
    "<img src='cid:imageid'/>" +
                      
    "<BR>" +
                      
    "<h4>" +
                        
    "返回 fancydeepin 的Blogjava:" +
                        
    "<a href='http://www.tkk7.com/fancydeepin/'>http://www.tkk7.com/fancydeepin/</a>" +
                      
    "</h4>" +
                    
    "</div>" +
                  
    "</body>" +
                
    "</html>"true);
              
    /**
                 * ClassPathResource:很明顯就是類路徑資源,我這里的附件是在項目里的,所以需要用ClassPathResource
                 * 如果是系統(tǒng)文件資源就不能用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);    
    //發(fā)送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郵箱發(fā)送類
     * -----------------------------------------
     
    */

    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("標題", "內(nèi)容", "收件人郵箱");
        }

    }


    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不能倒過來的原因,其實你看到這里也可以自己試一下,你會
    發(fā)現(xiàn)倒過來真的不行的,原因嘛,這個官方文檔有提到一點,這個我就不貼了,我貼一下 API 中對這個的解釋,在 API 中還給出了
    如何通過資源 ID 來引用資源的,英文的,自己看哦:





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

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


    網(wǎng)站導(dǎo)航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 久久精品国产亚洲Aⅴ蜜臀色欲| 亚洲av永久中文无码精品综合 | 久久久久亚洲AV无码永不| 四虎影视在线永久免费看黄| 黄页网站免费在线观看| 美女视频黄a视频全免费网站色窝| 久久亚洲精品无码av| 亚洲日韩中文字幕| 亚洲国产精品无码久久久蜜芽| 国产成人免费片在线视频观看| 18禁免费无码无遮挡不卡网站| 黄页免费在线观看| 精品国产污污免费网站入口| 免费看黄网站在线看| 久久亚洲精品国产亚洲老地址 | xxxxx做受大片在线观看免费| 亚洲欧美日韩一区二区三区| 精品亚洲国产成人| 亚洲精品韩国美女在线| 亚洲高清在线观看| 亚洲va无码va在线va天堂| 亚洲线精品一区二区三区影音先锋| 国产91久久久久久久免费| 老司机永久免费网站在线观看| 在线观看的免费网站| 91黑丝国产线观看免费 | 亚洲国产精品无码专区| 久久精品国产亚洲Aⅴ香蕉| 亚洲午夜无码AV毛片久久| 免费一区二区三区四区五区| 国产a不卡片精品免费观看 | 一区二区三区AV高清免费波多| 国产成人亚洲综合无| 国产亚洲高清在线精品不卡| 亚洲AV第一成肉网| 女人裸身j部免费视频无遮挡| 色多多A级毛片免费看| 欧洲美女大片免费播放器视频| 一级特级aaaa毛片免费观看| 大妹子影视剧在线观看全集免费 | 丝袜熟女国偷自产中文字幕亚洲|