
密件副本[電子郵件受保護]用戶,我們做不是希望人們收到密件抄送列表,除了[電子郵件受保護]「用戶」。
目標
- 我們想要歸檔所有透過 postfix、發送和接收的郵件。該設定使用:
- 後綴,
- 使用 Pam(從 Ldap 拉取)用戶進行 dovecot 身份驗證,
- 並透過以下方式發送到郵箱多維考特的LMTP。
我們希望將密件抄送收件者包含在郵件存檔中。
我們的確是不是希望人們收到密件抄送列表,除了[電子郵件受保護]「用戶」。
審判
使用always_bcc =[電子郵件受保護] 作品。但是密件副本收件者(根據權利位於 RCPT TO 信封中,而不是在標頭中)會遺失。
main.cf
smtpd_recipient_restrictions =
check_recipient_access pcre:/etc/postfix/prepend.pcre
而 PCRE 表達式為:
prepend.pcre
/(.+)/ PREPEND X-Envelope-To: $1
這就像一個魅力:我儲存的訊息的標題為:;抄送; 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
但這不是選擇性的,甚至[電子郵件受保護]遺失「儲存」在密件副本清單中的標頭。
我無法找到一種方法來選擇性地進行該標頭檢查,因為它只評估行本身,並且無法使用收件人來製定條件(即使使用 PCRE 的“if”)。 (http://www.postfix.org/pcre_table.5.html)
有沒有可以使用的變數?一個想法是:包括“[電子郵件受保護]" 在 lmtp_header_checks.pcre 中的 X-Envelope-To 標頭中,包括類似以下內容:[電子郵件受保護]不等於 $LMTP_DELIVERY_RECIPIENT Delivered-To 或 X-Delivered-To 仍是 pcre 無法將其評估為變數的單獨標頭。
否則有沒有辦法讓 lmtp 觸發一些 milter ?我可以使用一個簡單的 lmtp_milter 過濾器嗎?
已經在所有可能的文件中尋找了好幾天,提前致謝
答案1
哦是的 !非常感謝。
篩子語言不允許迭代多個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 開啟存檔,您可以看到重建的密件副本。注意:腳本有點長,但它避免了密件副本清單中「收件者」的重複。
答案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";
}