在运行 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.5,Subject
标题定义为
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 这样的正则表达式非常困难,如下表所示。
这一限制在Postfix 内置内容检查文档:
Postfix 标头/正文检查的局限性
标头/正文检查不会解码邮件标头或邮件正文内容。例如,如果邮件正文中的文本采用 BASE64 编码(RFC 2045),则您的正则表达式必须匹配 BASE64 编码形式。同样,带有编码非 ASCII 字符的邮件头(RFC 2047) 需要以其编码形式进行匹配。
我建议改用 SpamAssassin 规则。TextCat 语言猜测器甚至可以ok_languages
从邮件正文中检测语言。
答案2
RFC 2047定义如何将非 ASCII 字符集编码为主题標軸。
本质上,它使用 ,=?charset?encoding?encoded-text?=
其中charset
可以是任何为 MIME 定义的字符集,例如UTF-8
,encoding
用于B
base64 或Q
用于 quoted printable ,并且encoded-text
是实际的主题行。只需查看其中一个编码消息的源代码,您就会明白。