在运行 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
根据RFC 5322, 3.6.5,
Subject
标头定义为RFC 5322, 2.2.1定义了“非结构化”:
由于标头中只允许使用 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
应针对该编码进行。但是,使用 PCRE 等正则表达式匹配unicode 块非常困难,如下表所示。=D0=80
=D3=BF
=D8=80
=DB=BF
Postfix 内置内容检查文档中也提到了此限制:
我建议改用 SpamAssassin 规则。TextCat语言猜测器甚至
ok_languages
可以从消息正文中检测语言。RFC 2047定义了如何将非 ASCII 字符集编码到主题标头中。
本质上,它使用
=?charset?encoding?encoded-text?=
wherecharset
可以是为 MIME 定义的任何字符集,例如UTF-8
,encoding
是B
用于 base64 或Q
用于引用的可打印,encoded-text
是实际的主题行。只需查看这些编码消息之一的源代码,您就会明白这一点。