PCRE_TABLE(5) PCRE_TABLE(5)
名称
pcre_table - Postfix PCRE 表格式说明
概述
postmap -q "字符串" pcre:/etc/postfix/文件名
postmap -q - pcre:/etc/postfix/文件名 <输入文件
postmap -hmq - pcre:/etc/postfix/文件名 <输入文件
postmap -bmq - pcre:/etc/postfix/文件名 <输入文件
描述
Postfix 邮件系统使用可选表来实现地址重写、邮件路由或访问控制功能。这些表通常采用 dbm 或 db 格式存储。
此外,查找表也可以使用 Perl 兼容正则表达式 (PCRE) 格式指定。采用此格式时,系统会将每个输入与一系列模式进行比对。当找到匹配项时,返回对应的结果并终止搜索。
要查询您的 Postfix 系统支持的查找表类型,请使用 "postconf -m" 命令。
测试查找表时,请使用上文"概述"部分介绍的 "postmap -q" 命令。对于 header_checks(5) 模式,请使用 "postmap -hmq - <文件";对于 body_checks(5) 则使用 "postmap -bmq - <文件"(适用于 Postfix 2.6 及更高版本)。
本驱动可使用 PCRE2 库(Postfix 3.7 及更高版本)或传统的 PCRE 库(所有 Postfix 版本)构建。
兼容性
在 Postfix 2.2 及更早版本中,如需查询包含区分大小写模式的表,请指定 "postmap -fq"。默认情况下,模式匹配不区分大小写。
表格式
PCRE 表的基本格式如下:
/模式/标志 结果
当输入字符串匹配 模式 时,使用对应的 结果 值。
!/模式/标志 结果
当输入字符串不匹配 模式 时,使用对应的 结果 值。
if /模式/标志
endif
如果输入字符串匹配 /模式/,则继续匹配 if 和 endif 之间的模式。if..endif 支持嵌套。
注意:if..endif 内部的模式前不要添加空格。
此功能在 Postfix 2.1 及更高版本中可用。
if !/模式/标志
endif
如果输入字符串不匹配 /模式/,则继续匹配 if 和 endif 之间的模式。if..endif 支持嵌套。
注意:if..endif 内部的模式前不要添加空格。
此功能在 Postfix 2.1 及更高版本中可用。
空行和注释:
空行和仅包含空格的行会被忽略,以 "#" 开头的行也会被视为注释。
多行文本:
逻辑行以非空格文本开头。以空格开头的行视为前一个逻辑行的延续。
每个模式都是类 Perl 正则表达式。表达式分隔符可以是除空格或具有特殊含义字符外的任何非字母数字字符(传统上使用正斜杠)。正则表达式中可以包含空格。
默认情况下,匹配不区分大小写,且换行符不作为特殊字符处理。通过以下标志可以控制匹配行为(在模式后附加):
i(默认:开启)
切换大小写敏感标志。默认情况下匹配不区分大小写。
m(默认:关闭)
切换 PCRE MULTILINE 标志。开启时,"^" 和 "$" 元字符除了匹配字符串开头和结尾外,还会分别在换行符后和换行符前匹配。
s(默认:开启)
切换 PCRE DOTALL 标志。开启时,"." 元字符会匹配换行符。Postfix 2.0 之前版本默认关闭此标志,这对多行邮件头匹配不太方便。
x(默认:关闭)
切换 PCRE 扩展标志。开启时,将忽略模式中的空白字符(字符类中的除外)。如需将空白字符作为模式的一部分,请使用反斜杠转义。
注意:不要在模式后使用 #注释。
A(默认:关闭)
切换 PCRE ANCHORED 标志。开启时,模式将被强制"锚定",即只能匹配被搜索字符串("目标字符串")的开头。此效果也可以通过模式本身的适当结构实现。
E(默认:关闭)
切换 PCRE DOLLAR_ENDONLY 标志。开启时,模式中的 "$" 元字符只匹配目标字符串的末尾。未开启时,美元符号还会在最后一个字符是换行符时匹配(但不匹配其他换行符)。如果设置了 PCRE MULTILINE 标志,则此标志将被忽略。
U(默认:关闭)
切换 PCRE UNGREEDY 标志。开启时,模式匹配引擎会反转量词的"贪婪性",使其默认不贪婪,但在后面跟有"?"时变为贪婪。也可以通过模式中的 (?U) 修饰符设置此标志。
X(默认:关闭)
切换 PCRE EXTRA 标志。开启时,模式中任何后跟无特殊含义字母的反斜杠都会导致错误,从而保留这些组合供未来扩展使用。
注意:PCRE2 不支持此功能。
搜索顺序
按照表中指定的顺序应用模式,直到找到与输入字符串匹配的模式。
每个模式都会应用于整个输入字符串。根据具体应用场景,该字符串可能是完整的客户端主机名、客户端 IP 地址或邮件地址。因此,系统不会执行父域或父网络搜索,也不会将 user@domain 邮件地址拆分为 user 和 domain 部分,更不会将 user+foo 拆分为 user 和 foo。
文本替换
使用 $1、$2 等可以将匹配表达式中子模式("()"内的模式匹配的文本)替换到结果字符串中;使用 $$ 可输出 $ 字符。如果结果字符串中的宏后面没有空格,可能需要写成 ${n} 或 $(n) 形式。此功能不支持 PCRE2 的子模式命名。
注意:由于否定模式(以 ! 开头的模式)会在表达式不匹配时返回结果,因此否定模式不支持文本替换功能。
内联规范
从 Postfix 3.7 开始,表内容可以直接在表名中指定。基本语法如下:
main.cf:
参数 = .. pcre:{ { 规则1 }, { 规则2 } .. } ..
master.cf:
.. -o { 参数 = .. pcre:{ { 规则1 }, { 规则2 } .. } .. } ..
Postfix 会递归展开上述参数值中的所有 $参数名 实例,忽略 "{" 后和 "}" 前的空格,并将每个 规则 作为一行文本写入内存文件:
内存文件:
规则1
规则2
..
Postfix 会像解析 /etc/postfix 中的文件一样解析这些内容。
内联规范注意事项
o 在内联模式中使用 $参数名 时,请使用 \Q$参数名\E 来禁用 $参数名 扩展中的元字符(如 ".")。否则,模式可能会出现意外匹配。
o 当内联规则必须包含 $ 时,请使用 $$ 防止 Postfix 在计算参数值时尝试进行 $名称 扩展。检查内联配置时,请按以下方式使用 "postconf -x" 选项:
o 当 main.cf 的 "参数名 = 值" 设置包含内联 pcre: 表时,使用命令 "postconf -x 参数名"。请确认没有"未定义参数"警告,且输出语法与常规 Postfix pcre: 文件使用的语法一致。
o 当 master.cf 的 "-o { 参数名 = 值 }" 覆盖包含内联 pcre: 表时,使用命令 "postconf -Px '*/*/参数名'"。请确认没有"未定义参数"警告,且输出语法与常规 Postfix pcre: 文件使用的语法一致。
SMTPD 访问表示例
# 保护外发的 majordomo 邮件列表
/^(?!owner-)(.*)-outgoing@(.*)/ 550 请使用 ${1}@${2} 替代
# 拒收 friend@whatever 邮件,除非 whatever 是我们的域名
# (最佳实践是直接拒收所有 friend@ 邮件 - 此处仅为示例)
/^(friend@(?!my\.domain$).*)$/ 550 请勿发送此类邮件 $1
# 多行条目。文本将作为单行发送
#
/^noddy@my\.domain$/
550 该用户行为异常。建议不要向其发送邮件,
否则可能导致其系统异常。
邮件头过滤表示例
/^Subject: make money fast/ REJECT
/^To: friend@public\.com/ REJECT
邮件正文过滤表示例
# 首先跳过 base64 编码文本以节省 CPU 资源
# 需要 PCRE 版本 3 支持
~^[[:alnum:]+/]{60,}$~ OK
# 在此添加您的正文匹配规则
参见
postmap(1), Postfix 查找表管理器
postconf(5), 配置参数
regexp_table(5), POSIX 正则表达式表格式
参考文档
DATABASE_README, Postfix 查找表概述
作者
PCRE 表查找代码最初由以下人员编写:
Andrew McNamara
[email protected]
connect.com.au Pty. Ltd.
Level 3, 213 Miller St
North Sydney, NSW, Australia
由以下人员采纳并改编:
Wietse Venema
IBM T.J. Watson Research
P.O. Box 704
Yorktown Heights, NY 10598, USA
Wietse Venema
Google, Inc.
111 8th Avenue
New York, NY 10011, USA
PCRE_TABLE(5)