# Configure direct-delivery incoming email for self-hosted sites with Mail-Receiver

**URL:** https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487
**Category:** Self-Hosting
**Tags:** email, how-to, advanced-setup, mail-receiver
**Created:** [31.Август.2016 10:58:09 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487 "2016-08-31T10:58:09Z")
**Posts on this page:** 20
**Page:** 1

<div class="post-metadata">

### Author: ![Discourse](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/discourse/32/148734_2.png) [@Discourse](https://meta.discourse.org/u/Discourse)
#### Post date: [31.Август.2016 10:58:09 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/1 "2016-08-31T10:58:09Z")

</div>

Discourse is all about enabling civilized discussion. While plenty of people like a web interface, e-mail is still the “hub” of many people’s online lives. That’s why sending e-mail is so important, and when you’re sending e-mail, you really want to be able to receive it, too. There are several reasons why:

- If e-mails “bounce” (they can’t be delivered for some reason), you need to know about that. Repeatedly sending e-mails that bounce will get your e-mails flagged as spam. Receiving e-mail bounces allows you to disable sending to non-existent addresses.
- Allowing people to reply to posts via e-mail can significantly improve engagement, as people can reply straight away from their mail client, even if they’re not able to visit the forum at that moment.
- Letting people post new topics, or send PMs, via e-mail has similar benefits to engagement. In addition, you can use Discourse to handle e-mail for a group, such as an e-mail-based support channel (which is how Discourse’ own e-mail support is handled).

Delivering e-mail directly into your Discourse forum, rather than setting up POP3 polling, has a number of benefits:

- No need to deal with gmail or another provider’s foibles;
- You have more control over the e-mail addresses that people use to send posts; and
- There are no delays in delivery – no more waiting for the next polling run to see new posts appear!

This howto is all about getting that hawtness into _your_ forum.

# Overview

This procedure creates a new container on your Discourse server, alongside the typical `app` container, which receives e-mail and forwards it into Discourse for processing. It supports all e-mail processes: handling bounces, replies, and new topic creation. Any self-hosted Discourse forum using [our supported installation process](https://github.com/discourse/discourse/blob/main/docs/INSTALL-cloud.md) can make use of this procedure to get easy, smooth-flowing incoming e-mail.

# Container Setup

We’re going to get the `mail-receiver` container up and running on the server that’s already running your Discourse instance. There’s no need for a separate droplet just to handle mail – the whole container only takes about 5MB of memory!

So, start off by logging into your Discourse server, and becoming `root` via `sudo`:

```
ssh ubuntu@192.0.2.42
sudo -i

```

Now, go to your `/var/discourse` directory and create a new `mail-receiver.yml` container definition from the sample conveniently provided:

```
cd /var/discourse
git pull
cp samples/mail-receiver.yml containers/

```

Since every site is unique, open `containers/mail-receiver.yml` in your preferred text editor and change the `MAIL_DOMAIN`, `DISCOURSE_BASE_URL`, and `DISCOURSE_API_KEY` variables to suit your site. (If you are an advanced user and know that you are using nginx outside your container, see below for additional configuration for external nginx.)

> 💡 If you use the default mail endpoint (`/admin/email/handle_mail`), we suggest using the `receive_emails` API key scope to provide an extra layer of security.

If you’re not sure what your favourite text editor is, try `nano`:

```
nano containers/mail-receiver.yml

```

Use `Ctrl-X` to exit (say “Yes” to “Do you want to save changes?”, or all your work will be for nothing).

Now, do an initial build of the container, and fire it up!

```
./launcher bootstrap mail-receiver
./launcher start mail-receiver

```

To check everything’s OK, take a peek in the logs:

```
./launcher logs mail-receiver

```

The last line printed should look rather a lot like this:

```
<22>Aug 31 04:14:31 postfix/master[1]: daemon started -- version 3.1.1, configuration /etc/postfix

```

If so, all is well, and you can go on to then next step.

# DNS Setup

In order for everyone else on the Internet to know where to deliver mail, you must create an `MX` record for your forum. The exact details of how to do this vary by DNS provider, but in general, the procedure should be very similar to how you setup the DNS records for your forum in the first place, except that instead of creating an `A` (or “Address”) record, you’re creating an `MX` (or “Mail eXchange”) record. If your forum is at `forum.example.com`, and you set `MAIL_DOMAIN` to `forum.example.com` in the `mail-receiver.yml`, then the DNS record should look like this:

- **DNS Name:** `forum.example.com` (this is the `MAIL_DOMAIN`)
- **Type:** `MX`
- **Priority:** 10
- **Value:** `forum.example.com` (this is the domain of your forum)

To make sure the DNS is setup correctly, use a testing site such as [http://mxtoolbox.com/](http://mxtoolbox.com/) to look up the `MAIL_DOMAIN` you configured, and make sure it’s pointing to where you expect.

Note: outbound email providers like mailgun may ask you to add MX records pointing to their servers. You want to remove these so the MX records for your forum only point to your forum’s domain name. SPF and DKIM records must still point to your outbound email provider servers so you can send email.

# Discourse Configuration

Now e-mail is being fed into Discourse, it’s time to explain to Discourse what to _do_ with the e-mail it receives.

- Log into your Discourse forum as Admin and navigate to the Admin panel’s Site Settings, then click the Email tab. (forum.example.com`/admin/site_settings/category/email`)
- Change the following settings:
  - Enable the `reply by email` setting
  - In the `reply_by_email_address` field, enter `replies+%{reply_key}@forum.example.com`
  - Enable the `manual polling` setting

You can automatically, without any further setup, use _any_ address `@forum.example.com` as an address for category or group e-mails.

# Troubleshooting

Nothing ever goes according to plan. Here’s how to figure out what went wrong.

1. **OCI runtime create failed error running `./launcher start mail-receiver`?** Your hostname might be too long. Rename it [using these instructions](https://www.digitalocean.com/community/questions/how-do-i-change-hostname) and choose a shorter name, then rebuild.
2. **Did the e-mail even make it to `mail-receiver`?** Run `./launcher logs mail-receiver`, and look for log entries that mentions the address that the e-mail was sent from and to. If there’s none of those, then the message never even made it, and the problem is upstream. Check MX records, sending mail server logs, and firewall permissions (SMTP port 25).
3. **Is the message stuck in the queue?** Run `./launcher enter mail-receiver`, then run `mailq`. It _should_ report, “Mail queue is empty”. If there’s any messages in there, you’ll get the to/from addresses listed. Messages only sit around in the queue if there’s a problem delivering to Discourse itself, so `exit` out of the container and then check…
4. **Did `mail-receiver` error out somehow?** Run `./launcher logs mail-receiver | grep receive-mail` and look for anything that looks like a stack trace, or basically anything other than “Recipient: \<something\>@forum.example.com”. Those error messages, whilst not necessarily self-explanatory, should go an awfully long way to explaining what went wrong. Look for typos in your yml file. In particular, check that DISCOURSE\_BASE\_URL matches your site URL, usually starting with `https://`.

# Integrating with External nginx

If you are an advanced user and have configured external nginx such as for [Add an offline page to display when Discourse is rebuilding or starting up](https://meta.discourse.org/t/adding-an-offline-page-when-rebuilding/45238) you will find that the combination of `mail-receiver` and HTTPS being handled in external nginx requires slightly different handling to enable SSL for email over TLS. Here are example `containers/mail-receiver.yml` snippets that work with the recommended configuration for external nginx with letsencrypt certificates:

```
  POSTCONF_smtpd_tls_key_file: /letsencrypt/live/=DOMAIN=/privkey.pem
  POSTCONF_smtpd_tls_cert_file: /letsencrypt/live/=DOMAIN=/fullchain.pem

```

…

```
volumes:
  - volume:
      host: /var/discourse/shared/mail-receiver/postfix-spool
      guest: /var/spool/postfix
# uncomment to support TLS
  - volume:
      host: /etc/letsencrypt/
      guest: /letsencrypt

```

Note that you can’t export as a volume only `/etc/letsencrypt/live` because the actual files are symlinks into `../../archive/...` and those won’t resolve if you are more specific in the volume specification.

# Prevent outgoing host email from interfering (Postfix)

If you have (or want) automated messages from your host server (via Postfix), the mail-receiver will conflict because it needs port 25 to operate. One solution is to disable the host Postfix from listening on port 25:

`nano /etc/postfix/master.cf`

and comment out the line that looks like this:

`smtp inet n - y - - smtpd`

Then `service postfix reload`. You may also need to restart the mail-receiver container.

With both the host Postfix and the mail-receiver running, do `netstat -tulpn | grep :25` to confirm that `docker-proxy` is using port 25.

# Block unwanted domains from sending to you

To stop email from unwanted domains from even reaching your Discourse, your `mail-receiver.yml` should look something like this:

```
  DISCOURSE_API_USERNAME: system

  POSTCONF_smtpd_sender_restrictions: 'texthash:/etc/postfix/shared/sender_access'

volumes:
  - volume:
      host: /var/discourse/shared/mail-receiver/postfix-spool
      guest: /var/spool/postfix
  - volume:
      host: /var/discourse/shared/mail-receiver/etc
      guest: /etc/postfix/shared
# uncomment to support TLS
# - volume:
# host: /var/discourse/shared/standalone/letsencrypt
# guest: /letsencrypt

```

Then create `/var/discourse/shared/mail-receiver/etc` path, and within it create a `sender_access` file containing the domains to reject, like this:

```
qq.com REJECT
163.com REJECT

```

Rebuild and you’re golden!

# DMARC support

DMARC support has been enabled by default in the `discourse/mail-receiver:release` image to more strongly validate incoming email. This is enabled since the timestamped image `discourse/mail-receiver:20240720054629`.

This functionality can be toggled via the `INCLUDE_DMARC` docker environment variable. If a more permissive incoming mail server configuration is preferred, set that environment variable to `false` and rebuild the image.

The last version _without_ DMARC support is `discourse/mail-receiver:20211208001915`.

# Further Reading

- [Customising the Postfix configuration of your `mail-receiver` container](https://meta.discourse.org/t/customising-direct-delivery-postfix-configuration/118759).
- [Filtering known-bad domains from your mail before they even get to Discourse](https://meta.discourse.org/t/filtering-known-bad-sender-domains-from-your-mail-receiver/118760).

> Last edited by @kelv 2024-07-22T03:53:51Z
> 
> > **Check document**
> >
> > Perform check on document:

---

<div class="post-metadata">

### Author: ![JammyDodger](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jammydodger/32/254611_2.png) [@JammyDodger](https://meta.discourse.org/u/JammyDodger)
#### Post date: [30.Октябрь.2023 12:15:09 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/469 "2023-10-30T12:15:09Z")

</div>

7 сообщений были перенесены в новую тему: [Работает ли почтовый получатель на ARM?](https://meta.discourse.org/t/does-the-mail-receiver-work-with-arm/283908)

---

<div class="post-metadata">

### Author: ![fefrei](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/fefrei/32/119538_2.png) [@fefrei](https://meta.discourse.org/u/fefrei)
#### Post date: [08.Ноябрь.2023 14:03:59 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/470 "2023-11-08T14:03:59Z")

</div>

Похоже, этот контейнер кодирует email в параметр с именем `email`:

> <https://github.com/discourse/mail-receiver/blob/08a25ae38f80115dc87fe05359f274210c99ea83/lib/mail_receiver/discourse_mail_receiver.rb#L41C33-L41C33>

Судя по `/logs`, это устарело:

```
Уведомление об устаревании: предупреждение: параметр email устарел. Все POST-запросы к этому маршруту должны отправляться с параметром email_encoded, закодированным в строгом формате base64. Параметр email получен и помещен в очередь на обработку (удаление в Discourse 3.3.0)

```

Не могли бы вы обновить это перед удалением устаревшего параметра? 😇

---

<div class="post-metadata">

### Author: ![jericson](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jericson/32/116215_2.png) [@jericson](https://meta.discourse.org/u/jericson)
#### Post date: [08.Январь.2024 19:36:04 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/471 "2024-01-08T19:36:04Z")

</div>

Несколько заметок по настройке:

- Обязательно защитите новый файл конфигурации контейнера командой: `chmod o-rwx containers/mail-receiver.yml`. Если этого не сделать, система предложит сделать это при запуске контейнера.
- При создании ключа API я выбрал «Все пользователи» и область действия «Глобальная». Не знаю, сработает ли более ограниченный ключ.
- В образце файла mail-receiver.yml настройки TLS сильно отличаются, поэтому лучше воспользоваться инструкциями здесь, а не пытаться редактировать образец.
- В нём также есть настройка `smtpd_tls_security_level`, которую я раскомментировал. Я не проводил исследований, чтобы понять, нужна ли она или лучше использовать другое значение вместо «may».
- Если вы хотите настроить электронную почту для конкретной категории, это можно сделать в `/c/{category-name}/edit/settings`. (Это полезно, если вы хотите создать что-то вроде категории для рассылки.) Для группы адрес электронной почты можно настроить в `/g/{group-name}/manage/interaction`.

Не знаю, поможет ли это кому-то ещё, но мне бы это пригодилось. 😉

---

<div class="post-metadata">

### Author: ![md-misko](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/md-misko/32/126315_2.png) [@md-misko](https://meta.discourse.org/u/md-misko)
#### Post date: [09.Январь.2024 07:10:31 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/472 "2024-01-09T07:10:31Z")

</div>

> [@jericson](#):
>
> При создании ключа API я выбрал «Все пользователи» и область действия «Глобальная». Не знаю, сработает ли более ограниченный ключ.

Вам действительно следует использовать ключ API с минимальными привилегиями. Эти настройки точно работают:

Уровень пользователя: Все пользователи  
Область действия: Детальная  
email—получение писем

---

<div class="post-metadata">

### Author: ![Carleas](https://avatars.discourse-cdn.com/v4/letter/c/57b2e6/32.png) [@Carleas](https://meta.discourse.org/u/Carleas)
#### Post date: [18.Март.2024 18:16:26 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/473 "2024-03-18T18:16:26Z")

</div>

Насколько я могу судить, моя настройка верна, но в Discourse нет записей ни об одном из писем.

Письма отображаются в логе следующим образом:

```plaintext
Mar 18 17:20:41 [myserver]-mail-receiver postfix/smtpd[122]: NOQUEUE: reject: RCPT from [XXX].google.com[XXX.XX.XXX.XXX]: 554 5.7.1 <test004@www.[mysite].com>: Recipient address rejected: Mail to this address is not accepted. Check the address and try to send again?; from=<[sender]@gmail.com> to=<test004@www.[mysite].com> proto=ESMTP helo=<[XXX].google.com>
Mar 18 17:20:42 [myserver]-mail-receiver postfix/smtpd[122]: disconnect from [XXX].google.com[XXX.XX.XXX.XXX] ehlo=2 starttls=1 mail=1 rcpt=0/1 bdat=0/1 quit=1 commands=5/7

```

Кроме того, на отправляющий адрес приходит уведомление об отказе. В очереди ничего не остаётся, а в логах нет никаких следов ошибок. Я трижды проверил, что все URL совпадают, и на странице настроек API видно, что ключ используется. Однако список отклонённых писем в панели администратора остаётся пустым.

Есть какие-нибудь предложения?

---

<div class="post-metadata">

### Author: ![mpalmer](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mpalmer/32/45740_2.png) [@mpalmer](https://meta.discourse.org/u/mpalmer)
#### Post date: [19.Март.2024 05:14:25 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/474 "2024-03-19T05:14:25Z")

</div>

Ошибка указывает на то, что `MAIL_DOMAIN` не установлен в значение `www.[mysite].com`, либо нет категории или группы, настроенной для получения писем, отправленных на `test004@www.[mysite].com`.

---

<div class="post-metadata">

### Author: ![Carleas](https://avatars.discourse-cdn.com/v4/letter/c/57b2e6/32.png) [@Carleas](https://meta.discourse.org/u/Carleas)
#### Post date: [19.Март.2024 13:33:58 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/475 "2024-03-19T13:33:58Z")

</div>

Спасибо за ваш ответ. Я проверил MAIL\_DOMAIN всеми возможными способами, перепробовал все комбинации значений MAIL\_DOMAIN и целевых адресов электронной почты. С каким значением в настройках Discourse он сверяется? Например, DISCOURSE\_HOSTNAME, DISCOURSE\_SMTP\_DOMAIN или что-то ещё?

Я немного запутался из-за вашего второго предложения, учитывая эту строку из оригинального сообщения:

> [@Discourse](#):
>
> Хотя Discourse пока не будет делать с этим ничего _полезного_, отправленное вами письмо должно появиться в панели администратора во вкладке «Emails» → «Rejected» в течение нескольких секунд.

Разве отклонения не должны отображаться ещё до того, как Discourse настроен для работы с ними? Ошибки доставки (bounces) тоже не появляются. Я протестировал это, используя метод, рекомендованный здесь: [Настройка VERP для обработки возвратов писем](https://meta.discourse.org/t/configure-verp-to-handle-bouncing-e-mails/45343). Никаких следов на странице /admin/email.

Есть ли в каком-либо из контейнеров лог, который показывает (или который можно настроить так, чтобы он показывал) больше информации о взаимодействии между `mail-receiver` и `app`?

---

<div class="post-metadata">

### Author: ![Simon\_Manning](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/simon_manning/32/198596_2.png) [@Simon\_Manning](https://meta.discourse.org/u/Simon_Manning)
#### Post date: [19.Март.2024 15:53:24 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/476 "2024-03-19T15:53:24Z")

</div>

> [@Carleas](#):
>
> Разве отклонения не должны отображаться даже до того, как Discourse будет настроен для работы с ними?

Существует два основных типа отклонений: те, которые происходят на раннем этапе и решают, следует ли передавать письмо в EmailReceiver Discourse, и те, которые возникают в процессе обработки почты самим Discourse.

По моему опыту, первые не отображаются в логах Discourse, то есть большинство (если не все) отклонений, связанных с почтой (неудачная проверка DMARC, неверный адрес и т. д.), там не фиксируются. Те, что появляются, — это такие случаи, как слишком короткое письмо, пользователь не имеет права публиковать сообщения и т. д.

Не уверен, изменилось ли что-то с момента написания этого абзаца, но мой опыт за последние ~2,5 года, начиная с момента настройки, был именно таким.

Если я отправляю письмо на `test-reject@[my-instance]`, я получаю общее уведомление об ошибке от своего почтового провайдера (не от mail-receiver / Discourse), сообщающее, что адрес получателя был отклонён. Это происходит потому, что mail-receiver отклоняет письмо во время SMTP-взаимодействия.

> [@Carleas](#):
>
> Уведомления об ошибках доставки тоже не отображаются. Я протестировал метод, рекомендованный здесь: [Настройка VERP для обработки писем с ошибками доставки](https://meta.discourse.org/t/configure-verp-to-handle-bouncing-e-mails/45343).

Уведомления об ошибках доставки и VERP относятся к письмам, которые ваш экземпляр Discourse отправляет, а не получает, например, для автоматической остановки отправки уведомлений на адрес, который постоянно возвращает ошибки доставки. Они не связаны с mail-receiver.

* * *

Мне кажется, что цитата из руководства ввела вас в заблуждение, и на самом деле всё, вероятно, работает правильно. Отправка на `some-random-address@MAIL_DOMAIN` не будет принята и не отобразится в отклонениях, поэтому это не очень полезный тест сам по себе (кроме проверки того, что mail-receiver получает письма, что вы уже подтвердили).

Перейдите в существующую категорию или создайте новую, откройте её конфигурацию и перейдите на вкладку настроек. Внизу вы найдёте параметр `custom incoming email address` (пользовательский адрес входящей почты). Установите его в значение `something@MAIL_DOMAIN`, например, тот же адрес test004, который вы пробовали ранее, сохраните изменения и попробуйте отправить письмо на этот адрес.

Это должно пройти проверку mail-receiver, после чего вы либо увидите новое сообщение в категории, либо отклонение в системе Discourse.

---

<div class="post-metadata">

### Author: ![Carleas](https://avatars.discourse-cdn.com/v4/letter/c/57b2e6/32.png) [@Carleas](https://meta.discourse.org/u/Carleas)
#### Post date: [19.Март.2024 16:51:34 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/477 "2024-03-19T16:51:34Z")

</div>

Спасибо, это очень полезное уточнение. Я настрою и протестирую, чтобы убедиться.

Что касается возвратов, то я снова запутался из-за автора оригинального поста, так как возвраты указаны в самом начале списка причин, по которым стоит следовать этому руководству.

Так что даже с такой настройкой и даже если я удалил MX-записи Mailgun, мне всё равно нужно настроить VERP на их стороне, чтобы перехватывать возвраты и прочее? Ну что ж, я думал, что прямая доставка — это обходной путь для моих проблем с вебхуками Mailgun, похоже, мне придётся снова заняться устранением неполадок.

---

<div class="post-metadata">

### Author: ![Simon\_Manning](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/simon_manning/32/198596_2.png) [@Simon\_Manning](https://meta.discourse.org/u/Simon_Manning)
#### Post date: [19.Март.2024 18:12:19 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/478 "2024-03-19T18:12:19Z")

</div>

> [@Carleas](#):
>
> Что касается отказов, я снова запутался в оригинальном посте, поскольку отказы являются первым пунктом в списке причин, по которым вы можете захотеть следовать этому руководству.

О, извините, вы правы: там сказано, что вы _можете_ использовать mail-receiver для отказов, но я не очень хорошо разбираюсь в том, как это работает.

Мой mail-receiver не получает отказы, но я использую вебхуки Mailgun. Возможно, Mailgun меняет отправителя в конверте, и поэтому отказы приходят, если вебхуки включены. (То есть, если бы вебхуки были отключены, возможно, мои отказы приходили бы в mail-receiver.)

---

<div class="post-metadata">

### Author: ![mpalmer](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mpalmer/32/45740_2.png) [@mpalmer](https://meta.discourse.org/u/mpalmer)
#### Post date: [19.Март.2024 23:20:45 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/479 "2024-03-19T23:20:45Z")

</div>

> [@Michael Corliss](#):
>
> Я немного запутался из-за вашего второго предложения, учитывая эту строку в исходном сообщении

Да, я _почти_ уверен, что это сейчас неточно, поскольку fast-rejection был реализован в… (проверяю `git log`) мае 2017 года.

Без просмотра вашей реальной конфигурации, включая конфигурацию групп/категорий Discourse, очень трудно сказать, что именно идет не так. Хотя по крайней мере в 80% случаев это где-то опечатка; попросите коллегу (не обязательно глубоко технического специалиста) посмотреть на это, и он, скорее всего, заметит, где вы поставили `l` вместо `i`, примерно за пять секунд. Моя жена делает это для меня на регулярной основе.

> [@Michael Corliss](#):
>
> Ну черт, я думал, что direct-delivery — это обходной путь для моих проблем с веб-хуками Mailgun

Это так. При прямом доставке ваш провайдер исходящей почты вообще не должен участвовать в обработке входящей почты. Всё, будь то новая тема, ответ или отскок, должно идти прямо в `mail-receiver` (а оттуда в Discourse для обработки).

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [19.Март.2024 23:24:39 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/480 "2024-03-19T23:24:39Z")

</div>

> [@Matt Palmer](#):
>
> По крайней мере в 80% случаев где-то опечатка,

Я почти уверен, что со мной на прошлой неделе произошло именно это с такой же проблемой. В итоге я скопировал другой файл YML откуда-то ещё, и всё заработало.

Хотя это показалось странным, Мэтт. Я посмотрел в файлы postfix, и они тоже выглядели правильно, но система сообщала, что имя хоста не совпадает. Клянусь, я копировал и вставлял его, но, возможно, я совершил ошибку, подумав, что могу просто ввести его вручную.

---

<div class="post-metadata">

### Author: ![mpalmer](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mpalmer/32/45740_2.png) [@mpalmer](https://meta.discourse.org/u/mpalmer)
#### Post date: [19.Март.2024 23:38:29 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/481 "2024-03-19T23:38:29Z")

</div>

> [@Джей Пфавфман](#):
>
> Я совершил ошибку, подумав, что могу печатать.

Хорошо, что голосовое распознавание ИИ скоро исправит это за нас. :troll:

---

<div class="post-metadata">

### Author: ![Carleas](https://avatars.discourse-cdn.com/v4/letter/c/57b2e6/32.png) [@Carleas](https://meta.discourse.org/u/Carleas)
#### Post date: [20.Март.2024 14:17:19 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/482 "2024-03-20T14:17:19Z")

</div>

> [@Simon\_Manning](#):
>
> Мне кажется, что ваша цитата из руководства ввела вас в заблуждение, и на самом деле всё, вероятно, работает правильно.

Вы были правы: настройка электронной почты для категории и отправка писем туда сработала как ожидалось. Я просто бился головой об стену, потому что отказы происходили молча.

Рад, что теперь я это знаю, и надеюсь, что руководство будет обновлено, хотя лично я бы предпочёл, чтобы всё работало так, как описано в руководстве. Например, если пользователи пытаются отправить письмо на какой-то адрес, и это не удаётся, это могло бы помочь мне либо уведомить их, либо понять, что есть спрос на общение с категорией или группой по электронной почте. Без такой возможности, похоже, нет простого способа увидеть эти письма.

> [@mpalmer](#):
>
> Это так. При прямой доставке ваш провайдер исходящей почты вообще не должен участвовать в входящей почте. Всё — будь то новая тема, ответ или отскок — должно идти напрямую в `mail-receiver` (а оттуда в Discourse для обработки).

Это всё ещё не работает как ожидалось. Я настроил вебхуки, поэтому могу видеть несколько отскоков, но я знаю, что они из вебхуков Mailgun, потому что в них описана проблема: ошибка [“Discourse::NotFound” при нажатии на поле “Тип письма” на admin/email/bounced](https://meta.discourse.org/t/discourse-notfound-error-when-click-email-type-field-on-admin-email-bounced/176011).

Я не совсем понимаю, как Mailgun вообще получает отскоки, поскольку у меня нет MX-записей, указывающих на их серверы. Предполагаю, что они устанавливают путь возврата при отправке исходящего письма?

Я вижу отскоки в логах `mail-receiver`, но они не попадают в `app`. Похоже, они молча отклоняются. Вот строка в логах, которую я могу связать с отскоком, полученным через вебхуки:

> `NOQUEUE: reject: RCPT from mail-[id1].outbound.protection.outlook.com[XX.XX.XX.XX]: 450 4.7.1 <bounce+[id2]-[email]=[address].com@www.[mydomain].com>: Recipient address rejected: Internal error, API request failed; from=<> to=<bounce+[id#]-[email]=[address].com@www.[mydomain].com> proto=ESMTP helo=<[id3].outbound.protection.outlook.com>`

Нужно ли мне добавить bounce+{%something}@www.mydomain.com в качестве белого адреса где-нибудь, чтобы они проходили?

---

<div class="post-metadata">

### Author: ![mpalmer](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mpalmer/32/45740_2.png) [@mpalmer](https://meta.discourse.org/u/mpalmer)
#### Post date: [20.Март.2024 22:09:45 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/483 "2024-03-20T22:09:45Z")

</div>

> [@Carleas](#):
>
> Предполагаю, они указывают обратный путь при отправке исходящего письма?

Да, скорее всего, они переписывают обратный путь (также известный как «envelope from»), когда исходящее письмо проходит через их серверы. Вероятно, где-то есть настройка, позволяющая отключить это, но я не работал с Mailgun, поэтому не могу сказать наверняка (или где именно находится такая настройка).

> [@Carleas](#):
>
> Recipient address rejected: Internal error, API request failed

Хорошо, _это_ ошибка между почтовым получателем и Discourse. В логах незадолго до этого должна появиться строка, начинающаяся с «Failed to GET smtp\_should\_reject answer», которая расскажет подробнее о том, что не удалось и почему. Это также должно соответствовать какому-либо сообщению об ошибке в логах Discourse.

---

<div class="post-metadata">

### Author: ![Carleas](https://avatars.discourse-cdn.com/v4/letter/c/57b2e6/32.png) [@Carleas](https://meta.discourse.org/u/Carleas)
#### Post date: [22.Март.2024 15:11:06 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/486 "2024-03-22T15:11:06Z")

</div>

> `Mar 21 17:02:21 discourse-smtp-fast-rejection[1149]: Не удалось получить ответ smtp_should_reject по адресу https://www.mydomain.com/admin/email/smtp_should_reject.json: 400`

Может ли это быть связано с пустым отправителем, `from=<>`? В логах я ничего об этом не вижу. Означает ли код 400, что файл `smtp_should_reject.json` не существует?

---

<div class="post-metadata">

### Author: ![mpalmer](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mpalmer/32/45740_2.png) [@mpalmer](https://meta.discourse.org/u/mpalmer)
#### Post date: [24.Март.2024 07:16:54 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/487 "2024-03-24T07:16:54Z")

</div>

Если бы этого HTTP-ресурса не существовало, это был бы ответ 404, а не 400. Я не думаю, что отправитель с null-значением должен вызывать проблему, поскольку именно так доставляются все уведомления о недоставке. Неверный ключ API, по-моему, должен возвращать ответ 403, но я не могу утверждать это со стопроцентной уверенностью, поэтому это, вероятно, стоит проверить на всякий случай. Если логи Discourse не дают никаких указаний на то, почему запрос оказался некорректным, боюсь, вам, скорее всего, предстоит мучительная отладка — у меня сейчас нет системы с включённой поддержкой `mail-receiver`, с которой я мог бы легко поэкспериментировать. Боюсь, чтобы докопаться до сути происходящего и исправить это для вас, мне пришлось бы выполнить эту работу как консультант.

---

<div class="post-metadata">

### Author: ![Carleas](https://avatars.discourse-cdn.com/v4/letter/c/57b2e6/32.png) [@Carleas](https://meta.discourse.org/u/Carleas)
#### Post date: [24.Март.2024 20:53:04 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/488 "2024-03-24T20:53:04Z")

</div>

На данный момент это, похоже, ни на что не влияет: отклики работают с вебхуками, и большинство откликов не генерируют письмо (в другой теме упоминался [этот ответ на Stack Overflow](https://stackoverflow.com/questions/18615229/how-can-the-return-path-header-be-different-than-the-actual-email-bounce-recipie/18639157#18639157), что совпадает с тем, что я наблюдаю). Функция «ответ по электронной почте» также работает как положено. Какая бы ошибка ни была, она редка и не нарушает нормальную работу.

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

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [03.Апрель.2024 17:25:55 UTC](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487/489 "2024-04-03T17:25:55Z")

</div>

@JammyDodger Не могли бы вы переименовать это так, чтобы поиск по «mail-receiver» находил эту тему? С тех пор как три года назад из заголовка убрали слово «straightforward», мне почти не удавалось найти эту тему без нескольких попыток.

[Next page](https://meta.discourse.org/t/configure-direct-delivery-incoming-email-for-self-hosted-sites-with-mail-receiver/49487.md?page=2)
