如何检测电子邮件主题中的非拉丁文字?

如何检测电子邮件主题中的非拉丁文字?

在运行 Postfix 的邮件服务器上,我想拒绝主题中使用一些非拉丁字母的邮件,特别是阿拉伯语和西里尔语,因为我的用户(家人)都不讲这些语言。

我尝试使用 PCRE 标头检查,如下所示:

/Subject:.*\p{Arabic}/i WARN Arabic detected

不幸的是,当我向服务器发送测试邮件时,这不会触发警告。我已WARN使用规则验证消息确实出现在系统日志中/Subject:.*Test/i WARN Test,该规则确实会触发。

如何使用 Postfix 检测主题中的阿拉伯语和西里尔语?

为了完整起见,我main.cf包括了header_checks如下内容:

header_checks = pcre:/etc/postfix/header_checks

答案1

根据RFC 5322, 3.6.5Subject标题定义为

subject = "Subject:" unstructured CRLF

RFC 5322, 2.2.1定义“非结构化”:

本规范中的一些字段主体被简单地定义为“非结构化的”(在第 3.2.5 节可打印字符 (如任何可打印的 US-ASCII 字符加空格字符) 没有其他限制。

由于标头中只允许使用 US-ASCII 字符Subject,因此任何非 US-ASCII 字符都必须编码为 US-ASCII,并且RFC 2047定义了一个标准草案对此,这是广泛使用的。例如,使用“Quoted-Printable”又名“Q”编码(第4.2节),

  • 西里尔文Тест变成Subject: =?UTF-8?Q?=D0=A2=D0=B5=D1=81=D1=82?=
  • 阿拉伯语متحان变成Subject: =?UTF-8?Q?=D9=85=D8=AA=D8=AD=D8=A7=D9=86?=

PCRE 中的匹配header_checks应该针对该编码进行。但是,匹配unicode 块使用像 PCRE 这样的正则表达式非常困难,如下表所示。

Unicode 块 范围 量子点启动 量子点结束
西里尔 U+0400..U+04FF =D0=80 =D3=BF
阿拉伯 U+0600..U+06FF =D8=80 =DB=BF

这一限制在Postfix 内置内容检查文档:

Postfix 标头/正文检查的局限性

标头/正文检查不会解码邮件标头或邮件正文内容。例如,如果邮件正文中的文本采用 BASE64 编码(RFC 2045),则您的正则表达式必须匹配 BASE64 编码形式。同样,带有编码非 ASCII 字符的邮件头(RFC 2047) 需要以其编码形式进行匹配。

我建议改用 SpamAssassin 规则。TextCat 语言猜测器甚至可以ok_languages从邮件正文中检测语言。

答案2

RFC 2047定义如何将非 ASCII 字符集编码为主题標軸。

本质上,它使用 ,=?charset?encoding?encoded-text?=其中charset可以是任何为 MIME 定义的字符集,例如UTF-8encoding用于Bbase64 或Q用于 quoted printable ,并且encoded-text是实际的主题行。只需查看其中一个编码消息的源代码,您就会明白。

相关内容