基于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
然后, 需要使用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.
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.
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)端口.
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處理完全相同.
?關(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) 編輯 收藏