Hi Sameer

Thanks for the pointer. As it happened, I managed to get StartTLS to work
inside Tomcat, although I am still not sure why there is a difference in
behaviour when the below application is run standalone vs inside Tomcat. In
advance, please forgive the extended explanation but I am acutely aware that
this may information may help someone else in the event they come across the
same problem.

What I discovered was (what seems like) a limitation in the Java mail API:

o I was attempting to use a DummySSLFactory to skip certificate
authentication
o Java mail only allows you to specify one socketFactoryClass i.e.
mail.imap.socketFactory.class
o When you are using StartTLS, Java mail should be using two socketFactory
classes (one for the first plaintext connection and then another for the
subsequent secure connection)
o Javamail does not provide a way to set two different socket factory
classes
o  setting the default ssl socket factory using the SSL libraries directly
had no effect inside Tomcat

In the end, I ended up editing the Java mail source code and changing
com.sun.mail.util.SocketFetcher 

the Java mail source code to accept: mail.imap.startTLS.socketFactory.class. 
 
public static Socket startTLS(Socket socket, Properties props,
                                String prefix) throws IOException {
    ....
    props.getProperty(prefix + ".startTLS.socketFactory.class", null);
    ....
}

That way, I could now specify:

mail.imap.socketFactory.class and mail.imap.startTLS.socketFactory.class so
that different Socket factories would be called depending on whether a
plaintext or encrypted connection is being negotiated as part of the
StartTLS protocol extension.

At this point, I am wondering whether I am missing something about the use
of the StartTLS functionality or this is a genuine issue in the java mail
API.

Thanks for the time taken to investigate this problem. I really appreciate
it!

Regards,

Jamie





Sameer Acharya wrote:
> 
> Can you give the line number as to where the error is
> happening.
> I found this link on google search you can read thru
> the same it describes similar problems.
> We have not had problems using java mail under tomcat
> but we dont use imap.
> http://forum.java.sun.com/thread.jspa?threadID=761635&messageID=4347363
> 
> -Sameer
> 
> --- jamieb <[EMAIL PROTECTED]> wrote:
> 
>> 
>> 
>> Hi there
>> 
>> I have encountered a bizzare problem... I have a
>> small peice of code that
>> fetches emails from an IMAP server using TLS. This
>> code works perfectly in a
>> standalone application, however, when I copy and
>> paste it over to a Tomcat
>> application it does not work.  The code uses Java
>> Mail 1.4.1 and Java Secure
>> Sockets. 
>> 
>> The following error is outputted when the code is
>> run from within Tomcat:
>> 
>> javax.mail.MessagingException: Unrecognized SSL
>> message, plaintext
>> connection?;
>>   nested exception is:
>>      javax.net.ssl.SSLException: Unrecognized SSL
>> message, plaintext connection?
>> 
>> NOTE: in case you are wondering: YES in both cases
>> the server is connecting
>> to the same port. 
>> 
>> Now I have checked:
>> - the same java mail version is used across
>> applications
>> - the same JRE (v1.6)
>> - all input parameters are the same
>> 
>> Any ideas on what might be causing this problem in
>> the Tomcat environment? 
>> 
>> package com.test.support;
>> 
>> import java.io.*;
>> import java.security.Security;
>> import java.util.Properties;
>> import javax.mail.*;
>> import javax.mail.internet.*;
>> import java.net.*;
>> 
>> public class TestMailboxConnection {
>> 
>>      /**
>>       * @param args
>>       */
>>      
>>      private static final String DUMMY_SSL_FACTORY =
>> "com.test.support.DummySSLSocketFactory";
>>      
>>      public static void main(String[] args) {
>> 
>>        
>>                 if (args.length<3) {
>>                  System.out.println("\n\nUtility to
>> Detect Mail Server
>> Connection Settings");
>>                  System.out.println("Usage:
>> TestMailboxConnection server
>> username password port secure_port ");
>>                  return;
>>              }
>>                  String server = args[0];
>>                  String username = args[1];
>>                  String password = args[2];
>>                  
>>                  String port = "143";
>>                  String secureport = "993";
>>                  
>>                  if (args.length>3) {
>>                      port   = args[3];
>>                      secureport   = args[4];
>>                  }
>>                  
>>                  
>>                  Properties props = new Properties();
>>                  // Insecure Test
>>                  testEcho(server,port);
>>                  //testEcho(server,secureport);
>>                      System.out.println("properties:"+props);
>>                  String protocol = "imap";
>>                  props.put("mail."+protocol+".port",port); 
>>              test("imap
>>
> insecure",protocol,server,Integer.valueOf(port),username,password,props);
>>         
>> props.put("mail."+protocol+".starttls.enable",
>> Boolean.TRUE);
>>         
>>
> props.put("mail."+protocol+".socketFactory.fallback","true");
>>         
>> props.put("mail."+protocol+".socketFactory.class",
>> getSSLFactory());
>>         
>>
> props.put("mail."+protocol+".socketFactory.port",secureport);
>> 
>>              test("imap tls
>>
> (fallback)",protocol,server,Integer.valueOf(port),username,password,props);
>>         
>>
> props.put("mail."+protocol+".socketFactory.fallback","false");
>>              test("imap
>>
> tls",protocol,server,Integer.valueOf(port),username,password,props);
>>              
>>              protocol = "imaps";
>>              props = new Properties();
>>         
>>
> props.put("mail."+protocol+".socketFactory.fallback","false");
>>         
>> props.put("mail."+protocol+".socketFactory.class",
>> getSSLFactory());
>>         
>>
> props.put("mail."+protocol+".socketFactory.port",secureport);
>>              test("imap
>>
> ssl",protocol,server,Integer.valueOf(port),username,password,props);
>>    
>>              
>> 
>>      }
>> 
>>      public static String getSSLFactory() {
>>              return DUMMY_SSL_FACTORY;
>>      }
>>      
>>      public static void test(String testName, String
>> protocol, String server,
>> int port, String username, String password,
>> Properties props) {
>>              java.security.Provider[] providers =
>> Security.getProviders(); 
>>              Session session = Session.getInstance(props,
>> null);
>>         session.setDebug(true);
>>         Store store = null;
>>         try {
>>              store = session.getStore(protocol);
>>         } catch (Exception nspe) {
>>              System.out.println("no such provider");
>>              return;
>>         }
>>         try {
>>         
>>
> System.out.println("\nprotocol='"+protocol+"',server='"+server+"',port='"+port+"',username='"+username+"',password='"+password+"'}");
>>              System.out.println(props+"\n");
>>              store.connect(server,Integer.valueOf(port),
>> username,password);
>>         } catch (Exception e) {
>>              System.out.println("\n>>>>>>>>>>>>>>>>>
>> failed:"+e.getMessage()+"\n");
>>              System.out.println("mailbox connection
>> properties "+props);
>>              e.printStackTrace();
>>              return;
>>         }
>>         System.out.println("\n>>>>>>>>>>>>>>>>>
>> success!"+"\n");
>>         System.out.println("mailbox connection
>> properties "+props);
>>         return;
>>      }
>>      
>>      public static void testEcho(String server,String
>> port) {
>>                      System.out.println("test echo (port "+port+"):");
>>                  BufferedReader in = null;
>>                  Socket echoSocket=null;
>>                      try {
>>                  echoSocket = new Socket(server,
>> Integer.valueOf(port));
>>                  in = new BufferedReader(new
>> InputStreamReader(
>>                                             
>> echoSocket.getInputStream()));
>>                  echoSocket.setSoTimeout(2000);
>>                  System.out.println("echo: " +
>> in.readLine());
>>                      in.close();
>>                      echoSocket.close();
>>              } catch (UnknownHostException e) {
>>                  System.err.println("unknown host
>> host:"+server);
>>                  return;
>>              } catch (IOException e) {
>>                  System.err.println("IO error occurred
>> while connecting to
>> host:"+e.getMessage());
>>                  return;
>>              }
>> 
>>              
>>      }
>> 
>> 
>> 
>> }
>> 
>> 
>> -- 
>> View this message in context:
>>
> http://www.nabble.com/Java-Mail-Inside-Tomcat-tp16008995p16008995.html
>> Sent from the Tomcat - User mailing list archive at
>> Nabble.com.
>> 
>> 
>>
> ---------------------------------------------------------------------
>> To start a new topic, e-mail:
>> users@tomcat.apache.org
>> To unsubscribe, e-mail:
>> [EMAIL PROTECTED]
>> For additional commands, e-mail:
>> [EMAIL PROTECTED]
>> 
>> 
> 
> 
> 
>      
> ____________________________________________________________________________________
> Be a better friend, newshound, and 
> know-it-all with Yahoo! Mobile.  Try it now. 
> http://mobile.yahoo.com/;_ylt=Ahu06i62sR8HDtDypao8Wcj9tAcJ 
> 
> 
> ---------------------------------------------------------------------
> To start a new topic, e-mail: users@tomcat.apache.org
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Java-Mail-Inside-Tomcat-tp16008995p16064463.html
Sent from the Tomcat - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to