Подтвердить что ты не робот

Java Mail mystery - 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. Отключение его не имеет значения, но перезагрузка в безопасный режим (который отключает почти все) позволяет программе работать и отправлять почту просто отлично.

Итак, чтобы повторить:

  • Программный код работает.
  • Настройки верны.
  • SMTP работает для Windows Mail и блокируется только для Java на этой машине Windows.

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

4b9b3361

Ответ 1

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

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

IPv4 Connectivity:  Internet
IPv6 Connectivity:  No Internet access

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

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

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

    -Djava.net.preferIPv4Stack=true
    

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

Ответ 2

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

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

**setx _JAVA_OPTIONS -Djava.net.preferIPv4Stack=true**

Ответ 3

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

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

Исправить ID: 3399185

Признак: функция автоматической защиты электронной почты в Symantec Endpoint Protection блокирует SMTP-адрес электронной почты, отправленный почтовым клиентом Java.

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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