ゴール

ゴール

Bccで[メールアドレス]ユーザー、私たちはないBccリストを受信させたい人は、[メールアドレス]"ユーザー"。

ゴール

  1. postfix を経由して送受信されるすべてのメールをアーカイブしたいと考えています。設定には以下を使用します:
  • 接尾辞、
  • Pam(Ldapから取得)ユーザーによるdovecot認証、
  • メールボックスへの配信Dovecot の LMTP
  1. Bcc 受信者をメッセージ アーカイブに含めるようにします。

  2. 私たちはないBccリストを受信させたい人は、[メールアドレス]"ユーザー"。

トライアル

  1. always_bcc の使用 =[メールアドレス] 動作します。ただし、Bcc 受信者 (権利上、RCPT TO としてエンベロープ内にあり、ヘッダー内にはない) は失われます。

  2. 使用方法: (Postfixメールをアーカイブし、ヘッダー内のBCC情報を保持するにはどのようなオプションがありますか?

main.cf
smtpd_recipient_restrictions =
  check_recipient_access pcre:/etc/postfix/prepend.pcre

pcre 式は次のようになります。

prepend.pcre
/(.+)/          PREPEND X-Envelope-To: $1

それは魔法のように効く: 保存されているメッセージには、To:、Cc、X-Envelope-To というヘッダーがあります。後で詳しく調べる必要がある場合は、Bcc でも誰がメッセージを受信したかがわかります。(注: X-Envelope-To には、To と Cc の人だけでなく、外部ドメインの受信者も含まれます)。

  1. X-Envelope-To を削除するには: 送信する場合:
smtp_header_checks = pcre:/etc/postfix/smtp_header_checks.pcre

内容:

smtp_header_checks.pcre
/^X-Envelope-To:/               IGNORE

そこまでは大丈夫です。

問題

サーバーから送信されない電子メールの X-Envelope-To を削除するには、次の操作を実行しました。

lmtp_header_checks = pcre:/etc/postfix/lmtp_header_checks.pcre

lmtp_header_checks.pcre
/^X-Envelope-To:/               IGNORE

しかし、これは選択的なものではなく、[メールアドレス]Bcc リストに「保存」されたヘッダーが失われます。

行自体のみを評価し、受信者を使用して条件を作成することはできないため (pcre の「if」を使用しても)、ヘッダー チェックを選択的に実行する方法を見つけることができません。http://www.postfix.org/pcre_table.5.html

使用できる変数はありますか? 考えられるのは、「[メールアドレス]" を X-Envelope-To ヘッダーの先頭に追加するには、lmtp_header_checks.pcre に次のような内容を含めます。[メールアドレス]$LMTP_DELIVERY_RECIPIENT と等しくない場合、Delivered-To または X-Delivered-To は、pcre が変数として評価できない別のヘッダーのままになります。

それ以外の場合、lmtp で milter をトリガーする方法はありますか? また、そのために使用できる単純な lmtp_milter フィルターはありますか?

可能な限りすべてのドキュメントを何日も追いかけてきました。よろしくお願いします

答え1

ああ、そうなんです!本当にありがとうございます。

sieve 言語では複数のX-Envelope-Toヘッダーの反復処理は許可されません。そのため、外部プログラムに渡す必要があります。

私が思いついたのは次のようなものです:

require "fileinto";
require "imap4flags";
require ["editheader", "envelope"];
require "vnd.dovecot.filter";
if header :contains "X-Spam-Flag" "YES"
{
   fileinto "Junk";
   stop;
}
if envelope :is "to" "[email protected]" {
   filter "EnvelopeToBcc.sh";
} else {
   deleteheader "X-Envelope-To";
}
#!/bin/bash
# Store mail in a variable
# input stream
mail=`cat /dev/stdin`
# Extract headers
envelope=$(echo "$mail" | formail -x X-Envelope-To | tr -d '\015')
tos=$(echo "$mail" | formail -x To  | tr -d '\015')
copies=$(echo "$mail" | formail -x Cc  | tr -d '\015')

# Loop excluding the To: fields and concatenate in variable
bcc=""
for i in $envelope; do
        if [[ ${tos} != *"${i}"* && ${copies} != *"${i}"* ]];then
                bcc="${bcc} ${i},"
        fi
done
# Eliminate trailing comma
bcc=$(echo $bcc | sed s/,$//)
# Add Bcc header to mail 
echo "${mail}" | formail -a "Bcc: $bcc"

任意の MUA でアーカイブを開くと、bcc が再構築されていることがわかります。注意: スクリプトは少し長くなりますが、Bcc リスト内の宛先の人々の重複を回避します。

答え2

Sieve 言語を使用します。

メールは LMTP 経由で Dovecot に配信されるため、単純な Postfix ヘッダー チェックで提供されるものよりも複雑なロジック機能をすべて備えた、すべてのアドレス指定およびヘッダー編集機能がそこに提供されます。

Pigeonhole sieve をまだ使用していない場合は、Dovecot プラグインとして有効にし、スクリプトで必要な拡張機能を有効にして、適切なスクリプトを構成する必要がある場合があります。

# step1 enable sieve (append to $mail_plugins to *add*)
protocol lmtp {
  mail_plugins = $mail_plugins sieve
}
# step2 enable sieve extensions, as required (prefix with + to *add*)
plugin {
    sieve_extensions = +editheader
}
# step3 configure the path a of a script to be executed

次に、グローバルに実行されるスクリプト、またはエンベロープ アドレスを表示しないユーザー専用に実行されるスクリプトで、アーカイブ メールボックスに配信しない限り、ヘッダーを削除します。

require ["editheader", "envelope"];
if not envelope :is "to" "[email protected]" {
    deleteheader "X-Envelope-To";
}

関連情報