JavaMail:套接字读取超时 [英] JavaMail: Socket read timeout

查看:82
本文介绍了JavaMail:套接字读取超时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用JavaMail,并且希望它通过代理处理每个线程(我有多线程应用程序).我正在为此使用SMTPTransport.connect(Socket socket).

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.

这是套接字初始化:

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

这是SMTPTransport呼叫:

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:

调试:JavaMail版本1.4.4调试:成功加载资源: /META-INF/javamail.default.providers调试:已加载的提供程序表 调试:按类名称列出的提供程序: {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]}调试:按协议列出的提供商: {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 [运输,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 [运输,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems,Inc]}调试:已成功加载资源: /META-INF/javamail.default.address.map调试:getProvider()返回 javax.mail.Provider [TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems,Inc] DEBUG SMTP:useEhlo是,useAuth是DEBUG SMTP: useEhlo是,useAuth是DEBUG SMTP:启动主机协议 "smtp.googlemail.com",端口465 DEBUG SMTP:读取异常 响应: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)在 javax.mail.Service.connect(Service.java:176)在 javax.mail.Service.connect(Service.java:125)在 com.sun.mail.smtp.SMTPTransport.connect(SMTPTransport.java:274)位于 lsmtpc.CheckAccount.run(CheckAccount.java:203)位于 java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:471) 在java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:334) 在java.util.concurrent.FutureTask.run(FutureTask.java:166)在 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(本机方法),位于 java.net.SocketInputStream.read(SocketInputStream.java:150)在 java.net.SocketInputStream.read(SocketInputStream.java:121)在 com.sun.mail.util.TraceInputStream.read(TraceInputStream.java:110)位于 java.io.BufferedInputStream.fill(BufferedInputStream.java:235)在 java.io.BufferedInputStream.read(BufferedInputStream.java:254)在 com.sun.mail.util.LineInputStream.readLine(LineInputStream.java:89) 在 com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:2131) ...还有13个

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

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

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.

推荐答案

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

From the documentation for com.sun.mail.smtp.SMTPTransport:

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

In general, applications should not need to use the classes in this package directly. Instead, they should use the APIs defined by javax.mail package (and subpackages). Applications should never construct instances of SMTPTransport directly. Instead, they should use the Session method getTransport to acquire an appropriate Transport object.

警告:应考虑此软件包独有的API 实验性的.将来可能会以下列方式更改它们 与使用当前API的应用程序不兼容.

WARNING: The APIs unique to this package should be considered EXPERIMENTAL. They may be changed in the future in ways that are incompatible with applications using the current APIs.

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

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

可能是您没有传递身份验证信息.可能是您正在使用普通套接字连接到受保护的主机.您可能需要阅读链接的教程,以获得使用JavaMail的最佳方法.

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.

这篇关于JavaMail:套接字读取超时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆