Тайна Java Mail - SMTP заблокирован?

У меня есть программа Java, которая использует javax.mail для отправки SMTP-сообщения. Эта программа отлично работает на Linux-боксе, хочу заранее это подчеркнуть. Когда я пробую тот же код на моем компьютере с Windows 7 x64, я получаю эту ошибку:

send failed, exception: javax.mail.MessagingException: Could not connect to SMTP host:     smtp.west.cox.net, port: 25;
nested exception is:  java.net.SocketException: Network is unreachable: connect

Вот код:

Session session = Session.getInstance(props, null);
MimeMessage msg = new MimeMessage(session);
msg.setFrom();
msg.setRecipients(Message.RecipientType.TO, props.getProperty("mail.to", "[email protected]"));
msg.setSubject(mySubject);
msg.setSentDate(new Date());
msg.setContent(sBuf.toString(), "text/html");
Transport.send(msg);

Эта программа в значительной степени использует значения по умолчанию для всего. Он отлично работает на другом устройстве в той же сети. В нем используются те же настройки, что и в моем обычном почтовом клиенте, который отлично работает. В ЭТОМ окне Windows есть что-то, что блокирует SMTP, но только для Java.

У меня установлен Symantec (Norton) 360. Отключение не имеет значения, но перезагрузка в безопасном режиме (который отключает почти все) позволяет программе нормально работать и отправлять почту.

Итак, резюмируя:

  1. Программный код работает.
  2. Настройки правильные.
  3. SMTP работает для Windows Mail и заблокирован только для Java на этом компьютере с Windows.

Прежде чем я потрачу еще один день на то, чтобы разбирать вещи и удалять / переустанавливать, я подумал, есть ли у кого-нибудь совет по исправлению этого?


person user1071914    schedule 28.12.2012    source источник
comment
что произойдет, если вы попробуете telnet smtp.west.cox.net 25 из командной строки?   -  person Diego Basch    schedule 28.12.2012
comment
Какая версия Windows? Брандмауэр Windows активен?   -  person Perception    schedule 28.12.2012
comment
Так как ваш код работает в безопасном режиме... это не ваш код. Я подозреваю, что Java не разрешен через брандмауэр Windows.   -  person Brian Roach    schedule 28.12.2012
comment
Этот вопрос лучше разместить в ServerFault. Это проблема сети/ОС, а не проблема программирования.   -  person ccleve    schedule 28.12.2012
comment
Тестовый порт 25 из PUTTY (telnet) подключается к SMTP-серверу, как и ожидалось.   -  person user1071914    schedule 28.12.2012
comment
@Perception: Windows — это Windows 7 x64, на которой установлен Norton 360 Security Suite. Брандмауэр Norton фактически заменяет брандмауэр Windows.   -  person user1071914    schedule 28.12.2012
comment
Кажется, это не вопрос, связанный с программированием как таковой. Но можете ли вы проверить, не заблокирован ли доступ к Интернету самой Java?   -  person Pushkar    schedule 28.12.2012
comment
просто предложение не использовать 25 в качестве smtp-порта, потому что он не защищен, и многие почтовые серверы обнаружат вашу почту как спам   -  person ThePCWizard    schedule 28.12.2012


Ответы (6)


Проблема связана с предпочтением IPv4/IPv6 Java. Java пытается использовать IPv6 по умолчанию (?), а мой интернет-провайдер не поддерживает IPV6. Однако на моих компьютерах с Windows 7 он включен по умолчанию.

Если вы столкнулись с подобным поведением, вы можете проверить это, перейдя в «Панель управления/Сеть и Интернет/Сетевые подключения», щелкнув правой кнопкой мыши свое подключение к Интернету и выбрав «Состояние» в контекстном меню. В диалоговом окне состояния отобразятся две строки, подобные этой:

IPv4 Connectivity:  Internet
IPv6 Connectivity:  No Internet access

В этом корень проблемы — Java предпочитает IPv6, который она не может использовать для подключения к Интернету.

Чтобы исправить это, выполните одно (или оба) из следующих действий:

  1. Отключите IPv6 на вашем компьютере с Windows 7.
  2. Запустите свою Java-программу, используя этот параметр командной строки:

    -Djava.net.preferIPv4Stack=true
    

Выполнение любого из этих действий решит проблему.

person user1071914    schedule 28.12.2012
comment
Спасибо за это объяснение, исправляет мою проблему. Кто-то еще в stackoverflow заявил, что может использовать IPv6-адрес своего почтового/Exchange-сервера в качестве хоста вместо IPv4-адреса сервера. но не уверен, что это решает проблемы, о которых вы упоминали выше. - person armyofda12mnkeys; 01.05.2013
comment
Это действительно офигенный ответ, я бился головой о стену! Я бы дал вам 100 голосов, если бы мог. - person trognanders; 07.06.2013
comment
Просто передача аргумента JVM -Djava.net.preferIPv4Stack=true решила мою проблему. - person Gladwin Burboz; 20.09.2013

У меня была такая же проблема во время обновления формы java 1.6 до java 1.7. Проблема возникла из-за того, что java 1.7 по умолчанию использует IPv6. Чтобы это исправить, вам нужно добавить параметр Java, как в примере ниже.

Просто запустите эту команду в Windows cmd:

setx _JAVA_OPTIONS -Djava.net.preferIPv4Stack=true
person mariusz117    schedule 09.08.2013
comment
к чему звезды? - person azerafati; 02.03.2015

Symantec EP 12.1 RU5 устраняет вашу проблему.

Symantec Endpoint Protection блокирует электронную почту, отправленную почтовым клиентом Java

Идентификатор исправления: 3399185

Симптом. Функция автоматической защиты электронной почты Интернета в Symantec Endpoint Protection блокирует электронную почту SMTP, отправляемую почтовым клиентом Java.

Решение. Драйвер автоматической защиты электронной почты в Интернете обновлен, чтобы разрешить обработку адресов IPv6, сопоставленных с IPv4.

person sengokyu    schedule 01.12.2014

Я также столкнулся с той же проблемой, в основном это была проблема с Java 7. Просто передав аргумент JVM «-Djava.net.preferIPv4Stack = true», я избавился от проблемы.

person sbpandey    schedule 02.10.2013
comment
пожалуйста, добавьте такие короткие ответы в качестве комментариев - person MichaC; 02.10.2013

Хотя эта проблема решена: все же может быть полезно указать, что некоторые брандмауэры Windows блокируют/разрешают доступ к портам на основе имени исполняемого файла (а не только самого номера порта), так что вы можете в конечном итоге с одной программой (скажем, Outlook ) разрешено, а другое (скажем, Java) заблокировано.

person monojohnny    schedule 26.02.2015

У меня была аналогичная проблема, но, как ни странно, все работало нормально с jdk 1.6, как только я установил jdk 1.7, я получил исключение. Интересно, в чем может быть причина этого!

После добавления аргумента IPV4 он работает нормально. Большое спасибо.

person Renu    schedule 06.06.2014
comment
Это квалифицируется как комментарий, а не ответ. - person Ojonugwa Jude Ochalifu; 13.08.2019