Я настроил свой почтовый сервер после Руководство по 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), но каким-то образом эта информация теряется на пути к голубятне ?!
После некоторого тестирования ( ответ от masegaloeh и помощь друга предоставила несколько полезных советов) есть два способа (оба работают одинаково хорошо):
Использовать ${original_recipient}
вместо того ${recipient}
:
Так как мужская труба говорит нам "Этот макрос расширяется до полного адреса получателя перед любой перезаписью адреса или псевдонимом."так что это решение моей проблемы. Итак, измененная командная строка в 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
header указывает dovecot установить конверт в это поле заголовка:
Как предложил masegaloeh, я добавляю O
к флагам, сообщающим постфиксу о добавлении X-Original-To
заголовок. Внутри /etc/dovecot/conf.d/15-lda.conf
Я говорю dovecot использовать этот заголовок для своего конверта:
lda_original_recipient_header = X-Original-To
Как сказано в комментарии выше к этим параметрам конфигурации, мы не должны использовать -a
опция при звонке dovecot-lda
через постфикс, потому что он переопределяет этот параметр. Таким образом 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
аргумент. Как указано в мужская труба, постфикс заменит этот макрос конечным получателем (mail.example.org), а не исходным (test@domain.com).
Вместо анализа конверта вы можете анализировать другой заголовок, например X-Original-To. Этот заголовок предназначен для сохранения первоначального получателя перед перезаписью или псевдонимом. Чтобы включить этот заголовок, отредактируйте master.cf
так что линия голубятни станет (обратите внимание, что аргумент флага был отредактирован)
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}";
}
Немного сложно, но в результате у вас может быть оригинальный получатель и его псевдонимы.