Exim 過濾器、標頭變數和 MIME 編碼
我編寫 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
有問題的主題的所有變體後,都會正確解碼。