簡介
本文檔介紹如何辨識郵件安全裝置(ESA)上的郵件循環。
背景資訊
「郵件循環」可由具有相同郵件ID且已注入3次以上的郵件指示。郵件循環會導致出現高CPU使用率、傳送緩慢和整體效能問題等症狀。通常情況下,多次注入郵件ID表示循環,但有時由於問題被多次注入,或者可能是一個草率的垃圾郵件傳送者,不斷注入具有相同郵件ID的相同垃圾郵件。
更常見的情況是,郵件循環是由電子郵件基礎架構問題造成的,此問題會在您的網路中無休止地從郵件伺服器向郵件伺服器傳送相同或一組郵件。 雖然這些消息可以在很長一段時間內保持愉悅感,但對於您的網路頻寬或ESA處理成本而言,這都不是一件好事。
解決方案
如果你懷疑這可能是個問題,辨識郵件循環通常非常容易,儘管你需要仔細觀察它。
登入系統的命令列介面(CLI)並發出以下命令之一,或同時發出這兩種命令,因為您會發現以下優點:
grep "Subject" mail_logs
grep "Message-ID" mail_logs
特別是在Message-ID搜尋時,如果您看到完全相同ID的循環例項,則您會知道存在郵件循環。 但是,有時這還不夠,因為收集相同郵件的郵件伺服器之一可能有助於更改或刪除Message-ID標頭。 因此,如果您沒有透過Message-ID檢查獲得任何可辨識的資訊,請繼續嘗試進行Subject檢查。
假設您已透過Message-ID找到循環消息,您還需要查詢有關消息及其父連線(ICID)的其他資訊。在相同的日誌行中指定Message-ID和MID後,您可以執行以下操作:
grep -e "MessageID_I_found" -e "MID 123456" mail_logs
根據得到的輸出,您可以找到相關的ICID和DCID並執行:
grep -e "MessageID_I_found" -e "MID 123456" -e "ICID 1234567" -e "DCID 2345767" mail_logs
現在,您應該具有完整的連線-消息事務,並且可以看到該事務來自何處以及傳送至何處(如果已經發生這種情況)。一旦您辨識出重複訊息,下一步就是檢視訊息,以便修正問題。 如果不修復環路的原因,則此消息和其他消息可能會繼續循環,或者問題將很快再次出現。
建立類似以下的郵件篩選:
loganddrop_looper:
if(header("Message-ID") == "MessageID_I_found") {
archive("looper");
drop();
}
現在確認該更改,並發出此命令以簽出該消息:
tail looper
透過檢視郵件日誌可以獲得有關遠端系統的資訊,透過檢視郵件本身可以獲得其他資訊,您應該能夠確定問題所在。
如何防止發生郵件循環?
在複雜的環境中,這非常困難-瞭解郵件在您的環境中如何流動,以及新的網路變化(無論是在ESA上還是在其他裝置上)將如何影響該通訊量是關鍵。導致郵件循環丟失的一個常見原因是刪除了Received信頭。 ESA在郵件中看到100個已接收報頭時,會自動檢測並停止郵件循環,但ESA允許刪除此報頭,這通常會導致郵件循環錯誤。 除非有*真的*好的理由,否則請勿關閉已接收標頭,或將其移除。
以下是有助於防止或修復郵件循環的過濾器示例:
External_Loop_Count:
if (header("X-ExtLoop1")) {
if (header("X-ExtLoopCount2")) {
if (header("X-ExtLoopCount3")) {
if (header("X-ExtLoopCount4")) {
if (header("X-ExtLoopCount5")) {
if (header("X-ExtLoopCount6")) {
if (header("X-ExtLoopCount7")) {
if (header("X-ExtLoopCount8")) {
if (header("X-ExtLoopCount9")) {
notify ('joe@example.com');
drop();
}
else {insert-header("X-ExtLoopCount9", "from
$RemoteIP");}}
else {insert-header("X-ExtLoopCount8", "from $RemoteIP");}}
else {insert-header("X-ExtLoopCount7", "from $RemoteIP");}}
else {insert-header("X-ExtLoopCount6", "from $RemoteIP");}}
else {insert-header("X-ExtLoopCount5", "from $RemoteIP");}}
else {insert-header("X-ExtLoopCount4", "from $RemoteIP");}}
else {insert-header("X-ExtLoopCount3", "from $RemoteIP");}}
else {insert-header("X-ExtLoopCount2", "from $RemoteIP");}}
else {insert-header("X-ExtLoop1", "1"); }