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