目標

目標

密件副本[電子郵件受保護]用戶,我們做不是希望人們收到密件抄送列表,除了[電子郵件受保護]「用戶」。

目標

  1. 我們想要歸檔所有透過 postfix、發送和接收的郵件。該設定使用:
  • 後綴,
  • 使用 Pam(從 Ldap 拉取)用戶進行 dovecot 身份驗證,
  • 並透過以下方式發送到郵箱多維考特的LMTP
  1. 我們希望將密件抄送收件者包含在郵件存檔中。

  2. 我們的確是不是希望人們收到密件抄送列表,除了[電子郵件受保護]「用戶」。

審判

  1. 使用always_bcc =[電子郵件受保護] 作品。但是密件副本收件者(根據權利位於 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

這就像一個魅力:我儲存的訊息的標題為:;抄送; 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

但這不是選擇性的,甚至[電子郵件受保護]遺失「儲存」在密件副本清單中的標頭。

我無法找到一種方法來選擇性地進行該標頭檢查,因為它只評估行本身,並且無法使用收件人來製定條件(即使使用 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";
}

相關內容