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

Постфикс: конвейер для отказов скрипта, отправленных конкретному виртуальному пользователю

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

Сервер работает, я могу без проблем отправлять электронную почту по SMTP, я также могу получать их на виртуальные почтовые ящики пользователей и получать к ним доступ по IMAP.

Однако есть проблема, я использую это правило для отправки писем:

smtpd_recipient_restrictions = check_recipient_access mysql:/etc/postfix/mysql-virtual-recipient-access.cf, permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination

В основном SQL-запрос, на который ссылается /etc/postfix/mysql-virtual-recipient-access.cf возвращает следующее каждый раз, когда предполагается передать определенный почтовый ящик в PHP:

FILTER ticket:dummy

И затем я определил крючок в master.cf как это:

ticket unix - n n - - pipe
    flags=F user=www-data argv=/webroot/tiketman/AppCore/Mail/Incoming.php ${sender} ${size} ${recipient}

Эта настройка отлично работает, если я отправляю и отправляю электронную почту с адреса внутри или за пределами моего сервера, однако отскакивает, как Mail Delivery Notifications возник на моем сервере, например

<error@sfasdadf.com>: Host or domain name not found. Name service error for
    name=sfasdadf.com type=A: Host not found

Не фильтруются и не передаются по конвейеру PHP, попадая в почтовый ящик пользователя.

Вот это /var/log/mail.log при отправке тестового электронного письма и получении сообщения об ошибке:

Sep 19 23:09:11 mail postfix/smtp[8773]: 764E2409DF: to=<email@sfasdadf.com>, relay=none, delay=0.14, delays=0.11/0.01/0.02/0, dsn=5.4.4, status=bounced (Host or domain name not found. Name service error for name=sfasdadf.com type=A: Host not found)
Sep 19 23:09:11 mail postfix/cleanup[8771]: 970D2409E1: message-id=<20140919210911.970D2409E1@mail.ptdyncs.com>
Sep 19 23:09:11 mail postfix/bounce[8774]: 764E2409DF: sender non-delivery notification: 970D2409E1
Sep 19 23:09:11 mail postfix/qmgr[8638]: 970D2409E1: from=<>, size=3583, nrcpt=1 (queue active)
Sep 19 23:09:11 mail postfix/qmgr[8638]: 764E2409DF: removed
Sep 19 23:09:11 mail dovecot: lmtp(8777): Connect from local
Sep 19 23:09:11 mail dovecot: lmtp(8777, test-1@ptdyncs.com): FXZGJnebHFRJIgAAvu7YNA: msgid=<20140919210911.970D2409E1@mail.ptdyncs.com>: saved mail to INBOX
Sep 19 23:09:11 mail postfix/lmtp[8776]: 970D2409E1: to=<test-1@ptdyncs.com>, relay=mail.ptdyncs.com[private/dovecot-lmtp], delay=0.04, delays=0.01/0.01/0.01/0.02, dsn=2.0.0, status=sent (250 2.0.0 <test-1@ptdyncs.com> FXZGJnebHFRJIgAAvu7YNA Saved)
Sep 19 23:09:11 mail dovecot: lmtp(8777): Disconnect from local: Client quit (in reset)
Sep 19 23:09:11 mail postfix/qmgr[8638]: 970D2409E1: removed

Как я могу это исправить, не сильно меняя архитектуру этой штуки, потому что мне нужно иметь возможность установить ловушку, которая будет обрабатывать сообщения (или ничего) в SQL для каждого виртуального пользователя. Спасибо.

Ага, это предполагаемое поведение. Ваш отскок не проходит check_recipient_access так как smtpd директива и из вашего журнала, электронное письмо о недоставке никогда не касается smtpd вообще (отказов -> qmgr -> lmtp)


Одно из возможных решений вашей проблемы - использовать transport_maps вместо того check_recipient_access. Эта директива была вызвана trivial-rewrite процесс, и вся электронная почта должна проходить этот специальный процесс, независимо от того, подпрыгивать, smtpd или подбирать. У этого метода есть некоторые предостережения, которые будут описаны ниже.

Чтобы этот метод работал, вы должны изменить SQL-запрос, чтобы он возвращал

ticket:dummy

вместо того

FILTER ticket:dummy

для вашего специального пользователя.

Предостережения этого метода в том, что ваш mysqld НЕ ДОЛЖЕН быть недоступен вообще. SQL server dead = нет потока почты. Вы можете просмотреть несколько советов по этому поводу в эта тема.