Mongoose House

          Technical Edition

          統(tǒng)計(jì)

          留言簿(4)

          積分與排名

          閱讀排行榜

          基于SSL的JavaMail

          最近有一個(gè)項(xiàng)目需要支持SSL的JavaMail收發(fā)郵件. 經(jīng)過(guò)一些調(diào)查, 把使用SSL的JavaMail方法總結(jié)如下.

          JavaMail提供商自身缺乏對(duì)SSL連接的支持, 所以必須使用JSSE API來(lái)支持SSL連接. 下面就是如何使用JSSE API來(lái)連接POP3/IMAP/NNTP等mail存儲(chǔ)提供商.

          以下的代碼需要運(yùn)行在J2SE1.4.x或者以上版本.

          首先, 需要把JSSE的安全provider注冊(cè)到當(dāng)前虛擬機(jī)的環(huán)境下, 有兩種方法:

          一、修改Java本地安全文件
          <JAVA_HOME>\jre\lib\security\java.security

          二、動(dòng)態(tài)的添加security provider

          Security.addProvider(? new ?com.sun.net.ssl.internal.ssl.Provider());


          然后, 需要使用JSSE的SSL socket factory來(lái)取代默認(rèn)的socket factory. 取代的辦法就是通過(guò)設(shè)置JavaMail的一些缺省屬性來(lái)達(dá)到這一點(diǎn).

          ??mail.<protocol>.socketFactory.class
          ??mail.<protocol>.socketFactory.fallback
          ??mail.<protocol>.socketFactory.port
          ??mail.<protocol>.timeout

          下面的代碼就是替換不同協(xié)議的socket factory.

          final ?String?SSL_FACTORY? = ? " javax.net.ssl.SSLSocketFactory " ;

          Properties?props?
          = ?System.getProperties();

          // ?IMAP?provider
          props.setProperty(? " mail.imap.socketFactory.class " ,?SSL_FACTORY);

          // ?POP3?provider
          props.setProperty(? " mail.pop3.socketFactory.class " ,?SSL_FACTORY);

          // ?NNTP?provider?(if?any)
          // ?props.setProperty(?"mail.nntp.socketFactory.class",?SSL_FACTORY);

          如果我們希望JavaMail只處理SSL的連接, 對(duì)于非SSL的連接不做處理, 那么我們最好設(shè)置fallback為false.

          // ?IMAP?provider
          props.setProperty(? " mail.imap.socketFactory.fallback " ,? " false " );

          // ?POP3?provider
          props.setProperty(? " mail.pop3.socketFactory.fallback " ,? " false " );

          // ?NNTP?provider?(if?any)
          // ?props.setProperty(?"mail.nntp.socketFactory.fallback",?"false");

          接下來(lái), 我們需要做的就是使用SSL協(xié)議對(duì)應(yīng)的端口改變默認(rèn)端口. 這個(gè)端口根據(jù)郵件服務(wù)器的設(shè)置不同不同, 下面的代碼中寫(xiě)得是一般地SSL默認(rèn)端口.

          // ?IMAP?provider
          props.setProperty(? " mail.imap.port " ,? " 993 " );
          props.setProperty(?
          " mail.imap.socketFactory.port " ,? " 993 " );

          // ?POP3?provider
          props.setProperty(? " mail.pop3.port " ,? " 995 " );
          props.setProperty(?
          " mail.pop3.socketFactory.port " ,? " 995 " );

          // ?NNTP?provider?(if?any)
          // ?props.setProperty(?"mail.pop3.port",?"563");
          // ?props.setProperty(?"mail.pop3.socketFactory.port",?"563");

          在設(shè)置完所有屬性之后, 我們就可以使用這些屬性來(lái)創(chuàng)建session了. 之后的步驟和一般的JavaMail處理完全相同.

          Session?session? = ?Session.getInstance(props);



          ?關(guān)于這個(gè)topic的reference還可以參考

          Java Tip 115: Secure JavaMail with JSSE

          利用JavaMail收/發(fā)Gmail郵件(SSL)

          JavaMail: Send mail via SMTP and SSL





          posted on 2006-08-30 02:54 Mongoose 閱讀(2710) 評(píng)論(1)  編輯  收藏

          評(píng)論

          # re: 基于SSL的JavaMail 2006-09-12 17:28 Mongoose

          有一點(diǎn)注意, 對(duì)于《Java Tip 115: Secure JavaMail with JSSE》(http://www.javaworld.com/javatips/jw-javatip115_p.html)中提到的使用DummyTrustManager來(lái)繞過(guò)證書(shū)的方法, 對(duì)于JSSE 1.4有一處不兼容. 即需要在SocketFactory中加入如下代碼.
          ---
          public Socket createSocket() throws IOException {
          return factory.createSocket();
          }
          ---
          參考 http://forum.java.sun.com/thread.jspa?threadID=701799&tstart=195  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 青州市| 昌图县| 蒲江县| 临颍县| 江口县| 普定县| 潞西市| 石门县| 揭西县| 八宿县| 宁化县| 龙岩市| 哈尔滨市| 乐都县| 申扎县| 丹江口市| 耒阳市| 东光县| 吴川市| 曲沃县| 长宁县| 庄河市| 崇仁县| 丰原市| 福清市| 岳普湖县| 大冶市| 普兰县| 板桥市| 洪江市| 内黄县| 西林县| 公安县| 南澳县| 安福县| 辽阳市| 澜沧| 万宁市| 山东省| 前郭尔| 楚雄市|