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.
Прежде чем я потрачу другой день, разрывая вещи и удаляя/переустанавливая, я задавался вопросом, есть ли у кого-нибудь советы по исправлению этого?
Ответы
Ответ 1
Проблема связана с предпочтением IPv4/IPv6 Java. Java пытается использовать IPv6 по умолчанию (?), А мой интернет-провайдер не поддерживает IPV6. Однако он по умолчанию включался в мои окна Windows 7.
Если вы испытываете подобное поведение, вы можете проверить это, выбрав "Панель управления/Сеть и Интернет/Сетевые подключения", щелкнув правой кнопкой мыши ваше интернет-соединение и выбрав "Статус" в контекстном меню. В диалоговом окне "Состояние" будут отображаться две строки, похожие на следующие:
IPv4 Connectivity: Internet
IPv6 Connectivity: No Internet access
Это корень проблемы - Java предпочитает IPv6, который он не может использовать для подключения к Интернету.
Чтобы исправить это, сделайте одно (или оба) из этих вещей:
Выполнение любой из этих проблем устранит проблему.
Ответ 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 он работает нормально.. Большое спасибо.