最近有一个项目需要支持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