最近有一個項目需要支持SSL的JavaMail收發(fā)郵件. 經(jīng)過一些調(diào)查, 把使用SSL的JavaMail方法總結(jié)如下.
JavaMail提供商自身缺乏對SSL連接的支持, 所以必須使用JSSE API來支持SSL連接. 下面就是如何使用JSSE API來連接POP3/IMAP/NNTP等mail存儲提供商.
以下的代碼需要運行在J2SE1.4.x或者以上版本.
首先, 需要把JSSE的安全provider注冊到當前虛擬機的環(huán)境下, 有兩種方法:
一、修改Java本地安全文件
<JAVA_HOME>\jre\lib\security\java.security
二、動態(tài)的添加security provider
Security.addProvider(?
new
?com.sun.net.ssl.internal.ssl.Provider());
然后, 需要使用JSSE的SSL socket factory來取代默認的socket factory. 取代的辦法就是通過設(shè)置JavaMail的一些缺省屬性來達到這一點.
??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的連接, 對于非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");
接下來, 我們需要做的就是使用SSL協(xié)議對應(yīng)的端口改變默認端口. 這個端口根據(jù)郵件服務(wù)器的設(shè)置不同不同, 下面的代碼中寫得是一般地SSL默認端口.
//
?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è)置完所有屬性之后, 我們就可以使用這些屬性來創(chuàng)建session了. 之后的步驟和一般的JavaMail處理完全相同.
Session?session?
=
?Session.getInstance(props);
?關(guān)于這個topic的reference還可以參考
Java Tip 115: Secure JavaMail with JSSE利用JavaMail收/發(fā)Gmail郵件(SSL)
JavaMail: Send mail via SMTP and SSL