Exim

Exim 過濾器、標頭變數和 MIME 編碼

  • December 25, 2012

我編寫 exim 過濾器來轉發電子郵件(如郵件列表)。在過濾條件中,我使用標題變數。而且我在使用 $h_subject 編碼時遇到了一些困難。嘗試舉例說明。

從 gmail 發送的新電子郵件,主題只有幾個俄語單詞。當然,主題標頭是 MIME 編碼的。它看起來像這樣:

Subject: =?utf-8?Q?[nr=5Fbill]=20=D0=9D=D0=BE=D0=B2=D1=8B=D0=B9=20?=
=?utf-8?Q?=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7=20=D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD?=

在 Exim 過濾器中,我想使用下一個條件:$h_subject: contains "[nr_bill] Новый заказ оформлен"

問題是 Exim 只解碼標題的第一行。解碼後的標頭如下所示:

[nr_bill] \320\235\320\276\320\262\321\213\320\271 \n =?utf-8?Q?=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7=20=D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD?=

第一行解碼成功,可用於過濾器。但是第二行沒有被解碼。最糟糕的是:Exim 節省了行間的空格和換行符。據我所知,在解析時必須省略標題中的新行和前導空格。

所以$h_subject: contains "[nr_bill] Новый工作得很好,雖然$h_subject: contains "[nr_bill] Новый заказ оформлен"不是。

手冊說換行符+空格是正常的做法。但它沒有說明多部分 MIME 解碼。

誰能提出如何解決這個問題或只是解釋這些行為的意義何在?

答案找到了。感謝菲爾:)

Exim 非常嚴格地遵守 RFC2047 中的 MIME 規範,該規範為每個編碼字設置了最大長度。

—————————————-8< 剪到這裡 >8—————- ————–

編碼字=“=?” 字元集“?” 編碼“?” 編碼文本“?=”

$$ … $$ ’encoded-word’ 的長度不得超過 75 個字元,包括 ‘charset’、’encoding’、’encoded-text’ 和分隔符。如果希望編碼的文本多於 75 個字元的“編碼字”,則可以使用多個“編碼字”(由 CRLF SPACE 分隔)。

—————————————-8< 剪到這裡 >8—————- ————–

所以 MIME 解碼器會跳過那些長字元串並逐字添加它們。

如果你在 Exim 的主配置中設置了 “check_rfc2047_length” false,header 會被正確解碼;我會假設(但尚未檢查)Exim 然後會根據需要正確地重新編碼。

check_rfc2047_length = false

因此,在設置check_rfc2047_length = false有問題的主題的所有變體後,都會正確解碼。

引用自:https://serverfault.com/questions/460117