Похоже, проблема в том, что уведомления о недоставке (bounces), которые я получаю, не содержат поля from. Поэтому при вызове API, например, https://forum.example.com/admin/email/smtp_should_reject.json?from=&to=replies+verp-326f6e22828d2543ba65497a47608f13@mail.forum.example.com, возвращается ошибка 400 с сообщением:
{"errors":["param is missing or the value is empty or invalid: from"]}
Вот немного дополнительных логов mail-receiver:
Nov 03 07:34:53 mail postfix/smtpd[1044]: connect from v-108-120-yyy-74-srvr1.xxx.com[74.91.xxx.108]
<19>Nov 3 07:34:53 discourse-smtp-fast-rejection[1048]: Failed to GET smtp_should_reject answer from https://forum.example.com/admin/email/smtp_should_reject.json: 400<22>Nov 3 07:34:53 policyd-spf[1049]: : prepend Received-SPF: None (no SPF record) identity=helo; client-ip=74.91.xxx.108; helo=v-148-29-xxx-192-srvr1.xxx.com; envelope-from=<>; receiver=mail.forum.example.com Nov 03 07:34:53 mail postfix/smtpd[1044]: NOQUEUE: reject: RCPT from v-108-120-yyy-74-srvr1.xxx.com[74.91.xxx.108]: 450 4.7.1 <replies+verp-326f6e22828d2543ba65497a47608f13@mail.forum.example.com>: Recipient address rejected: Internal error, API request failed; from=<> to=<replies+verp-326f6e22828d2543ba65497a47608f13@mail.forum.example.com> proto=ESMTP helo=<v-148-29-xxx-192-srvr1.xxx.com>
Однако, даже если бы поле from было корректным (если бы я указал там свой email), ответ всё равно был бы таким:
{"reject":true,"reason":"Mail to this address is not accepted. Check the address and try to send again?"}
То есть письмо всё равно было бы отклонено…
Не упустил ли я что-то в конфигурации? Я не могу разобраться.
Нет. Тот же SMTP, исходящие сообщения работают отлично, входящие для тем также приходят без проблем. Проблема в том, что отклонения не видны форуму, поэтому он продолжает попытки, и меня ругает мой хостинг-провайдер.
К сожалению, типичный официальный ответ на подобные вопросы — «электронная почта — это сложно». Вы получите гораздо лучшие результаты, если воспользуетесь сервисом для транзакционных писем.
Если у вас есть бюджет, вы можете написать в Marketplace, или я могу перенести эту тему туда за вас.
Вау! Спасибо, что взяли это в работу! Я уже немного отчаялся, ха-ха! Попробую отключить discourse-smtp-fast-rejection (хотя точно не знаю, как это сделать, но поищу и отпишусь).
Я настраиваю свой mail-receiver.yaml следующим образом (временно или навсегда? @supermathie)
# это шаблон контейнера для входящей почты
##
## После внесения изменений в этот файл вы ОБЯЗАНЫ выполнить пересборку
## /var/discourse/launcher rebuild mail-receiver
##
## БУДЬТЕ *ОЧЕНЬ* ОСТОРОЖНЫ ПРИ РЕДАКТИРОВАНИИ!
## YAML-ФАЙЛЫ ЧРЕЗВЫЧАЙНО ЧУВСТВИТЕЛЬНЫ К ОШИБКАМ В ПРОБЕЛАХ И ВЫРАВНИВАНИИ!
## посещайте http://www.yamllint.com/ для проверки файла по мере необходимости
base_image: discourse/mail-receiver:release
update_pups: false
expose:
- "25:25" # SMTP
env:
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
LANGUAGE: en_US.UTF-8
## Куда должна отправляться почта на ваш форум. В целом, вполне допустимо
## использовать здесь то же доменное имя, что и у самого форума.
MAIL_DOMAIN: community.example.com
# раскомментируйте эти строки (и том ниже!), чтобы включить поддержку TLS
POSTCONF_smtpd_tls_key_file: /letsencrypt/community.example.com/community.example.com.key
POSTCONF_smtpd_tls_cert_file: /letsencrypt/community.example.com/community.example.com.crt
POSTCONF_smtpd_tls_security_level: may
POSTCONF_myhostname: community.example.com
POSTCONF_mynetworks: "127.0.0.0/8 [::1]/128 [fe80::]/64 172.17.0.0/16"
POSTCONF_smtpd_recipient_restrictions: ""
## Базовый URL этого экземпляра Discourse.
## Это будет URL вашего сайта Discourse. Например,
## https://discourse.example.com. Если вы используете настройку с подпапкой,
## обязательно учтите это (например, https://example.com/forum).
DISCOURSE_BASE_URL: 'https://community.example.com'
## Главный API-ключ вашего форума Discourse. Вы можете получить его
## на вкладке "API" вашей панели администратора.
DISCOURSE_API_KEY: <YOURKEY>
## Имя пользователя, используемое для обработки входящей почты. Если вы не меняли
## имя пользователя `system`, оставьте это значение без изменений.
DISCOURSE_API_USERNAME: system
volumes:
- volume:
host: /var/discourse/shared/mail-receiver/postfix-spool
guest: /var/spool/postfix
# раскомментируйте для поддержки TLS
- volume:
host: /var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/
guest: /letsencrypt