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 и помощь друга предоставили несколько полезных советов), есть два способа (оба, кажется, работают одинаково хорошо):

  1. использование ${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}
    
  2. Использовать 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}";
}

Немного сложно, но в результате вы можете получить оригинального получателя и его псевдонимы.

Другие вопросы по тегам