Javax.mail: «Отказано в подключении» к smtp.gmail.com

У меня есть веб-приложение, которое регистрирует фатальные ошибки (в основном из-за ошибок в коде), а также сообщает о них по электронной почте на учетную запись gmail, используя smtp.gmail.com:465. Это отлично работало в течение многих лет, и система стабильна, поэтому прошло некоторое время с тех пор, как у меня в последний раз была фатальная ошибка (октябрь 2017 г.). Однако на днях я сделал кое-что глупое, тестируя исправление, и это вызвало отчет о фатальной ошибке. Письмо не было отправлено, и я получил это:

javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465;
  nested exception is:
    java.net.ConnectException: Connection refused: connect

Я могу подключиться через телнет:

$ telnet smtp.gmail.com 465
Trying 74.125.133.109...
Connected to gmail-smtp-msa.l.google.com.
Escape character is '^]'.

Я предполагаю, что это как-то связано с безопасностью Gmail, а это означает, что вам нужно выполнить какую-то специальную настройку, если вы хотите использовать Thunderbird или что-то в этом роде вместо ужасного веб-интерфейса Gmail. Может ли кто-нибудь сказать мне, что я должен сделать, чтобы заставить это работать?

Вы используете telnet на той же машине, где работает ваше веб-приложение? «Отказ в подключении» обычно связан с брандмауэром или антивирусом, препятствующим подключению. Вы не столкнетесь с этими проблемами безопасности Gmail, пока не установите успешное подключение к сокету.

Bill Shannon 14.06.2019 09:21

Да, все на одной машине.

user1636349 14.06.2019 10:21

Поэтому проверьте настройки антивируса или брандмауэра.

Bill Shannon 14.06.2019 20:10

Проверено. Это сервер Linux без антивирусного программного обеспечения. Тот факт, что telnet подключается, показывает, что проблема не в брандмауэре.

user1636349 15.06.2019 14:13

«Вы не столкнетесь с этими проблемами безопасности Gmail, пока, по крайней мере, не сделаете успешное подключение к сокету» — но в какой момент javax.mail выдает исключение? Поскольку я могу подключиться с помощью telnet, я подозреваю, что могу установить TCP-соединение, но тогда gmail отклоняет учетные данные для входа, и это вызывает исключение.

user1636349 15.06.2019 14:16

Копаясь в источнике, исходное исключение выдается из строки 1934 openServer в com.sun.mail.smtp.SMTPTransport, потому что ответ от сервера не был 220 (сервис готов) - и все же telnet выдает 220, когда я подключаюсь. Я также пробовал порты 25 и 587 с теми же результатами.

user1636349 15.06.2019 14:49

«Отказ в соединении» исходит от уровня сокетов, а не от JavaMail. В вашем брандмауэре могут быть правила для конкретных приложений, но, скорее всего, их нет. Я не могу понять, почему telnet может подключаться с той же машины, но ваше веб-приложение не может подключиться. Вы можете попробовать запустить один из автономных примеров программ JavaMail, таких как программы msgsend.java или smtpsend.java, просто для того, чтобы получить базовую работу JavaMail. Инструкции см. в FAQ по JavaMail.

Bill Shannon 16.06.2019 08:45

Интересно еще и то, что код, который отправляет сообщение, не менялся около 10 лет, и работал как минимум до конца 2017 года... Поиграюсь с вашей программой msgsend и посмотрю, что получится. Спасибо.

user1636349 17.06.2019 11:15

Если он работал раньше, это очень сильно указывает на другую проблему среды, такую ​​как обновление правил брандмауэра на вашем компьютере или в вашей сети.

Bill Shannon 17.06.2019 18:21
Отправка электронной почты с помощью Python менее чем за 1 минуту
Отправка электронной почты с помощью Python менее чем за 1 минуту
Отправка электронной почты с помощью Python - это удобный способ автоматизировать процесс отправки электронных писем. Это может быть полезно для...
0
9
732
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оказывается, это Gmail был симпатичным. Основной ошибкой был «отказ в аутентификации», но в другом месте она была обернута в исключение «отказ в подключении». Я наконец понял, как сказать Gmail разрешить доступ из небезопасного приложения, и это решило проблему.

Другие вопросы по теме