Before the JSSE framework can recognize any JSSE providers, you must register them permanently in the <java home>\jre\lib\security\java.security properties file or register them dynamically by calling the Security.addProvider() method in your code:
Security.addProvider( new com.sun.net.ssl.internal.ssl.Provider());
Then you need to replace JavaMail's default socket factory with JSSE's SSL socket factory. This approach is similar to the one used in "Java Tip 96: Use HTTPS in Your Java Client Code"; however, in our case, we have no control over socket creation since sockets are created inside the JavaMail framework, not in the application code or storage provider. Fortunately, JavaMail accepts several undocumented properties, allowing you to set up a custom socket factory class and some other parameters. Those properties are:
mail.<protocol>.socketFactory.class mail.<protocol>.socketFactory.fallback mail.<protocol>.socketFactory.port mail.<protocol>.timeout
Now you can use the following code to replace a 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);
If you want JavaMail to use only secure connections, you configure the appropriate properties so JavaMail doesn't fall back to an unsecure connection when a secure one fails:
// 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");
You then change the default port number to the corresponding port that your protocol's secure version uses; otherwise, you
must use a fully qualified address (that includes a port number) in the URL passed to JavaMail (for example, imap://id:password@your.imap.server.com:993/folder/), or else you get an "unrecognized SSL handshake" exception. You specify these properties like so:
// 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");
After setting up all the properties, you can open a secure JavaMail session:
thanksBy Anonymous on August 11, 2010, 8:53 pmthanks
Reply | Read entire comment
pandoraBy pengpeng on July 16, 2010, 3:39 ampandora pandora tiffanys moncler jackets
Reply | Read entire comment
gBy Anonymous on June 8, 2010, 7:03 pmg
Reply | Read entire comment
useless codeBy Anonymous on April 26, 2010, 6:54 amkek
Reply | Read entire comment
addprovider is not workingBy Anonymous on April 14, 2010, 2:42 ama
Reply | Read entire comment
View all comments