Я создаю небольшую систему билетов, в которой в основном некоторые учетные записи электронной почты моего почтового сервера передаются по конвейеру в 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 = нет потока почты. Вы можете просмотреть несколько советов по этому поводу в эта тема.