Postfix: отсылка к скрипту, отправленная конкретному виртуальному пользователю
Я создаю небольшую систему тикетов, где в основном некоторые почтовые учетные записи моего почтового сервера передаются по сценарию 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 для каждого виртуального пользователя. Спасибо.
1 ответ
Да, это намеренное поведение. Ваш отскок не проходит check_recipient_access
потому что директива smtpd и из вашего журнала, отказов электронной почты никогда не трогать smtpd (bounce -> qmgr -> lmtp)
Одним из возможных решений вашей проблемы является использование transport_maps
вместо check_recipient_access
, Эта директива была применена trivial-rewrite
process и вся электронная почта должна пройти этот специальный процесс, будь то электронная почта bounce, smtpd или pickup. Этот метод имеет некоторые оговорки, как объяснено позже.
Чтобы этот метод заработал, вы должны изменить запрос SQL, чтобы он возвращал
ticket:dummy
вместо
FILTER ticket:dummy
для вашего специального пользователя.
Предостережения этого метода - ваш mysqld НЕ ДОЛЖЕН быть вообще недоступным. SQL-сервер мертв = нет почтового потока. Вы можете просмотреть некоторые советы по этому вопросу в этой теме.