JavaMail: время ожидания чтения сокета - PullRequest
0 голосов
/ 26 сентября 2011

Я использую 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");

И такна.Но у меня эта ошибка происходит:

ОТЛАДКА: JavaMail версия 1.4.4 ОТЛАДКА: успешно загруженный ресурс: /META-INF/javamail.default.providers DEBUG: Таблицы загруженных поставщиков DEBUG: Поставщики перечислены в классеИмя: {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 [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 [ТРАНСПОРТ, smtp, com.sun.mail.smtp.SMTPTransport, Sun Microsystems, Inc]} DEBUG: успешно загружен ресурс: /META-INF/javamail.default.address.map DEBUG: getProvider (), возвращающий javax.mail.Provider [TRANSPORT, smtp, com.sun.mail.smtp.SMTPTransport, Sun Microsystems, Inc] Отладка SMTP: useEhlo true, useAuth true Отладка SMTP: useEhlo true, useAuth true DEBUG SMTP: запуск протокола для хоста «smtp.googlemail.com», порт 465 Отладка 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:) на 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.j166) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1110) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:603) в java.lang.Thjr.: 722) Вызвано: java.net.SocketTimeoutИсключение: Тайм-аут чтения в 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

Итак, как я вижу, JavaMail не может читать из сокета. Так что я делаю не так? Если я пытаюсь использовать метод transport.connect () без использования Socket в конструкторе, все работает отлично, и smtpHost / smtpPort доступны из telnet, и у меня нет никаких брандмауэров / антивирусов.

1 Ответ

1 голос
/ 26 сентября 2011

Из документации для com.sun.mail.smtp.SMTPTransport:

Как правило, приложениям не нужно напрямую использовать классы в этом пакете.Вместо этого они должны использовать API, определенные пакетом javax.mail (и подпакетами).Приложения никогда не должны создавать экземпляры SMTPTransport напрямую.Вместо этого им следует использовать метод Session getTransport для получения соответствующего транспортного объекта.

ВНИМАНИЕ: API, уникальные для этого пакета, должны рассматриваться как ЭКСПЕРИМЕНТАЛЬНЫЕ.Они могут быть изменены в будущем способами, несовместимыми с приложениями, использующими текущие API.

Руководство по JavaMail: http://java.sun.com/developer/onlineTraining/JavaMail/contents.html

Возможно, вы не передаете информацию аутентификации.Возможно, вы подключаетесь к защищенному хосту с помощью простого сокета.Возможно, вы захотите прочитать учебник, связанный с ним, чтобы узнать, как лучше использовать JavaMail.

...