У меня есть postfix + dovecot с spamassassin, выполняющим некоторую фильтрацию контента на стороне postfix. Проблема в том, что в недавнем обновлении изначально доступный двоичный файл sendmail был заменен двоичным файлом sendmail.postfix. Что, похоже, по-другому работает с информацией о получателе.
Вот некоторая информация о конфигурации:
master.cf
<external ip>:submission inet n - - - - smtpd
-o content_filter=spamassassin
-o cleanup_service_name=pre-cleanup
127.0.0.1:smtp inet n - - - - smtpd
[...]
spamassassin unix - n n - - pipe
flags=Rq user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
И слегка анонимный вывод журнала, который показывает настоящую проблему:
Feb 7 02:47:04 comu postfix/smtpd[25393]: connect from unknown[<my ip>]
Feb 7 02:47:04 comu postfix/cleanup[25398]: C0A192C5816B: message-id=<20130207014704.C0A192C5816B@smtp.domain>
Feb 7 02:47:04 comu postfix/qmgr[25384]: C0A192C5816B: from=<postmaster@domain>, size=259, nrcpt=1 (queue active)
Feb 7 02:47:04 comu dovecot: lmtp(25400): Connect from local
Feb 7 02:47:04 comu dovecot: auth: mysql: Connected to 127.0.0.1 (postfix)
Feb 7 02:47:04 comu dovecot: lmtp(25400): Disconnect from local: Client quit
Feb 7 02:47:04 comu postfix/lmtp[25399]: C0A192C5816B: to=<postmaster@domain>, orig_to=<admin@domain>, relay=smtp.domain[private/dovecot-lmtp], delay=0.04, delays=0.01/0.01/0/0.02, dsn=2.1.5, status=deliverable (250 2.1.5 OK)
Feb 7 02:47:04 comu postfix/qmgr[25384]: C0A192C5816B: removed
Feb 7 02:47:07 comu postfix/smtpd[25393]: C6E932C5816B: client=unknown[<my ip>]
Feb 7 02:47:07 comu postfix/cleanup[25403]: C6E932C5816B: message-id=<201302070147.r171l1Ok020056@silverline.local>
Feb 7 02:47:07 comu postfix/qmgr[25384]: C6E932C5816B: from=<lhw@silverline.local>, size=697, nrcpt=1 (queue active)
Feb 7 02:47:07 comu postfix/smtpd[25393]: disconnect from unknown[<my ip>]
Feb 7 02:47:08 comu postfix/pipe[25404]: C6E932C5816B: to=<admin@domain>, relay=spamassassin, delay=3.5, delays=3.2/0.02/0/0.34, dsn=2.0.0, status=sent (delivered via spamassassin service)
Feb 7 02:47:08 comu postfix/pickup[25383]: 3F49C2C58395: uid=505 from=<lhw@silverline.local>
Feb 7 02:47:08 comu postfix/qmgr[25384]: C6E932C5816B: removed
Feb 7 02:47:08 comu postfix/cleanup[25403]: 3F49C2C58395: message-id=<201302070147.r171l1Ok020056@silverline.local>
Feb 7 02:47:08 comu postfix/qmgr[25384]: 3F49C2C58395: from=<lhw@silverline.local>, size=1340, nrcpt=1 (queue active)
Feb 7 02:47:08 comu dovecot: lmtp(25400): Connect from local
Feb 7 02:47:08 comu postfix/lmtp[25399]: 3F49C2C58395: to=<admin@domain>, relay=smtp.domain[private/dovecot-lmtp], delay=0.08, delays=0.06/0/0/0.01, dsn=5.1.1, status=bounced (host smtp.domain[private/dovecot-lmtp] said: 550 5.1.1 <admin@domain> User doesn't exist: admin@domain (in reply to RCPT TO command))
Feb 7 02:47:08 comu dovecot: lmtp(25400): Disconnect from local: Client quit
Feb 7 02:47:08 comu postfix/cleanup[25398]: 45B2F2C5816C: message-id=<20130207014708.45B2F2C5816C@smtp.domain>
Feb 7 02:47:08 comu postfix/qmgr[25384]: 45B2F2C5816C: from=<>, size=3192, nrcpt=1 (queue active)
Feb 7 02:47:08 comu postfix/bounce[25408]: 3F49C2C58395: sender non-delivery notification: 45B2F2C5816C
Feb 7 02:47:08 comu postfix/qmgr[25384]: 3F49C2C58395: removed
Feb 7 02:47:08 comu postfix/smtp[25390]: 45B2F2C5816C: to=<lhw@silverline.local>, relay=none, delay=0.13, delays=0.01/0/0.12/0, dsn=5.4.4, status=bounced (Host or domain name not found. Name service error for name=silverline.local type=AAAA: Host not found)
Feb 7 02:47:08 comu postfix/qmgr[25384]: 45B2F2C5816C: removed
Когда сообщение электронной почты получено впервые, исходный получатель (postmaster @ domain) разрешается к фактическому получателю (admin @ domain), а существование этого пользователя проверяется с помощью dovecot. Что нормально и возвращает успех. Затем электронная почта отправляется через фильтр содержимого, который запрашивает электронную почту с постфиксом через локальный порт. Но вместо использования фактического получателя теперь снова используется исходный получатель, которого, конечно же, нет в базе данных dovecot.
Эта ошибка не возникла с исходным двоичным файлом sendmail, который, вероятно, был из проекта sendmail. Я пробовал различные флаги с конвейером в master.cf без каких-либо положительных результатов. Буду очень признателен за вашу помощь.
Я думаю проблема в том что нормально cleanup
демон не запускается после того, как почта возвращается вашим фильтром. предварительная очистка обычно не выполняет перезапись адресов и виртуальное алиасинг.
Проверьте, есть ли у вас -o cleanup_service_name=pre-cleanup
на прослушивателе SMTP, который получает отфильтрованные сообщения от фильтра содержимого (обычно 10026 :), и если да, удалите его.