VIRTUAL(8) VIRTUAL(8)
名称
virtual - Postfix 虚拟域邮件投递代理
概述
virtual [通用 Postfix 守护进程选项]
描述
virtual(8) 投递代理专为虚拟邮件托管服务设计。该代理最初基于 Postfix
local(8) 投递代理,通过映射表查找完整收件人地址进行投递,而非使用硬编码的 UNIX
密码文件仅查找地址的本地部分。
该投递代理仅处理邮件投递。其他功能如邮件转发、外出通知等,必须通过
virtual_alias 映射表或类似的查找机制进行配置。
邮箱位置
邮箱位置由 virtual_mailbox_base 和 virtual_mailbox_maps
配置参数控制(详见下文)。virtual_mailbox_maps 表按收件人地址建立索引,
索引方式参见下文"表搜索顺序"部分。
邮箱路径名按以下方式构建:
$virtual_mailbox_base/$virtual_mailbox_maps(recipient)
其中 recipient 为完整收件人地址。
UNIX 邮箱格式
当邮箱路径不以 / 结尾时,邮件将以 UNIX 邮箱格式投递。该格式将多封邮件存储在单个文本文件中。
virtual(8) 投递代理会在每封邮件前添加以下内容:
- 以"From sender time_stamp"开头的信封头
- 包含信封收件人地址的 Delivered-To: 消息头
- 包含 Postfix 原始收件人地址的 X-Original-To: 头
- 包含信封发件人地址的 Return-Path: 头
- 在以"From "开头的行前添加 > 字符
- 末尾添加空行
投递过程中会对邮箱文件进行独占锁定。如遇问题,系统会尝试将邮箱截断至原始大小。
QMAIL MAILDIR 格式
当邮箱路径以 / 结尾时,邮件将以 qmail maildir 格式投递。该格式每封邮件单独存储为一个文件。
virtual(8) 投递代理会在邮件前添加:
- 包含最终信封收件人地址的 Delivered-To: 头
- 包含 Postfix 原始收件人地址的 X-Original-To: 头
- 包含信封发件人地址的 Return-Path: 头
根据定义,maildir 格式在邮件投递或检索时不需要应用层文件锁定。
邮箱所有权
邮箱所有权由 virtual_uid_maps 和 virtual_gid_maps
查找表控制,这两个表均以完整收件人地址为索引。每个表分别提供数字形式的用户ID和组ID字符串。
virtual_minimum_uid 参数规定了 virtual_uid_maps
中用户ID的最小允许值。
大小写折叠
所有投递决策均基于转换为小写后的完整收件人地址。关于带有可选地址扩展名的特殊情况,请参阅下一节。
表搜索顺序
通常,查找表以文本文件形式指定,作为 postmap(1) 命令的输入。生成的索引文件采用
dbm 或 db 格式,供邮件系统快速搜索。
搜索顺序如下,首次成功匹配后即停止搜索:
o 当收件人带有可选地址扩展名时,首先查找 [email protected] 地址。
Postfix 2.1 之前的版本会始终忽略可选地址扩展名。
o 其次查找不带地址扩展名的 [email protected] 地址。
o 最后查找 @domain 收件人。
当表通过 NIS、LDAP 或 SQL 等方式提供时,搜索方式与普通索引文件相同。
此外,表也可以作为正则表达式映射提供,此时仅将完整收件人地址提供给正则表达式映射。
安全性
只要收件人用户/组ID信息的查找表得到适当保护,virtual(8)
投递代理就不存在安全隐患。该程序不支持在 chroot 环境下运行。
virtual(8) 投递代理禁止在正则表达式查找表中使用 $1 等替换操作,以避免安全漏洞。
virtual(8) 投递代理会静默忽略使用 proxymap(8)
服务器的请求,改为直接打开表。在 Postfix 2.2 之前版本中,虚拟投递代理会报致命错误并终止。
标准
RFC 822 (ARPA 互联网文本消息)
诊断
当收件人没有邮箱或超过磁盘配额时,邮件会被退回。其他问题情况下,已有收件人的邮件会被延迟投递并记录警告。
问题和事务会记录到 syslogd(8) 或 postlogd(8)。损坏的邮件文件会被标记,
以便队列管理器后续将其移至 corrupt 队列。
根据 notify_classes 参数设置,postmaster 会收到退信和其他问题的通知。
缺陷
该投递代理支持电子邮件地址和查找表键中的地址扩展名,但不会将地址扩展名信息传播到查找结果中。
Postfix 应有能返回多个结果属性的查找表。为避免维护三个表的不便,建议使用 LDAP 或 MySQL 数据库。
配置参数
对 main.cf 的更改会自动生效,因为 virtual(8)
进程运行时间有限。使用"postfix reload"命令可加速更改生效。
下文仅为参数摘要,详情及示例请参阅 postconf(5)。
邮箱投递控制
virtual_mailbox_base (空)
virtual(8) 投递代理添加到所有 $virtual_mailbox_maps
表查找结果路径名前的前缀。
virtual_mailbox_maps (空)
包含 $virtual_mailbox_domains 匹配域中所有有效地址的可选查找表。
virtual_minimum_uid (100)
virtual(8) 投递代理接受的 $virtual_uid_maps
表查找结果中用户ID的最小值。
virtual_uid_maps (空)
包含各收件人用户ID的查找表,virtual(8) 投递代理在写入邮箱时使用该ID。
virtual_gid_maps (空)
包含各收件人组ID的查找表,用于 virtual(8) 邮箱投递。
Postfix 2.0 及更高版本可用:
virtual_mailbox_domains ($virtual_mailbox_maps)
指定 Postfix 作为最终目的地的域名列表,邮件通过 $virtual_transport
邮件传输进行投递。
virtual_transport (virtual)
默认邮件传输和下一跳目的地,用于投递到 $virtual_mailbox_domains
所列域。
Postfix 2.5.3 及更高版本可用:
strict_mailbox_ownership (yes)
当邮箱文件不属于收件人所有时延迟投递。
锁定控制
virtual_mailbox_lock (参见 'postconf -d' 输出)
在尝试投递前锁定 UNIX 风格 virtual(8) 邮箱的方式。
deliver_lock_attempts (20)
尝试获取邮箱文件或 bounce(8) 日志文件独占锁的最大次数。
deliver_lock_delay (1秒)
尝试获取邮箱文件或 bounce(8) 日志文件独占锁的间隔时间。
stale_lock_time (500秒)
移除陈旧独占邮箱锁文件的超时时间。
资源和速率控制
virtual_mailbox_limit (51200000)
单个 virtual(8) 邮箱或 maildir 文件的最大字节大小,0 表示无限制。
在 qmgr(8) 守护进程中实现:
virtual_destination_concurrency_limit ($default_destination_concurrency_limit)
通过虚拟消息传输向同一目的地并行投递的最大数量。
virtual_destination_recipient_limit ($default_destination_recipient_limit)
虚拟消息传输每封邮件的最大收件人数。
杂项控制
config_directory (参见 'postconf -d' 输出)
Postfix main.cf 和 master.cf 配置文件的默认位置。
daemon_timeout (18000秒)
Postfix 守护进程处理请求的最长时间,超时后会被内置看门狗终止。
delay_logging_resolution_limit (2)
记录亚秒级延迟值时小数点后的最大位数。
ipc_timeout (3600秒)
通过内部通信通道发送或接收信息的超时时间。
max_idle (100秒)
空闲 Postfix 守护进程在主动终止前等待传入连接的最长时间。
max_use (100)
Postfix 守护进程在主动终止前处理的最大传入连接数。
process_id (只读)
Postfix 命令或守护进程的进程ID。
process_name (只读)
Postfix 命令或守护进程的进程名称。
queue_directory (参见 'postconf -d' 输出)
Postfix 顶级队列目录的位置。
syslog_facility (mail)
Postfix 日志的 syslog 设施。
syslog_name (参见 'postconf -d' 输出)
预置到 syslog 记录中进程名称的前缀,例如"smtpd"会变为"prefix/smtpd"。
Postfix 3.0 及更高版本可用:
virtual_delivery_status_filter ($default_delivery_status_filter)
virtual(8) 投递代理的可选过滤器,用于修改成功或失败投递的状态码或说明文本。
Postfix 3.3 及更高版本可用:
enable_original_recipient (yes)
在地址被重写为不同地址后(例如通过别名或规范映射),启用对原始收件人地址的支持。
service_name (只读)
Postfix 守护进程的 master.cf 服务名称。
Postfix 3.5 及更高版本可用:
info_log_address_format (external)
非调试日志(信息、警告等)中使用的电子邮件地址格式。
参见
qmgr(8),队列管理器
bounce(8),投递状态报告
postconf(5),配置参数
postlogd(8),Postfix 日志记录
syslogd(8),系统日志记录
自述文件
使用"postconf readme_directory"或
"postconf html_directory"查找此信息。
VIRTUAL_README,域名托管指南
许可证
必须随本软件分发 Secure Mailer 许可证。
历史
该投递代理最初基于 Postfix 本地投递代理。修改主要包括删除在此上下文中不适用或不安全的代码:
别名、~user/.forward 文件、投递到"|command"或/file/name。
Delivered-To: 消息头源自 Daniel Bernstein 的 qmail 系统。
maildir 结构源自 Daniel Bernstein 的 qmail 系统。
作者
Wietse Venema
IBM T.J. Watson 研究院
邮政信箱 704
美国纽约州约克镇高地 10598
Wietse Venema
Google 公司
美国纽约州纽约市第八大道 111 号 10011
Andrew McNamara
[email protected]
connect.com.au 有限公司
澳大利亚新南威尔士州北悉尼米勒街 213 号 3 层 2060
VIRTUAL(8)