Java邮件 : Socket read timeout

标签 java sockets timeout jakarta-mail

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

这是套接字初始化:

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 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 无法从套接字读取。那么我做错了什么?如果我尝试使用 Transport.connect() 方法而不在构造函数中使用 Socket,则所有工作都完美,并且可以从 telnet 访问 smtpHost/smtpPort,并且我没有任何防火墙/防病毒软件。

最佳答案

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

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.

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 的最佳方法。

关于Java邮件 : Socket read timeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7557655/

相关文章:

java - Liferay 7 - 用于单个博客项目的 ADT

java - java中如何将mm/dd/yyyy转换为yyyy-mm-dd

带有带外数据的 Java 套接字

javascript - Angular Directive(指令) : Is there a better way than '$timeout' to get info about DOM elements created in "compile" function?

c# - 从应用程序内更改 Web.Config SessionTimeout 值

java - Swingworker超时

java - 如何获取EditText中选中的光标位置?

java - Eclipse 启动时退出代码 = 13

javascript - Node.js + Apache - https ://localhost:3000/socket. io/ERR_CONNECTION_REFUSED

c++ - TCP - 如果客户端在服务器 accept() 之前调用 close() 会怎样