I’m using JavaMail and I want it to work through proxy for every threads (I have multithreading application). I’m using SMTPTransport.connect(Socket socket) for this.
Here is socket initialization:
socket = new Socket();
socket.setSoTimeout(10000);
socket.connect(new InetSocketAddress(smtpHost, smtpPort));
Here is SMTPTransport call:
SMTPTransport transport = null;
try
{
transport = (SMTPTransport) mail.getTransport("smtp");
transport.connect(socket);
System.out.println("ok");
And so on. But I this error happens:
DEBUG: JavaMail version 1.4.4 DEBUG: successfully loaded resource:
/META-INF/javamail.default.providers DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name:
{com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun
Microsystems, Inc],
com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun
Microsystems, Inc],
com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun
Microsystems, Inc],
com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun
Microsystems, Inc],
com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun
Microsystems, Inc],
com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun
Microsystems, Inc]} DEBUG: Providers Listed By Protocol:
{imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun
Microsystems, Inc],
imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun
Microsystems, Inc],
smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun
Microsystems, Inc],
pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun
Microsystems, Inc],
pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun
Microsystems, Inc],
smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun
Microsystems, Inc]} DEBUG: successfully loaded resource:
/META-INF/javamail.default.address.map DEBUG: getProvider() returning
javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun
Microsystems, Inc] DEBUG SMTP: useEhlo true, useAuth true DEBUG SMTP:
useEhlo true, useAuth true DEBUG SMTP: starting protocol to host
“smtp.googlemail.com”, port 465 DEBUG SMTP: exception reading
response: java.net.SocketTimeoutException: Read timed out Exception
reading response javax.mail.MessagingException: Exception reading
response; nested exception is: java.net.SocketTimeoutException:
Read timed out at
com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:2153)
at
com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1956)
at
com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:636)
at javax.mail.Service.connect(Service.java:317) at
javax.mail.Service.connect(Service.java:176) at
javax.mail.Service.connect(Service.java:125) at
com.sun.mail.smtp.SMTPTransport.connect(SMTPTransport.java:274) at
lsmtpc.CheckAccount.run(CheckAccount.java:203) at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166) at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722) Caused by:
java.net.SocketTimeoutException: Read timed out at
java.net.SocketInputStream.socketRead0(Native Method) at
java.net.SocketInputStream.read(SocketInputStream.java:150) at
java.net.SocketInputStream.read(SocketInputStream.java:121) at
com.sun.mail.util.TraceInputStream.read(TraceInputStream.java:110) at
java.io.BufferedInputStream.fill(BufferedInputStream.java:235) at
java.io.BufferedInputStream.read(BufferedInputStream.java:254) at
com.sun.mail.util.LineInputStream.readLine(LineInputStream.java:89)
at
com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:2131)
… 13 more
So as I see JavaMail can’t read from socket. So what am I doing wrong? If I try to use transport.connect() method without using Socket in constructor all works perfectly and smtpHost/smtpPort are accessible from the telnet and I have no any firewalls/antiviruses.
From the documentation for com.sun.mail.smtp.SMTPTransport:
JavaMail tutorial: http://java.sun.com/developer/onlineTraining/JavaMail/contents.html
Could be you are not passing authentication information. Could be you are connecting to a secured host using a plain socket. You might want to read the tutorial linked for the best way to use JavaMail.