PIPE(8) PIPE(8)
名称
pipe - Postfix 外部命令投递代理
概要
pipe [通用 Postfix 守护进程选项] 命令属性...
描述
pipe(8) 守护进程负责处理来自 Postfix 队列管理器的请求,将邮件投递给外部命令执行。
该程序需通过 master(8) 进程管理器启动运行。
邮件属性(如发件人地址、收件人地址和下一跳主机名)可作为命令行宏指定,
这些宏会在执行外部命令前自动展开。
pipe(8) 守护进程会更新队列文件,将收件人标记为已完成投递,
或通知队列管理器稍后重试投递。投递状态报告将根据情况发送至
bounce(8)、defer(8) 或 trace(8) 守护进程。
单收件人投递
某些目标设备(如传呼机或传真机)每次只能处理一个收件人。
此外,当需要添加 Delivered-to: 或 X-Original-To: 邮件头时,
也应避免多收件人投递。
要限制 Postfix 每次只投递一个收件人,需在 Postfix main.cf 文件中指定:
transport_destination_recipient_limit = 1
其中 transport 是 Postfix master.cf 文件中管道传输服务的名称。
命令属性语法
外部命令属性需在 master.cf 文件的服务定义末尾指定,语法如下:
chroot=路径名(可选)
在执行前将进程的根目录和工作目录更改为指定路径。
此操作会在切换用户权限(通过 user 属性指定)和
执行 directory=路径名 指令前完成。
若执行失败将延迟投递。
本功能自 Postfix 2.3 起可用。
directory=路径名(可选)
在执行外部命令前切换到指定目录。
该目录必须对 user 属性指定的用户可访问。
默认工作目录为 $queue_directory。
若执行失败将延迟投递。
本功能自 Postfix 2.2 起可用。
eol=字符串(默认值:\n)
输出记录分隔符,通常使用 \r\n 或 \n。
支持标准的 C 风格转义序列:
\a \b \f \n \r \t \v \ddd(最多三位八进制数)
以及 \\。
flags=BDFORXhqu.>(可选)
邮件处理标志,默认保持邮件内容不变:
B 在每封邮件末尾添加空行(某些邮件客户端需要)
D 添加 Delivered-To: 收件人 邮件头
(需配合单收件人投递设置使用)
F 添加 From 发件人 时间戳 信封头
(UUCP 等软件需要)
O 添加 X-Original-To: 收件人 邮件头
(需配合单收件人投递设置使用)
R 添加 Return-Path: 邮件头显示信封发件人
X 标记该命令执行最终投递
(影响状态报告中的"已投递"状态)
h 将地址域名部分转换为小写(建议 UUCP 使用)
q 对地址本地部分进行 RFC 822 引用编码
(建议 UUCP 或 BSMTP 使用)
u 将地址本地部分转换为小写(建议 UUCP 使用)
. 在行首为"."的行前添加"."(BSMTP 需要)
> 在行首为"From "的行前添加">"(UUCP 需要)
null_sender=替代文本(默认:MAILER-DAEMON)
当发件人地址为空时(通常用于投递状态通知),
将其替换为指定文本。
注意:在命令行中使用空发件人地址时,
应确保正确解析格式,例如:
正确写法:command -f $sender -- $recipient
错误写法:command -f$sender -- $recipient
本功能自 Postfix 2.3 起可用。
size=大小限制(可选)
拒绝投递超过指定大小(字节)的邮件。
user=用户名(必需)
user=用户名:组名
以指定用户身份执行命令,禁止使用 root 或
邮件系统所有者权限。
argv=命令...(必需)
要执行的外部命令(必须作为最后一个属性)。
命令直接执行,不经过 shell 解释器。
对于包含空格、以"{"开头或需要空字符串的参数,
需用"{"和"}"包围(Postfix 3.0 及以上版本支持)。
命令参数支持以下宏替换(Postfix 3.0+ 也支持 $name 格式):
${client_address} 客户端 IP 地址
${client_helo} 客户端 HELO 参数
${client_hostname} 客户端主机名
${client_port} 客户端端口号
${client_protocol} 客户端协议
${domain} 收件人域名部分
${envid} 信封 ID(RFC 3461)
${extension} 收件人地址扩展名
${mailbox} 收件人本地部分
${nexthop} 下一跳主机
${original_recipient} 原始收件人地址
${queue_id} 队列 ID
${recipient} 当前收件人地址
${requiretls} REQUIRETLS 选项
${sasl_method} SASL 认证机制
${sasl_sender} SASL 发件人
${sasl_username} SASL 用户名
${sender} 信封发件人地址
${size} 邮件大小
${user} 收件人用户名部分
标准
RFC 3463(增强状态码)
诊断
命令退出状态应符合 <sysexits.h> 规范:
- 状态 0 表示成功
- 非零状态时记录有限输出
- 输出以增强状态码开头时优先使用该状态码(Postfix 2.3+)
- 成功投递后也记录有限输出(Postfix 3.0+)
问题记录到 syslogd(8) 或 postlogd(8),
损坏的邮件会移至 corrupt 队列检查。
安全
本程序需要双重权限:
1) 访问 Postfix 私有队列和 IPC 机制
2) 以指定用户身份执行命令
属于敏感安全组件。
配置参数
对 main.cf 的修改会自动生效,因为 pipe(8) 进程的运行时间有限。
执行 "postfix reload" 命令可立即应用更改。
下文仅列出参数摘要,详见 postconf(5) 获取完整说明及示例。
资源与速率控制
以下参数中,transport 指 master.cf 条目中的传输服务名。
transport_time_limit ($command_time_limit)
覆盖特定传输服务的命令超时限制
由 qmgr(8) 守护进程实现的参数:
transport_destination_concurrency_limit ($default_destination_concurrency_limit)
覆盖特定传输服务的默认目标并发数限制
transport_destination_recipient_limit ($default_destination_recipient_limit)
覆盖特定传输服务的默认收件人数限制
其他控制参数
config_directory (参见 'postconf -d' 输出)
Postfix 配置文件 main.cf 和 master.cf 的默认位置
daemon_timeout (18000秒)
守护进程处理请求的最长时间,超时后会被监控程序终止
delay_logging_resolution_limit (2)
日志中延迟值的小数点后最大位数
export_environment (参见 'postconf -d' 输出)
Postfix 进程向非 Postfix 进程导出的环境变量列表
ipc_timeout (3600秒)
内部通信通道的信息传输超时限制
mail_owner (postfix)
拥有 Postfix 队列和多数守护进程的 UNIX 系统账户
max_idle (100秒)
空闲守护进程等待新连接的最长时间
max_use (100)
守护进程自动终止前处理的最大连接数
process_id (只读)
Postfix 命令或守护进程的进程 ID
process_name (只读)
Postfix 命令或守护进程的进程名
queue_directory (参见 'postconf -d' 输出)
Postfix 顶级队列目录位置
recipient_delimiter (空)
用于分隔电子邮件地址本地部分、用户名或 .forward 文件名与扩展名的字符集
syslog_facility (mail)
Postfix 日志的 syslog 设施
syslog_name (参见 'postconf -d' 输出)
预置在 syslog 记录中进程名前的前缀,例如将 "smtpd" 变为 "prefix/smtpd"
Postfix 3.0 及以上版本新增:
pipe_delivery_status_filter ($default_delivery_status_filter)
可选过滤器,用于修改 pipe(8) 投递代理的成功/失败状态码或说明文本
Postfix 3.3 及以上版本新增:
enable_original_recipient (是)
启用地址改写后对原始收件人地址的支持(如别名或规范映射时)
service_name (只读)
Postfix 守护进程在 master.cf 中的服务名
Postfix 3.5 及以上版本新增:
info_log_address_format (external)
非调试日志(info, warning等)中使用的电子邮件地址格式
参见
qmgr(8) 队列管理器
bounce(8) 投递状态报告
postconf(5) 配置参数
master(5) 守护进程选项
master(8) 进程管理器
postlogd(8) 日志记录
syslogd(8) 系统日志
许可
使用需遵循 Secure Mailer 许可证。
作者
Wietse Venema
IBM T.J. Watson 研究院
美国纽约州约克镇高地
Wietse Venema
Google 公司
美国纽约州纽约市
PIPE(8)