Exim 过滤器、标头变量和 MIME 编码

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 解码。

有人能提出如何解决这个问题或者只是解释一下这些行为的意义是什么吗?

答案1

答案找到了。感谢菲尔:)

Exim 非常严格地遵守 RFC2047 中的 MIME 规范,该规范对每个编码字的最大长度进行了设置。

----------------------------8< 从这里切 >8------------------------------

编码字 = “=?” 字符集“?” 编码“?” 编码文本“?=” [...]

'编码字' 的长度不得超过 75 个字符,包括 '字符集'、'编码'、'编码文本' 和分隔符。如果希望编码的文本多于 75 个字符的 '编码字' 所容纳的文本,则可以使用多个 '编码字'(以 CRLF 空格分隔)。

----------------------------8< 从这里切 >8------------------------------

因此 MIME 解码器会跳过这些长字符串并按原样添加它们。

...

如果在 Exim 的主配置中将“check_rfc2047_length”设置为 false,则标头将被正确解码;我假设(但尚未检查)Exim 会根据需要正确地重新编码内容。

check_rfc2047_length = false

因此设置后,check_rfc2047_length = false所有有问题的主题的变体都会被正确解码。

相关内容