我正在使用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,我没有任何防火墙/防病毒软件。
答案 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的最佳方法。