У меня есть веб-приложение, которое регистрирует фатальные ошибки (в основном из-за ошибок в коде), а также сообщает о них по электронной почте на учетную запись 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. Может ли кто-нибудь сказать мне, что я должен сделать, чтобы заставить это работать?
Да, все на одной машине.
Поэтому проверьте настройки антивируса или брандмауэра.
Проверено. Это сервер Linux без антивирусного программного обеспечения. Тот факт, что telnet подключается, показывает, что проблема не в брандмауэре.
«Вы не столкнетесь с этими проблемами безопасности Gmail, пока, по крайней мере, не сделаете успешное подключение к сокету» — но в какой момент javax.mail выдает исключение? Поскольку я могу подключиться с помощью telnet, я подозреваю, что могу установить TCP-соединение, но тогда gmail отклоняет учетные данные для входа, и это вызывает исключение.
Копаясь в источнике, исходное исключение выдается из строки 1934 openServer в com.sun.mail.smtp.SMTPTransport, потому что ответ от сервера не был 220 (сервис готов) - и все же telnet выдает 220, когда я подключаюсь. Я также пробовал порты 25 и 587 с теми же результатами.
«Отказ в соединении» исходит от уровня сокетов, а не от JavaMail. В вашем брандмауэре могут быть правила для конкретных приложений, но, скорее всего, их нет. Я не могу понять, почему telnet может подключаться с той же машины, но ваше веб-приложение не может подключиться. Вы можете попробовать запустить один из автономных примеров программ JavaMail, таких как программы msgsend.java или smtpsend.java, просто для того, чтобы получить базовую работу JavaMail. Инструкции см. в FAQ по JavaMail.
Интересно еще и то, что код, который отправляет сообщение, не менялся около 10 лет, и работал как минимум до конца 2017 года... Поиграюсь с вашей программой msgsend и посмотрю, что получится. Спасибо.
Если он работал раньше, это очень сильно указывает на другую проблему среды, такую как обновление правил брандмауэра на вашем компьютере или в вашей сети.
Оказывается, это Gmail был симпатичным. Основной ошибкой был «отказ в аутентификации», но в другом месте она была обернута в исключение «отказ в подключении». Я наконец понял, как сказать Gmail разрешить доступ из небезопасного приложения, и это решило проблему.
Вы используете telnet на той же машине, где работает ваше веб-приложение? «Отказ в подключении» обычно связан с брандмауэром или антивирусом, препятствующим подключению. Вы не столкнетесь с этими проблемами безопасности Gmail, пока не установите успешное подключение к сокету.