JavaMail:套接字读取超时

时间:2011-09-26 15:43:09

标签: java sockets timeout javamail

我正在使用JavaMail,我希望它通过代理为每个线程工作(我有多线程应用程序)。我正在使用SMTPTransport.connect(套接字套接字)。

这是套接字初始化:

socket = new Socket();
socket.setSoTimeout(10000);
socket.connect(new InetSocketAddress(smtpHost, smtpPort));

这是SMTPTransport电话:

SMTPTransport transport = null;
try
    {
     transport = (SMTPTransport) mail.getTransport("smtp");
     transport.connect(socket);
     System.out.println("ok");

等等。但是我发生了这个错误:

  

DEBUG:JavaMail版本1.4.4 DEBUG:成功加载资源:   /META-INF/javamail.default.providers DEBUG:已加载的提供程序表   调查:按类名列出的提供商:   {com.sun.mail.smtp.SMTPSSLTransport = javax.mail.Provider [TRANSPORT,SMTPS,com.sun.mail.smtp.SMTPSSLTransport,太阳   Microsystems,Inc],   com.sun.mail.smtp.SMTPTransport = javax.mail.Provider [TRANSPORT,SMTP,com.sun.mail.smtp.SMTPTransport,太阳   Microsystems,Inc],   com.sun.mail.imap.IMAPSSLStore = javax.mail.Provider [STORE,IMAPS,com.sun.mail.imap.IMAPSSLStore,太阳   Microsystems,Inc],   com.sun.mail.pop3.POP3SSLStore = javax.mail.Provider [STORE,POP3S,com.sun.mail.pop3.POP3SSLStore,太阳   Microsystems,Inc],   com.sun.mail.imap.IMAPStore = javax.mail.Provider [STORE,IMAP,com.sun.mail.imap.IMAPStore,太阳   Microsystems,Inc],   com.sun.mail.pop3.POP3Store = javax.mail.Provider [STORE,POP3,com.sun.mail.pop3.POP3Store,太阳   Microsystems,Inc]} DEBUG:按协议列出的提供商:   {IMAPS = javax.mail.Provider [STORE,IMAPS,com.sun.mail.imap.IMAPSSLStore,太阳   Microsystems,Inc],   IMAP = javax.mail.Provider [STORE,IMAP,com.sun.mail.imap.IMAPStore,太阳   Microsystems,Inc],   SMTPS = javax.mail.Provider [TRANSPORT,SMTPS,com.sun.mail.smtp.SMTPSSLTransport,太阳   Microsystems,Inc],   POP3 = javax.mail.Provider [STORE,POP3,com.sun.mail.pop3.POP3Store,太阳   Microsystems,Inc],   POP3S = javax.mail.Provider [STORE,POP3S,com.sun.mail.pop3.POP3SSLStore,太阳   Microsystems,Inc],   SMTP = javax.mail.Provider [TRANSPORT,SMTP,com.sun.mail.smtp.SMTPTransport,太阳   Microsystems,Inc]} DEBUG:成功加载资源:   /META-INF/javamail.default.address.map DEBUG:getProvider()返回   javax.mail.Provider [交通,SMTP,com.sun.mail.smtp.SMTPTransport,太阳   Microsystems,Inc] DEBUG SMTP:useEhlo true,useAuth true DEBUG SMTP:   useEhlo是,useAuth是真DEBUG SMTP:启动协议到主机   “smtp.googlemail.com”,端口465 DEBUG SMTP:异常读取   response:java.net.SocketTimeoutException:读取超时异常   读取响应javax.mail.MessagingException:异常读取   响应;嵌套异常是:java.net.SocketTimeoutException:   读取超时时间   com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:2153)     在   com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1956)     在   com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:636)     在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)     在java.util.concurrent.FutureTask.run(FutureTask.java:166)at   java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)     在   java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:603)     在java.lang.Thread.run(Thread.java:722)引起:   java.net.SocketTimeoutException:读取超时时间   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 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)     在   com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:2131)     ......还有13个

因此我看到JavaMail无法从套接字读取。那么我做错了什么?如果我尝试使用transport.connect()方法而不在构造函数中使用Socket,那么所有工作都很完美,并且可以从telnet访问smtpHost / smtpPort,我没有任何防火墙/防病毒软件。

1 个答案:

答案 0 :(得分:1)

来自com.sun.mail.smtp.SMTPTransport的文档:

  

通常,应用程序不需要使用此类中的类   直接打包。相反,他们应该使用定义的API   javax.mail包(和子包)。应用永远不应该   直接构造SMTPTransport的实例。相反,他们应该   使用Session方法getTransport来获取合适的   运输对象。

     

警告:应考虑此程序包特有的API   实验。它们将来可能会以某种方式改变   与使用当前API的应用程序不兼容。

JavaMail教程:http://java.sun.com/developer/onlineTraining/JavaMail/contents.html

可能是您没有传递身份验证信息。可能是您使用普通套接字连接到安全主机。您可能希望阅读链接的教程,以获得使用JavaMail的最佳方法。