Postfix

使用 X-Envelope-To 保留 Bcc 的 Postfix 存檔 - 使用 Lmtp 清理機密 X-Envelope-To

  • September 23, 2021

密送archive@domain.tld 使用者,我們希望人們收到該密送列表,除了archive@domain.tld“使用者”。

目標

  1. 我們希望歸檔所有通過 postfix 發送和接收的郵件。該設置使用:
  • 後綴,
  • 使用 Pam(從 Ldap 提取)使用者進行 dovecot 身份驗證,
  • 並通過Dovecot 的 LMTP發送到郵箱。
  1. 我們希望在郵件存檔中包含密件抄送收件人。
  2. 除了archive@domain.tld“使用者”之外,我們不希望人們收到該密件抄送列表。

審判

  1. 使用 always_bcc = archive@domain.tld 有效。但是密件抄送收件人(根據權利在信封中作為 RCPT TO 而不是在標題中)會失去。
  2. 使用:(根據有哪些選項可以存檔 Postfix 電子郵件並在標題中保留任何密件抄送資訊
main.cf
smtpd_recipient_restrictions =
 check_recipient_access pcre:/etc/postfix/prepend.pcre

而 pcre 表達式是:

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

這就像一個魅力:我儲存的消息有標題 To:; 抄送; X 信封至。如果我們需要深入研究它,即使在密件抄送中,我們也可以知道誰收到了該消息。(注意:X-Envelope-To 包括收件人和抄送人員,以及外部域收件人)。

  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

但這不是選擇性的,甚至 archive@domain.tld 也會失去“保存”密件抄送列表的標題。

我找不到該標題檢查選擇性的方法,因為它只評估行本身並且不能使用收件人來製定條件(即使使用 pcre 的“if”)。 ( http://www.postfix.org/pcre_table.5.html )

有沒有可以使用的變數?一個想法是:在附加的 X-Envelope-To 標頭中包含“archive@domain.tld”,在 lmtp_header_checks.pcre 中包含以下內容:archive@domain.tld 不等於 $LMTP_DELIVERY_RECIPIENT Delivered-To 或 X-Delivered - 保留一個單獨的標題,pcre 無法將其評估為變數。

否則有沒有辦法讓 lmtp 觸發一些 milter ?我可以使用一個簡單的 lmtp_milter 過濾器嗎?

在所有可能的文件中追逐了幾天,在此先感謝

哦是的 !非常感謝。

篩子語言不允許對多個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" "archive@bogo.ovh" {
  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 打開存檔,您可以看到重新建構的密件抄送。注意:腳本稍長一些,但它避免了密件抄送列表中的收件人重複。

引用自:https://serverfault.com/questions/1077995