使用 X-Envelope-To 保留 Bcc 的 Postfix 存檔 - 使用 Lmtp 清理機密 X-Envelope-To
密送archive@domain.tld 使用者,我們不希望人們收到該密送列表,除了archive@domain.tld“使用者”。
目標
- 我們希望歸檔所有通過 postfix 發送和接收的郵件。該設置使用:
- 後綴,
- 使用 Pam(從 Ldap 提取)使用者進行 dovecot 身份驗證,
- 並通過Dovecot 的 LMTP發送到郵箱。
- 我們希望在郵件存檔中包含密件抄送收件人。
- 除了archive@domain.tld“使用者”之外,我們不希望人們收到該密件抄送列表。
審判
- 使用 always_bcc = archive@domain.tld 有效。但是密件抄送收件人(根據權利在信封中作為 RCPT TO 而不是在標題中)會失去。
- 使用:(根據有哪些選項可以存檔 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 包括收件人和抄送人員,以及外部域收件人)。
- 消除 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 打開存檔,您可以看到重新建構的密件抄送。注意:腳本稍長一些,但它避免了密件抄送列表中的收件人重複。