GENERIC(5) GENERIC(5)
名称
generic - Postfix 通用地址映射表格式
摘要
postmap /etc/postfix/generic
postmap -q "字符串" /etc/postfix/generic
postmap -q - /etc/postfix/generic <输入文件
描述
可选的 generic(5) 表用于指定邮件投递时的地址映射规则,这与接收邮件时使用的
canonical(5) 映射功能正好相反。
典型应用场景是:当系统没有有效的互联网域名,而使用类似 localdomain.local 这样的本地域名时,
可以通过 generic(5) 表,在 SMTP 客户端 smtp(8) 发送邮件到互联网时,
将本地邮件地址转换为有效的互联网邮件地址。具体示例请参阅本文档末尾的"示例"部分。
generic(5) 映射会同时影响:
- 邮件头中的地址(即邮件正文内显示的地址)
- 邮件信封地址(如 SMTP 协议命令中使用的地址)
通常,generic(5) 表以文本文件形式创建,然后通过 postmap(1) 命令
转换为 dbm 或 db 格式的索引文件,以提高邮件系统的查询效率。修改文本文件后,
需要执行命令"postmap /etc/postfix/generic"来重建索引文件。
当通过 NIS、LDAP 或 SQL 等其他方式提供映射表时,查询方式与普通索引文件相同。
此外,还可以使用正则表达式映射表或基于 TCP 的查询服务。这两种特殊形式的
查询方式将在下文"正则表达式表"和"TCP 查询表"部分详细说明。
大小写处理
默认情况下,查询字符串在数据库查找前会被转换为小写。但从 Postfix 2.3 开始,
使用 regexp: 或 pcre: 等支持大小写敏感匹配的数据库类型时,
查询字符串将保持原有大小写格式。
表格式
postmap(1) 命令的输入文件格式规范:
模式 结果
当邮件地址匹配 模式 时,将其替换为对应的 结果
空行和注释:
- 仅包含空白字符的行会被忽略
- 以 # 开头的行被视为注释
多行文本:
- 非空白字符开头的行视为新记录的开始
- 以空白字符开头的行视为上一记录的续行
查询顺序
使用 DB、DBM 等索引文件或 NIS、LDAP、SQL 等网络查询服务时,
每个 user@domain 格式的查询会按以下顺序尝试匹配模式,
直到找到第一个匹配项:
1. user@domain address
- 精确匹配完整邮件地址
- 优先级最高
2. user address
- 当域名满足以下条件时匹配:
* 等于 $myorigin
* 在 $mydestination 列表中
* 在 $inet_interfaces 或 $proxy_interfaces 中
3. @domain address
- 匹配指定域名的所有地址
- 优先级最低
结果地址重写规则
查询结果的地址会经过以下处理:
1. 当结果为 @其他域名 时:
- 保持用户名不变,只替换域名部分
2. 当配置"append_at_myorigin=yes"时:
- 为不含@符号的地址追加"@$myorigin"
3. 当配置"append_dot_mydomain=yes"时:
- 为不含域名的地址追加".$mydomain"
地址扩展处理
当邮件地址包含收件人分隔符时(如 user+foo@domain),
查询顺序变为:
1. user+foo@domain
2. user@domain
3. user+foo
4. user
5. @domain
参数 propagate_unmatched_extensions 控制是否将未匹配的
地址扩展部分(如 +foo)保留到查询结果中。
正则表达式表
当使用正则表达式形式(而非索引文件)定义映射表时,查询行为会有以下变化:
具体语法请参考 regexp_table(5) 或 pcre_table(5)。
重要特性:
1. 每个模式都是应用于完整地址的正则表达式
- 不会自动拆分 user@domain 为用户名和域名
- 不会自动分离 user+foo 中的地址扩展
2. 按表中定义的顺序逐个尝试匹配
- 找到第一个匹配的模式即停止
3. 支持使用匹配组引用
- 通过 $1、$2 等方式引用括号捕获的内容
- 例如:将 "(.+)@domain" 替换为 "user-$1@newdomain"
TCP 查询表
(Postfix 2.5 及以上版本支持)
通过 TCP 服务器查询时的特殊处理方式:
协议细节请参考 tcp_table(5)
关键特点:
1. 每次查询发送完整地址
- 不进行任何预处理或拆分
- 保持 user@domain 或 user+foo 的完整格式
2. 响应处理方式
- 与索引文件查询的结果处理规则完全一致
- 支持所有地址重写功能
配置示例
典型应用场景:将本地域名地址转换为互联网地址
(假设 ISP 支持"+"格式的地址扩展)
/etc/postfix/main.cf 配置:
smtp_generic_maps = hash:/etc/postfix/generic
/etc/postfix/generic 文件内容:
[email protected] [email protected]
[email protected] [email protected]
@localdomain.local [email protected]
注意事项:
1. 修改后需执行:postmap /etc/postfix/generic
2. 某些系统可能使用 dbm 而非 hash 格式
3. 通过 postconf -m 查看系统支持的数据库类型
已知限制
当前版本的表格式解析器:
- 不支持引号转义规范
- 需避免在模式中使用特殊字符
相关配置参数
主要参数(详见 postconf(5)):
smtp_generic_maps
类型:字符串
默认:空
功能:指定 SMTP 客户端使用的地址重写映射表
propagate_unmatched_extensions
类型:列表
默认:canonical, virtual
功能:控制是否保留未匹配的地址扩展(+foo)
其他相关参数:
inet_interfaces
类型:列表
默认:all
功能:指定邮件系统监听的网络接口
proxy_interfaces
类型:列表
默认:空
功能:指定通过 NAT/代理接收邮件的虚拟接口
mydestination
类型:列表
默认:$myhostname, localhost.$mydomain, localhost
功能:定义本地投递的域名列表
myorigin
类型:字符串
默认:$myhostname
功能:设置外发邮件的默认域名
owner_request_special
类型:布尔
默认:yes
功能:控制对 owner-listname 特殊地址的处理方式
参见
1. postmap(1)
- Postfix 查询表管理工具
2. postconf(5)
- 配置参数详解
3. smtp(8)
- Postfix SMTP 客户端实现
参考文档
1. ADDRESS_REWRITING_README
- 地址重写完整指南
2. DATABASE_README
- Postfix 查询表技术综述
3. STANDARD_CONFIGURATION_README
- 标准配置方案示例
版权声明
本软件遵循 Secure Mailer 许可证
- 必须随软件完整分发许可证文本
- 详情参见软件发行包中的 LICENSE 文件
版本历史
发展里程碑:
1. 源自 Sendmail MTA 的 generictable 功能
2. Postfix 2.2 版本首次引入
3. 持续更新至当前版本
作者信息
Wietse Venema
- 早期开发:
IBM T.J. Watson 研究中心
美国纽约州约克镇高地
PO Box 704, 邮编 10598
- 当前维护:
Google 公司
美国纽约州纽约市
第八大道 111 号,邮编 10011
GENERIC(5)