我正在使用JavaMail,我希望它通过代理为每个线程工作(我有多线程应用程序)。我用的是SMTPTransport。连接(套接字套接字)。
下面是套接字初始化:
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:成功加载资源:/META-INF/javamail.default.providers DEBUG:加载的提供商表按类名列出的提供程序:{com.sun.mail.smtp.SMTPSSLTransport = javax.mail.Provider(运输、smtp、com.sun.mail.smtp.SMTPSSLTransport,太阳微系统公司),(运输、smtp、com.sun.mail.smtp.SMTPTransport com.sun.mail.smtp.SMTPTransport = javax.mail.Provider,太阳微系统公司),(存储、imap com.sun.mail.imap.IMAPSSLStore com.sun.mail.imap.IMAPSSLStore = javax.mail.Provider,太阳微系统公司),(存储、pop3 com.sun.mail.pop3.POP3SSLStore com.sun.mail.pop3.POP3SSLStore = javax.mail.Provider,太阳微系统公司),(存储、imap com.sun.mail.imap.IMAPStore com.sun.mail.imap.IMAPStore = javax.mail.Provider,太阳微系统公司),(存储、pop3 com.sun.mail.pop3.POP3Store com.sun.mail.pop3.POP3Store = javax.mail.Provider,太阳Microsystems, Inc]} DEBUG:由协议列出的提供商:{imap = javax.mail.Provider(存储、imap com.sun.mail.imap.IMAPSSLStore、太阳微系统公司),(存储、imap com.sun.mail.imap.IMAPStore imap = javax.mail.Provider,太阳微系统公司),(运输、smtp、com.sun.mail.smtp.SMTPSSLTransport smtp = javax.mail.Provider,太阳微系统公司),(存储、pop3 com.sun.mail.pop3.POP3Store pop3 = javax.mail.Provider,太阳微系统公司),(存储、pop3 com.sun.mail.pop3.POP3SSLStore pop3 = javax.mail.Provider,太阳微系统公司),(运输、smtp、com.sun.mail.smtp.SMTPTransport smtp = javax.mail.Provider,太阳Microsystems, Inc]} DEBUG:成功加载资源:/META-INF/javamail.default.address.map DEBUG: getProvider()返回(运输、smtp、com.sun.mail.smtp.SMTPTransport javax.mail.Provider,太阳调试SMTP: useEhlo true, useAuth trueuseEhlo true, useAuth true DEBUG SMTP:向主机启动协议"smtp.googlemail.com",端口465response: 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)连接(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. futurettask .run(futurettask .java:166) atjava.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java: 1110)在java.util.concurrent.ThreadPoolExecutor Worker.run美元(ThreadPoolExecutor.java: 603)在java.lang.Thread.run(Thread.java:722)sockettimeoutexception:读取超时socketread0(本机方法)atjava.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
所以我看到JavaMail不能从socket读取。那么我做错了什么呢?如果我尝试使用transport.connect()方法而不使用构造函数中的Socket,则所有工作都很完美,smtpHost/smtpPort可以从telnet访问,并且我没有任何防火墙/防病毒软件。
来自com.sun.mail.smtp.SMTPTransport的文档:
JavaMail教程:http://java.sun.com/developer/onlineTraining/JavaMail/contents.html一般情况下,应用程序不需要使用this中的类直接包。相反,它们应该使用定义的apijavax。邮件包(和子包)。应用程序不应该直接构造SMTPTransport实例。相反,他们应该使用会话方法getTransport获取适当的运输对象。
警告:应该考虑这个包独有的api实验。它们将来可能会以某种方式改变与使用当前api的应用程序不兼容
可能是您没有传递认证信息。可能是您正在使用普通套接字连接到安全主机。