Электронная почта перестала работать: 550-Bad HELO

Я запускаю тестовую среду (в данный момент 2.4.0.beta4) дома на локальном мини-ПК с Ubuntu 16.04 LTS. Установил её, используя отличное руководство по установке за 30 минут. У системы есть FQDN. Отправка писем через почтовый ящик моего провайдера по SMTP на порту 587 с обычной аутентификацией работала без проблем уже более года.

Только что заметил, что какое-то время не получал никаких уведомлений по электронной почте, например, о «доступной новой версии». Проверив раздел Администрирование > Электронная почта > Пропущенные, обнаружил, что все письма получают ошибку:

550-Bad HELO: localhost.localdomain does not exist - Please see RFC 2821

Проверив историю в почтовом ящике, понял, что это могло начаться с версии 2.4.0.beta2. Однако это также могло быть связано с изменением политики моего провайдера примерно в то же время (конец июля 2019 года). Не уверен, с чего начать. Откуда берётся localhost.localdomain? Во время установки мне нужно было отредактировать только файл app.yml, и в нём параметр DISCOURSE_HOSTNAME корректно указывает мой FQDN:

Похоже, что localhost.localdomain предоставляется вашим провайдером. Не могли бы вы протестировать это с помощью Mailgun?

Я никогда не слышал о Mailgun. Вы имеете в виду mailgun.com, «Сервис API для транзакционной электронной почты»? Чтобы вы понимали мой уровень знаний: я смутно представляю, что такое API, но не знаю, как им пользоваться. Однако я мог бы попробовать использовать SMTP для отправки на другой почтовый ящик у другого провайдера. Завтра отпишусь здесь.

Mailgun предоставит учетные данные SMTP, если вы зарегистрируетесь. Я уверен, что вы сможете разобраться, просто следуя их инструкциям при регистрации.

@itsbhanusharma, @jtbayly Спасибо! Мне удалось отправить тестовое сообщение через Mailgun. Проблема была в новом правиле на SMTP-сервере моего провайдера. Возможно, я продолжу использовать Mailgun.

Я провел дополнительные исследования, так как не могу использовать Mailgun для нашего производственного форума.

В заголовках писем, приходящих через Mailgun, я всё ещё вижу:

Received: from localhost.localdomain

HELO — это первая команда в SMTP-диалоге (источник).

Она должна выглядеть примерно так:

HELO discourse.mydomain.tld

Некоторые SMTP-серверы, например Postfix, имеют опцию проверки этого значения на соответствие IP-адресу клиента. localhost.localdomain разрешается в IP-адрес SMTP-сервера; скорее всего, он прописан в его файле hosts. Похоже, что интернет-провайдеры включают эту проверку в своей борьбе со спамом.

С Mailgun это работает, потому что Mailgun не выполняет такую проверку. Но это всё равно «плохой HELO».

Для сравнения: я отправил письмо с помощью почтового клиента (Sylpheed) на той же системе. Это работает, даже через почтовый ящик моего провайдера, и, судя по всему, используется:

HELO HL80L

HL80L — это имя моей локальной сети. Это всё ещё не FQDN, но хотя бы не выглядит как явная подделка для сервера моего провайдера.

Так что, возможно, это то, что нужно улучшить. Но оговорка: я не эксперт в области SMTP.

Кстати, я снова заставил это работать через почтовый ящик у моего провайдера, добавив MTA в качестве ретранслятора. Это приложение на базе Postfix на моём NAS. Оно использует HELO mydomain.tld

Я проверю, не сломали ли мы что-то при переходе на Debian 10 или обновлении до Rails 6. Тем временем установка DISCOURSE_SMTP_DOMAIN в app.yml должна сработать. Думаю, нам стоит по умолчанию использовать значение DISCOURSE_HOSTNAME, если домен SMTP явно не задан. :thinking:

Спасибо, @gerhard! Переменная DISCOURSE_SMTP_DOMAIN отсутствовала в моём файле app.yml, но я глубоко вздохнул, добавил её, и да, это сработало. Теперь я снова могу использовать почтовый ящик своего провайдера. На принимающей стороне в заголовке я вижу:

Received: from XXXXXXX.cable.dynamic.v4.ziggo.nl ([XX.XX.XX.X] helo=mydomain.tld)
by smtp7.mnd.mail.iss.as9143.net with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
(Exim 4.90_1)

Тем временем я узнал, что как RFC 2821, так и его преемник RFC 5321, раздел 4.1.4 гласят:

SMTP-сервер МОЖЕТ проверить, что аргумент доменного имени в команде EHLO действительно соответствует IP-адресу клиента. Однако, если проверка не удалась, сервер НЕ ДОЛЖЕН отказывать в принятии сообщения на этом основании. Информация, полученная в ходе попытки проверки, предназначена для ведения журналов и трассировки. Обратите внимание, что этот запрет применяется только к сопоставлению параметра с его IP-адресом; см. Раздел 7.9 для более подробного обсуждения отклонения входящих соединений или почтовых сообщений.

Тем не менее, многие MTA, такие как Postfix и Exim, всё ещё имеют опциональную настройку для выполнения такой проверки. Возможно, администраторы включают её в рамках непрерывной борьбы со спамом.