免責聲明:我已經在這裡和其他地方閱讀了一些涉及 Sendmail 重寫標頭的問題和文章。我還沒有找到下面問題的答案,因為另一個問題主要與重寫標頭(而不是添加它們),幾乎所有標頭都與出站訊息和信封寄件人(而不是信封收件人)。
話雖如此:
我正在 Debian jessie 下使用 Sendmail 8.14.4 運行郵件伺服器。
有一些電子郵件收件者地址會對應到同一作業系統使用者帳戶。當相應的作業系統使用者讀取訊息時,他無法確定訊息最初發送到哪個電子郵件地址。
因此,我希望 Sendmail 將包含信封收件者的自訂標頭新增至所有入站電子郵件。
我想我可以透過例子更好地解釋我的問題:
假設我有兩個電子郵件地址,[email protected]
並且[email protected]
.兩者都對應到作業系統使用者帳戶offers
。到目前為止,這是有效的:作業系統使用者offers
在獲取他的電子郵件時,會取得發送到[email protected]
和 的所有訊息[email protected]
。
現在的問題是,他無法確定每個訊息最初發送到哪個電子郵件地址。這意味著:雖然他看到了所有已發送到兩個電子郵件地址的郵件,但他無法判斷某封郵件最初是發送到[email protected]
還是發送到[email protected]
。
因此,我想為每個入站訊息添加一個自訂標頭,也許是這樣的:X-Envelope-Recipient: <Original envelope recipient>
。
做到這一點最簡單的方法是什麼?
曾幾何時,我為Sendmail編寫了一些簡單的自訂規則。但從那時起已經過去了近 15 年,所以我想避免這種情況,因此我希望有一個簡單的解決方案,或者有人可以為我指明正確的方向。老實說,目前對我來說寫一個 milter 來解決我的問題比重新學習 Sendmail 的規則語法更容易...
編輯1
根據 @AnFi 的要求,以下是 sendmail.cf 中的本機郵件程式定義:
Mlocal, P=/usr/lib/sm.bin/mail.local, F=lsDFMAw5:/|@qPSXnz9, S=EnvFromSMTP/HdrFromL, R=EnvToL/HdrToL,
T=DNS/RFC822/SMTP,
A=mail.local -l -h inbox
答案1
您的問題由 Sendmail.org FAQ 3.29 解決
3.29 當虛擬網域中的多個使用者轉到單一郵箱時,如何新增指定實際收件者的標頭?
簡短版本:使用 virtusertable 和~offers/.procmailrc
虛擬用戶表:
[email protected] offers+offer1
[email protected] offers+offer2
~offers/.procmailrc
應該在 中獲得“附加細節” $1
。
或者
您可以在自訂標頭中使用 $h (設定為 +detail)
警告[email protected]
:您將獲取/處理發送給和的消息的兩份副本[email protected]
答案2
您的建議將違反 SMTP 協定:RCPT TO
儘管地址不存在於To:
或Cc:
標頭中,但向命令添加地址是有正當理由的,即RFC 5321 7.2。「盲」副本(重點是我的):
由於多種原因,未出現在郵件標頭部分中的位址可能會出現在傳送給 SMTP 伺服器的 RCPT 命令中。最常見的兩個涉及使用郵寄地址作為「清單爆炸器」(解析為多個地址的單一地址)和「點字副本」的出現。特別是當存在多個 RCPT 命令時,並且為了避免違背這些機制的某些目的,SMTP 用戶端和伺服器不應將完整的 RCPT 命令參數複製到標頭部分,無論是作為追蹤標頭字段的一部分還是作為資訊或專用擴展標頭字段。由於該規則在實踐中經常被違反,並且無法強制執行,因此,了解「密件副本」使用的發送SMTP 系統可能會發現將每個密件副本作為僅包含單個RCPT 命令的單獨訊息事務發送會很有幫助。
SMTP 事務(「信封」)中的「反向」(來自 MAIL、SAML 等命令)或「轉送」(RCPT) 位址與標頭部分中的位址之間不存在固有關係。接收系統不應嘗試推斷此類關係並使用它們來更改要傳遞的訊息的標頭部分。 流行的
Apparently-to
標頭欄位違反了這項原則,也是意外資訊外洩的常見來源,不應使用。
不建議的Apparently-to
標頭由選項控制NoRecipientAction=action
。
將郵件中沒有收件者標頭(
To:
、Cc:
或 )時的行為設定為要執行的動作:Bcc:
none
保持訊息不變,add-to
新增To:
帶有信封收件人的標頭,add-apparently-to
新增Apparently-To:
帶有信封收件人的標頭,add-bcc
添加一個空Bcc:
標題,並且add-to-undisclosed
新增標題讀數'To: undisclosed-recipients:;'
。
請注意,通常原始收件人地址已經在To:
或Cc:
標頭中。不應將其修改為用戶帳戶名offers
,因此它要么是[email protected]
,[email protected]
要么是隱藏的。重寫標頭變得更加危險,因為它也可能破壞 DKIM 簽名。唯一合理的用例是對本地來源(user
至[email protected]
)的郵件進行地址重寫。
添加所有地址的清單RCPT TO
會違反協議,但實際上您只需要單一原始RCPT TO
地址對於郵件發送到的使用者。我不知道如何用 Sendmail 實現這一點,但是後綴(使用預設配置)添加一個X-Original-To:
包含該內容的標頭,以及Delivered-To:
包含內部目標信箱 ( [email protected]
) 的標頭。