Sendmail
Sendmail/procmail/Exchange 截斷郵件
一位同事在其中找到模式的啟蒙水平使我免於陷入新的瘋狂。我希望這裡的智囊團現在可以告訴我為什麼…
**場景:**我們有幾個帶有 procmail 設置的通用郵件 ID,用於根據原始收件人重新分發郵件。例如,發送到 generic_ID1 的郵件會發送到 staff1,staff2;發送到 generic_ID2 的郵件會發送給 staff3、staff4;等等…
GENERIC_ID1_RECIPIENTS="staff1@domain,staff2@domain" :0 * ^TO.*generic_ID1 ! $GENERIC_ID1_RECIPIENTS
**問題:**郵件被截斷,似乎是隨機的。最終發現的模式表明,當句子以句點在第 76 列和硬輸入結束時出現:不是在第 75 或 77 列;而是在第 76 列。不在第 76 列,在同一行有更多文本。這段時間之後的任何文本都失去了。
附錄:我們剛剛看到它在第 226 列再次出現(並複制了它)。我驚呆了。
我可以通過在重新發送之前複製消息來確認 procmail 接收到整個消息:
:0c # note: 'c' * ^TO.*generic_ID1 ! $GENERIC_ID1_RECIPIENTS
我相信 sendmail 可能會在重新投遞時截斷它,但我不確定如何診斷或證明這一點(我不是 sendmail 管理員,只是一個 procmail 使用者)。
這個問題是完全可以重現的。
**問題:**為什麼會發生這種情況,我該如何解決?
非常感謝。
編輯:更新標題和標籤。解決方案在評論中。
(從問題評論轉換)
這個等式實際上包含三個部分:sendmail、procmail 和 Exchange:
- Exchange:在接受要投遞的郵件時,它似乎會重新格式化純文字消息,將其行編碼並換行為 75 個字元。
- sendmail:在該郵件中遵循了一個舊的(但已知的)行為,一行上的句點被解釋為消息結束,然後被傳遞,有效地截斷了實際的郵件正文。
- procmail:根據文件,它應該使用強制它忽略裸句的標誌來呼叫 sendmail。它沒有這樣做,也沒有遵守顯式的配置文件指令。短期解決方案:將 -oi -OIgnoreDots=T 傳遞給所有重新傳遞配方。長期的解決方案:升級我們站點的 procmail 安裝,它現在尊重配置設置並忽略空白期(不再需要傳遞的標誌)。
硬換行開始發揮作用,因為當 Exchange 對之前的純文字消息進行編碼時,它引入
=20
了可能允許句點自行換行並單獨留在一行中的方式。