Настроили mail-receiver, но теперь сайт не отправляет письма?

Хм. У меня такая же настройка Vultr, как у @MathiasFoster и @jryans здесь, и я столкнулся с той же проблемой (Net::OpenTimeout). Команда ufw allow https восстановила работу входящей почты.

Но теперь сайт не может отправлять письма. До настройки входящей почты исходящая почта работала нормально.

У меня нет никаких сложных настроек:
notification_email = admin@tasat.org.
Исходящая почта использует smtp.titan.email на Hostinger.

Файл mail_receiver.yml содержит:

`MAIL_DOMAIN` = forum.tasat.org
`DISCOURSE_MAIL_ENDPOINT` = https://forum.tasat.org/admin/email/handle_mail
`DISCOURSE_API_KEY` = [скрыто]

В разделе пропущенных писем я вижу: <replies+verp-14c9cc6eb915b08d4983c90c744ba4b4@forum.tasat.org>: Sender address rejected: not owned by user admin@tasat.org.

Я новичок в настройке почтовых систем. Стоит ли убрать forum. из строк в mail_receiver.yml и сделать «replies@tasat.org» псевдонимом для отправки от имени «admin@tasat.org»..?

Почтовый получатель не зависит от Discourse и отправки писем; он работает как простой почтовый сервер, настроенный исключительно на получение писем, и использует API Discourse для передачи этих писем в Discourse.

Единственное, что я могу придумать в процессе настройки, что может повлиять на отправку, — это настройка «адреса для ответа по электронной почте», хотя это должно лишь устанавливать поле Reply-To в исходящих письмах и не должно влиять на адрес отправителя.

Просто для подтверждения: похоже, что у вас в app.yml указаны (среди прочего) следующие параметры:

DISCOURSE_SMTP_USER_NAME: admin@tasat.org
DISCOURSE_NOTIFICATION_EMAIL: admin@tasat.org

А в настройке «адрес для ответа по электронной почте» указано:

replies+%{reply_key}@forum.tasat.org

Правильно ли я понял?

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

При такой конфигурации для писем, которые могут принимать ответы, должно происходить следующее: отправляемое письмо использует:
From: admin@tasat.org (также адрес отправителя)
Reply-To: replies+abc123@forum.tasat.org

Обычно поле Reply-To не рассматривается как часть информации об отправителе; оно просто указывает адрес по умолчанию, который будет использоваться при ответе. Однако, возможно, в Hostinger к этому относятся иначе. Вы можете попробовать добавить алиас для отправки с адреса replies@forum.tasat.org.

Что произойдет, если вы попытаетесь отправить тестовое письмо на адрес, полученный с https://www.mail-tester.com/?

Я не понимаю, как изменение команды ufw allow https может повлиять на входящую почту.

Возможно, Vultr блокирует исходящие соединения на порт 25. Это могло бы объяснить проблемы с отправкой писем.

Исходящая и входящая почта в значительной степени независимы друг от друга.

Полагаю, Vultr (или, возможно, просто установка Docker при наличии ufw) имеет некоторые правила, которые препятствуют общению контейнеров друг с другом, из-за чего почтовый получатель не может подключиться к Discourse. Команда ufw allow https обходит эту проблему.

Но Docker обходит ufw, не так ли?

По умолчанию в сети только в том случае, если контейнер подключается напрямую к другому контейнеру по локальному IP-адресу, то есть по локальному IP-адресу самого контейнера.

Когда почтовый получатель выполняет поиск доменного имени вашего Discourse, он не получит этот локальный IP-адрес, поэтому ему придется покинуть свою Docker-сеть и как минимум один раз пройти через ufw, чтобы достичь Discourse.

Я думал об этой теме, в которой вы тоже участвовали:

Это отдельная ситуация, хотя и связанная. Речь идет о входящих соединениях извне, и Docker добавляет правила, разрешающие доступ к открытым портам.

Я не очень хорошо знаком с правилами цепочек netfilter/iptables, но полагаю, что вышеизложенное означает следующее:

  1. Если соединение приходит с docker0, то есть из сети Docker по умолчанию, возврат в предыдущую цепочку (прекратить обработку правил в этой цепочке).
  2. В противном случае, если соединение приходит из любого источника, кроме docker0, и оно является https или http, применяется DNAT, что перенаправляет его в цепочку FORWARD.

Таким образом, при конфигурации, показанной в другой теме, происходит следующее: если извне поступает трафик https или http, он перенаправляется в Docker. Однако если трафик поступает из сети Docker, он возвращается и отклоняется или отбрасывается цепочкой INPUT.

Команда ufw allow https добавляет правило в цепочку INPUT, разрешающее такой трафик. Таким образом, когда соединение возвращается в цепочку INPUT, как описано выше, оно принимается, и Docker, прослушивающий порт, получает запрос, который в конечном итоге маршрутизируется к контейнеру.

@Simon_Manning @pfaffman

РЕДАКТИРОВАНИЕ: см. конец сообщения

Спасибо за ответы! Я был вынужден отсутствовать некоторое время, но теперь снова возвращаюсь к этой теме…

Да, именно так у меня настроено в данный момент.

Когда я сейчас пытаюсь создать учётную запись, кнопка отправки ничего не делает. Будто она знает, что это не сработает. (И ничего не появляется в разделе «Пропущено» или где-либо ещё.)

Редактирование: Я установил «replies@tasat.org» как псевдоним для отправки для адреса admin@tasat.org и подтвердил, что он работает как для отправки, так и для получения. Я также подтвердил доставку письма, отправленного из внешнего почтового клиента и адресованного на replies+verp-174bc7d8411bc4ec2cfa84c55bd31425@forum.tasat.org.

В попытке попробовать что-нибудь я изменил «адрес для ответов по электронной почте»:
с replies+%{reply_key}@forum.tasat.org
на replies+%{reply_key}@tasat.org.

Но это не изменило результатов.

Письмо не доходит до mail-tester. Все попытки исходящей отправки заканчиваются в разделе «Пропущено» с различными вариантами этого сообщения:

553 5.7.1 <replies+verp-8c79cd4e83023bda6df0624c2cacd36e@tasat.org>: 
Адрес отправителя отклонён: не принадлежит пользователю admin@tasat.org

Возможно, это интересно? Когда я запускаю discourse-doctor, исходящая почта не отправляется со следующим сообщением:

==================== ТЕСТ ПОЧТЫ ====================
Для надёжного теста получите адрес на http://www.mail-tester.com/
Отправка письма на ССКРЫТО . . 
Проверка отправки на admin@tasat.org через smtp.titan.email:587,
имя пользователя: admin@tasat.org с обычной аутентификацией.
Соединение с SMTP-сервером успешно.
Отправка на admin@tasat.org . . . 
Письмо не было отправлено.

Причина: 553 5.7.1 <replies+verp-3cc19f7b135e6f56219e030999db9e29@tasat.org>: 
Адрес отправителя отклонён: не принадлежит пользователю admin@tasat.org

Отправка напрямую на адрес replies+ (или на адрес forum.tasat.org) из почтового клиента работает — она следует псевдониму «replies» и попадает во входящие администратора. Откуда же происходит отклонение?

Я посмотрел раздел статьи «Предотвращение вмешательства исходящей почты хостинга». У меня нет пути /etc/postfix, но вот вывод netstat:

root@forum:/var/discourse# netstat -tulpn | grep :25
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      1487576/docker-prox
tcp6       0      0 :::25                   :::*                    LISTEN      1487581/docker-prox

ВАЖНОЕ РЕДАКТИРОВАНИЕ – Сегодня вечером я получил ответ от поддержки Titan: «Адрес в поле Reply-To и адрес отправителя должны совпадать, иначе письмо не будет отправлено». Похоже, все мои попытки устранения неполадок были напрасны, и мне придётся искать нового поставщика электронной почты, который не накладывает такого требования.

Этот список, конечно, не исчерпывающий, но в документации по установке есть рекомендации по службам отправки писем, а также базовая информация об их использовании в Discourse: discourse/docs/INSTALL-email.md at main · discourse/discourse · GitHub

В следующей теме (ссылка находится в конце этого документа) также содержится информация об обработке отказов для этих и других служб:

Я сам использую тариф Flex от Mailgun (полностью в рамках бесплатного лимита), но знаю, что у многих возникала путаница с их ценообразованием, и, возможно, для новых пользователей условия изменились с момента моего присоединения. Последнее, что я видел (не знаю, актуально ли это до сих пор), — можно было перейти на тариф Flex после окончания пробного периода, но это было невероятно запутанно.

Верно.

Вы можете перейти на Mailgun Flex, хотя они затрудняют поиск этой информации. Примерно раз в месяц я пишу им письмо с вопросом, почему так сложно это найти.

@Simon_Manning и @pfaffman — ещё раз спасибо за советы и подсказки, они помогли мне встать на правильный путь.

Я решил попробовать MailerSend, так как их текущий бесплатный тариф довольно щедрый. Он должен подойти для нашей некоммерческой инициативы на какое-то время. Пока всё работает отлично :grin: