web-dev-qa-db-ja.com

Postfix(仮想ユーザー)+ dovecot + sieve:エンベロープに元の受信者が含まれていません

ISPMailチュートリアル に従ってメールサーバーをセットアップしました。仮想ユーザーはpostfix + dovecot + sieveです。私の問題は、ふるいのenvelop「変数」に元の受信者が含まれていないことです。


私はメールアカウントを持っています。それを[email protected]と呼び、postfix用に設定された追加のエイリアスをすべて前述のアドレスに配信します。

[email protected] -> [email protected]
@domain.com -> [email protected]

後者はキャッチオールアドレスです。

Postfixは、master.cfgの次の設定行を使用してdovecotを呼び出します。

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の中には常に最終的な配送先住所、つまりこの場合は[email protected]が含まれていることがわかりました。私は次のルールを使用してこれを見つけました:

if envelope :matches "To" "*" {
  fileinto "${1}";
}

そして私に言っているふるいログ:

failed to store into mailbox '[email protected]': Mailbox doesn't exist: [email protected].

メールログに次のように書かれているので、これはpostfixとdovecotの間のどこかで問題になるはずだと私はすでに推測しています。

Aug 29 10:38:27 *** dovecot: lda([email protected]): sieve: msgid=<54003C01.1080704@***>: stored mail into mailbox 'INBOX'
Aug 29 10:38:27 *** dovecot: lda([email protected]): 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=<[email protected]>, orig_to=<[email protected]>, relay=dovecot, delay=0.29, delays=0.18/0.01/0/0.1, dsn=2.0.0, status=sent (delivered via dovecot service)

明らかに、接尾辞には元の受信者([email protected])と配信されたメールボックス([email protected])が記載されていますが、どういうわけかこの情報はdovecotに向かう途中で失われますか?!

2
Artemis

いくつかのテスト( masegaloehによる回答 と友人の助けがいくつかの有用なヒントを提供した)の後、2つの方法があります(どちらも同じようにうまくいくようです):

  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ヘッダーを使用して、エンベロープをこのヘッダーフィールドに設定します。

    Masegaloehが提案したように、フラグにOを追加して、postfixに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}
    
3
Artemis

この動作は、{recipient}引数にdovecot-ldaマクロを追加したために発生しました。 man pipe で述べられているように、接尾辞はそのマクロを元の受信者([email protected])ではなく最終的な受信者(mail.example.org)に置き換えます。


エンベロープを解析する代わりに、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}";
}

少し複雑ですが、結果として、元の受信者とそのエイリアスを持つことができます。

3
masegaloeh