Postfix (виртуальные пользователи) + dovecot + sieve: конверт не содержит исходного получателя
Я настроил свой почтовый сервер в соответствии с руководством по ISPMail для виртуальных пользователей в postfix + dovecot + sieve. Моя проблема: envelop
"переменная" в сите не содержит исходного получателя.
У меня есть почтовый аккаунт, давайте назовем его mail@example.org
и дополнительные псевдонимы, настроенные для postfix, которые все доставляют по вышеуказанному адресу:
name@example.org -> mail@example.org
@domain.com -> mail@example.org
Последний является универсальным адресом.
Postfix вызывает dovecot со следующей строкой конфигурации в master.cfg
:
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${user}@${nexthop} -a ${recipient}
С помощью sieve я хочу поместить все письма, полученные на общий адрес, в определенную папку. Мой сито-код выглядит так:
if envelope :is :domain "To" "domain.com" {
fileinto "special-folder";
}
Это, к сожалению, не работает. Копая дальше я узнал, что внутри envelop
всегда конечный адрес доставки, т.е. mail@example.org
в этом случае. Я нашел это, используя следующее правило:
if envelope :matches "To" "*" {
fileinto "${1}";
}
И журнал сито говорит мне:
failed to store into mailbox 'mail@example.org': Mailbox doesn't exist: mail@example.org.
Я уже догадываюсь, что это должно быть проблемой где-то между postfix и dovecot, поскольку почтовый журнал говорит мне следующее:
Aug 29 10:38:27 *** dovecot: lda(mail@example.org): sieve: msgid=<54003C01.1080704@***>: stored mail into mailbox 'INBOX'
Aug 29 10:38:27 *** dovecot: lda(mail@example.org): Error: sieve: execution of script /var/vmail/example.org/mail/dovecot.sieve failed, but implicit keep was successful (user logfile /var/vmail/example.org/mail/dovecot.sieve.log may reveal additional details)
Aug 29 10:38:27 *** postfix/pipe[12469]: A31A28006B: to=<mail@example.org>, orig_to=<test@domain.com>, relay=dovecot, delay=0.29, delays=0.18/0.01/0/0.1, dsn=2.0.0, status=sent (delivered via dovecot service)
Очевидно, что в postfix указывается исходный получатель (test@domain.com) и почтовый ящик, доставленный по адресу (mail@example.org), но каким-то образом эта информация теряется на пути к dovecot?!
2 ответа
После некоторого тестирования ( ответ от masegaloeh и помощь друга предоставили несколько полезных советов), есть два способа (оба, кажется, работают одинаково хорошо):
использование
${original_recipient}
вместо${recipient}
:Как man pipe говорит нам: "Этот макрос раскрывается до полного адреса получателя перед перезаписью или псевдонимом любого адреса", так что это решение моей проблемы. Таким образом, измененная командная строка в
master.cf
должен выглядеть такdovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${user}@${nexthop} -a ${original_recipient}
Использовать
X-Original-To
заголовок скажите dovecot, чтобы установить его конверт в это поле заголовка:Как предложил масегалоэ я добавлю
O
на флаги, говорящие постфикс, чтобы добавитьX-Original-To
заголовок. внутри/etc/dovecot/conf.d/15-lda.conf
Я говорю dovecot использовать этот заголовок для конверта:lda_original_recipient_header = X-Original-To
Как сказано в комментариях над параметрами конфигурации, мы не должны использовать
-a
опция при звонкеdovecot-lda
через postfix, потому что он переопределяет этот параметр. Таким образомmaster.cf
похоже:dovecot unix - n n - - pipe flags=DORhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${user}@${nexthop}
Такое поведение произошло, потому что вы добавляете {recipient}
макрос в dovecot-lda
аргумент. Как указано в man pipe, постфикс заменит этот макрос конечным получателем (mail.example.org) вместо не оригинальных (test@domain.com).
Вместо разбора конверта вы можете разбирать другой заголовок, например X-Original-To. Этот заголовок предназначен для сохранения исходного получателя перед перезаписью или псевдонимами. Чтобы включить этот заголовок, отредактируйте master.cf
поэтому строка dovecot становится (обратите внимание, что аргумент флага был отредактирован)
dovecot unix - n n - - pipe
flags=DROhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${user}@${nexthop} -a ${recipient}
Тогда твой ситовый скрипт станет
if header :matches "X-Original-To" "*" {
fileinto "${1}";
}
Немного сложно, но в результате вы можете получить оригинального получателя и его псевдонимы.