Mongoose House

Technical Edition

统计

留言簿(4)

积分与排名

阅读排行榜

基于SSL的JavaMail

最近有一个项目需要支持SSL的JavaMail收发邮件. 经过一些调查, 把使用SSL的JavaMail方法总结如下.

JavaMail提供商自身缺乏对SSL连接的支持, 所以必须使用JSSE API来支持SSL连接. 下面就是如何使用JSSE API来连接POP3/IMAP/NNTP等mail存储提供商.

以下的代码需要运行在J2SE1.4.x或者以上版本.

首先, 需要把JSSE的安全provider注册到当前虚拟机的环境下, 有两种方法:

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

二、动态的添加security provider

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


然后, 需要使用JSSE的SSL socket factory来取代默认的socket factory. 取代的办法就是通过设置JavaMail的一些缺省属性来达到这一点.

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

下面的代码就是替换不同协议的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的连接不做处理, 那么我们最好设置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协议对应的端口改变默认端口. 这个端口根据邮件服务器的设置不同不同, 下面的代码中写得是一般地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");

在设置完所有属性之后, 我们就可以使用这些属性来创建session了. 之后的步骤和一般的JavaMail处理完全相同.

Session session  =  Session.getInstance(props);



 关于这个topic的reference还可以参考

Java Tip 115: Secure JavaMail with JSSE

利用JavaMail收/发Gmail邮件(SSL)

JavaMail: Send mail via SMTP and SSL





posted on 2006-08-30 02:54 Mongoose 阅读(2700) 评论(1)  编辑  收藏

评论

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

有一点注意, 对于《Java Tip 115: Secure JavaMail with JSSE》(http://www.javaworld.com/javatips/jw-javatip115_p.html)中提到的使用DummyTrustManager来绕过证书的方法, 对于JSSE 1.4有一处不兼容. 即需要在SocketFactory中加入如下代码.
---
public Socket createSocket() throws IOException {
return factory.createSocket();
}
---
参考 http://forum.java.sun.com/thread.jspa?threadID=701799&tstart=195  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: