Назад | Перейти на главную страницу

Почему postfix доставил уведомление о недоставке в локальный файл спула, когда доставка этому пользователю была отключена?

Моя конфигурация постфикса позволяет отправлять почту через несколько local_recipient_maps. Однако доставка в "proxy: unix: passwd.byname" специально отключен. Обычно это предотвращает доставку локальным пользователям unix:

$ getent passwd | grep www-data
www-data:x:33:33:www-data:/var/www:/bin/sh
$ nc localhost 25
220 my.mail.host ESMTP Postfix
helo localhost
250 my.mail.host
mail from:www-data@my.mail.host
250 2.1.0 Ok
rcpt to:www-data@my.mail.host
550 5.1.1 <www-data@my.mail.host>: Recipient address rejected: User unknown in local recipient table
rcpt to:www-data
550 5.1.1 <www-data>: Recipient address rejected: User unknown in local recipient table

Однако сегодня утром я заметил электронное письмо, доставленное в локальный файл спула электронной почты www-data. Заглянув внутрь, я вижу, что:

Итак, мой вопрос: почему это произошло, и как я могу предотвратить это в будущем?

Предположение

Ты сказал

доставка в "proxy: unix: passwd.byname" специально отключена. Обычно это предотвращает доставку локальным пользователям unix.

Итак, я могу предположить, что вы удаляете части proxy: unix: passwd.byname из local_recipient_maps. По умолчанию значение этого параметра равно

# postconf -d local_recipient_maps
local_recipient_maps = proxy:unix:passwd.byname $alias_maps

И вы меняете его на

# postconf local_recipient_maps
local_recipient_maps = $alias_maps

Анализ

Так почему же он отклоняет обычную почту, но при этом сообщения о недоставке все еще проходят?

Чтобы ответить на него, нам нужно увидеть общую картину Обзор архитектуры Postfix, особенно когда postfix получает электронную почту

                            trivial-
                           rewrite(8)
Network ->  smtpd(8)           |  ^    
                       \       v  |
Network ->  qmqpd(8)    ->  cleanup(8)  ->  incoming
                       /
            pickup(8)   <-  maildrop
                                ^
                                |
Local   ->  sendmail(1) ->  postdrop(1)

Postfix только справляется local_recipient_maps когда он проверил электронную почту, полученную через smtpd. Зачем? Поскольку проверки выполнялись, когда параметр smtpd_reject_unlisted_recipient значение "да" или вы устанавливаете reject_unlisted_recipient в ограничениях smtpd _ * _ (обратите внимание на слово smtpd в имени обоих параметров). Видеть человек postconf для получения подробной информации о параметре. Эта проверка включена по умолчанию. Это объясняет, почему ваше тестовое письмо отклонено постфиксом.

Отказов это особый адрес электронной почты в постфиксной архитектуре. Он генерируется внутренне с помощью postfix, чтобы сообщить отправителю отчет о (не) доставке. Течет через postfix прямо на очистку, минуя smtpd. Так вот почему www-data по-прежнему получать письмо о недоставке.

Решение

Вместо того, чтобы отклонить его, вы можете отправить его в черную дыру с помощью mailbox_transport_maps и отбросить служба.

Для этого установите mailbox_transport_maps

#main.cf
mailbox_transport_maps = hash:/etc/postfix/wwwdata-blackhole

#/etc/postfix/wwwdata-blackhole
www-data   discard:silently

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