REGEXP_TABLE(5) REGEXP_TABLE(5)
名称
regexp_table - Postfix 正则表达式表的格式说明
概述
postmap -q "字符串" regexp:/etc/postfix/文件名
postmap -q - regexp:/etc/postfix/文件名 <输入文件
描述
Postfix 邮件系统使用可选的查找表来实现地址重写、邮件路由或访问控制功能。
这些表通常采用 dbm 或 db 数据库格式。
此外,查找表也可以使用 POSIX 正则表达式格式定义。在此格式下,系统会将每个输入字符串
与一系列正则表达式模式进行比对。当找到匹配项时,返回对应的结果并终止搜索过程。
要查询您的 Postfix 系统支持的查找表类型,请使用 "postconf -m" 命令。
测试查找表时,请使用上文"概述"部分介绍的"postmap -q"命令。
测试 header_checks(5) 模式时使用"postmap -hmq - <文件",
测试 body_checks(5) 模式时使用"postmap -bmq - <文件"(适用于 Postfix 2.6 及更高版本)。
兼容性
在 Postfix 2.2 及更早版本中,如需查询包含区分大小写模式的表,需使用"postmap -fq"命令。
默认情况下,所有模式匹配都是不区分大小写的。
表格格式
Postfix 正则表达式表的基本格式如下:
/模式/标志 结果
当输入字符串匹配指定的模式时,返回对应的结果值。
!/模式/标志 结果
当输入字符串不匹配指定的模式时,返回对应的结果值。
if /模式/标志
endif
如果输入字符串匹配 /模式/,则继续匹配 if 和 endif 之间的其他模式。
if..endif 结构支持嵌套。
注意:if..endif 内部的模式前不要添加空格。
此功能在 Postfix 2.1 及更高版本中可用。
if !/模式/标志
endif
如果输入字符串不匹配 /模式/,则继续匹配 if 和 endif 之间的其他模式。
if..endif 结构支持嵌套。
注意:if..endif 内部的模式前不要添加空格。
此功能在 Postfix 2.1 及更高版本中可用。
空行和注释:
空行、仅包含空格的行,以及以 # 号开头的行都会被忽略。
多行文本:
非空格字符开头的行视为新逻辑行,以空格开头的行视为上一行的续行。
每个模式都是由一对分隔符包围的 POSIX 正则表达式。正则表达式语法在以下文档中有详细说明:
BSD 系统的 re_format(7)、Solaris 系统的 regex(5) 以及 Linux 系统的 regex(7)。
其他系统可能使用不同的文档名称。
分隔符可以是除字母数字、空格或特殊字符外的任意字符(传统上使用正斜杠/)。
正则表达式中可以包含空格字符。
默认情况下,匹配操作不区分大小写,且换行符不作为特殊字符处理。
可以通过在模式后添加以下标志字符来修改匹配行为:
i(默认:开启)
切换大小写敏感匹配。默认情况下匹配不区分大小写。
m(默认:关闭)
切换多行模式。启用时,^ 和 $ 元字符除了匹配字符串首尾外,
还会分别匹配换行符之后和之前的位置。
x(默认:开启)
切换扩展正则表达式语法支持。默认情况下启用扩展语法。
表格搜索顺序
系统会按照表格中定义的顺序依次尝试匹配每个模式,直到找到第一个匹配项为止。
每个模式都会应用于整个输入字符串。根据具体应用场景,输入字符串可能是:
- 完整的客户端主机名
- 完整的客户端 IP 地址
- 完整的邮件地址
因此,系统不会自动搜索父域名或父网络,也不会将 user@domain 格式的邮件地址
拆分为 user 和 domain 两部分,同样不会将 user+foo 拆分为 user 和 foo。
文本替换
可以通过 $1、$2 等形式将匹配的子表达式(括号内的模式)插入到结果字符串中;
使用 $$ 表示输出 $ 字符本身。当替换变量后紧跟其他字符时,
建议使用 ${n} 或 $(n) 的格式以避免歧义。
注意:由于否定模式(以!开头的模式)会在不匹配时返回结果,
因此否定模式不支持子表达式替换功能。
内联定义
Postfix 3.7 及更高版本支持直接在配置参数中定义表格内容。基本语法如下:
main.cf:
参数名 = .. regexp:{ { 规则1 }, { 规则2 } .. } ..
master.cf:
.. -o { 参数名 = .. regexp:{ { 规则1 }, { 规则2 } .. } .. } ..
Postfix 会递归展开参数值中的所有 $变量名 引用,自动忽略大括号前后的空格,
并将每个规则转换为内存文件中的一行文本:
内存文件:
规则1
规则2
...
系统会像处理 /etc/postfix 目录下的普通文件一样解析这些内容。
内联定义注意事项
1. 避免在内联正则表达式中使用 $变量名,因为当变量值包含元字符(如点号)时,
可能导致意外的匹配结果。如需使用变量,建议改用 pcre 表,
并使用 \Q$变量名\E 的格式确保安全匹配。
2. 当内联规则中需要包含 $ 字符时,请使用 $$ 表示,以防止 Postfix 将其误认为变量引用。
可以通过以下方式验证内联配置的正确性:
a. 对于 main.cf 中的"参数名 = 值"设置,使用"postconf -x
参数名"命令检查。确保没有"未定义参数"警告,
且输出格式与标准 regexp 文件格式一致。
b. 对于 master.cf 中的"-o { 参数名 = 值 }"覆盖设置,
使用"postconf -Px '*/*/参数名'"命令检查。确保没有"未定义参数"警告,
且输出格式与标准 regexp 文件格式一致。
SMTPD 访问表示例
# 禁止发件人指定路由。当您为其他域提供邮件中继服务时,此设置必不可少
/[%!@].*[%!@]/ 550 拒绝发件人指定的路由
# 允许 postmaster 发信,便于联系管理员解决问题
/^postmaster@/ OK
# 保护外发邮件列表处理器
if !/^owner-/
/^(.*)-outgoing@(.*)$/ 550 请使用 ${1}@${2} 代替
endif
邮件头过滤表示例
# 这些模式曾经常见于垃圾邮件
/^Subject: make money fast/ 拒绝
/^To: friend@public\.com/ 拒绝
邮件正文过滤表示例
# 首先跳过 Base64 编码内容以节省处理资源
~^[[:alnum:]+/]{60,}$~ OK
# 在此添加您自定义的正文过滤规则
参见
postmap(1), Postfix 查找表管理工具
pcre_table(5), PCRE 表格式说明
cidr_table(5), CIDR 表格式说明
自述文件
DATABASE_README, Postfix 查找表概述
作者
正则表达式表查找功能的原始作者:
LaMont Jones
[email protected]
基于 Andrew McNamara 贡献的 PCRE 字典代码:
Andrew McNamara
[email protected]
connect.com.au 有限公司
澳大利亚新南威尔士州北悉尼
Miller 街 213 号 3 层
由以下人员改进和适配:
Wietse Venema
IBM T.J. Watson 研究中心
美国纽约州约克镇高地
704 号信箱,邮编 10598
Wietse Venema
Google 公司
美国纽约州纽约市
第八大道 111 号,邮编 10011
REGEXP_TABLE(5)