REGEXP_TABLE(5)                                                REGEXP_TABLE(5)

名称
       regexp_table - Postfix 正则表达式表的格式说明

概述
       postmap -q "字符串" regexp:/etc/postfix/文件名

       postmap -q - regexp:/etc/postfix/文件名 <输入文件

描述
       Postfix 邮件系统使用可选的查找表来实现地址重写、邮件路由或访问控制功能。
       这些表通常采用 dbmdb 数据库格式。

       此外,查找表也可以使用 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
              如果输入字符串匹配 /模式/,则继续匹配 ifendif 之间的其他模式。
              if..endif 结构支持嵌套。

              注意:if..endif 内部的模式前不要添加空格。

              此功能在 Postfix 2.1 及更高版本中可用。

       if !/模式/标志

       endif
              如果输入字符串匹配 /模式/,则继续匹配 ifendif 之间的其他模式。
              if..endif 结构支持嵌套。

              注意:if..endif 内部的模式前不要添加空格。

              此功能在 Postfix 2.1 及更高版本中可用。

       空行和注释:
              空行、仅包含空格的行,以及以 # 号开头的行都会被忽略。

       多行文本:
              非空格字符开头的行视为新逻辑行,以空格开头的行视为上一行的续行。

       每个模式都是由一对分隔符包围的 POSIX 正则表达式。正则表达式语法在以下文档中有详细说明:
       BSD 系统的 re_format(7)、Solaris 系统的 regex(5) 以及 Linux 系统的 regex(7)。
       其他系统可能使用不同的文档名称。

       分隔符可以是除字母数字、空格或特殊字符外的任意字符(传统上使用正斜杠/)。
       正则表达式中可以包含空格字符。

       默认情况下,匹配操作不区分大小写,且换行符不作为特殊字符处理。
       可以通过在模式后添加以下标志字符来修改匹配行为:

       i(默认:开启)
              切换大小写敏感匹配。默认情况下匹配不区分大小写。

       m(默认:关闭)
              切换多行模式。启用时,^$ 元字符除了匹配字符串首尾外,
              还会分别匹配换行符之后和之前的位置。

       x(默认:开启)
              切换扩展正则表达式语法支持。默认情况下启用扩展语法。

表格搜索顺序
       系统会按照表格中定义的顺序依次尝试匹配每个模式,直到找到第一个匹配项为止。

       每个模式都会应用于整个输入字符串。根据具体应用场景,输入字符串可能是:
       - 完整的客户端主机名
       - 完整的客户端 IP 地址
       - 完整的邮件地址
       因此,系统不会自动搜索父域名或父网络,也不会将 user@domain 格式的邮件地址
       拆分为 userdomain 两部分,同样不会将 user+foo 拆分为 userfoo文本替换
       可以通过 $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)