SENDMAIL(1) SENDMAIL(1)
名称
sendmail - Postfix 与 Sendmail 的兼容接口
概要
sendmail [选项...] [收件人...]
mailq
sendmail -bp
newaliases
sendmail -I
描述
Postfix sendmail(1) 命令实现了 Postfix 与 Sendmail 的兼容接口。为保持与现有应用程序的兼容性,某些 Sendmail 命令行选项会被识别但静默忽略。
默认情况下,Postfix sendmail(1) 会从标准输入读取邮件内容,直到遇到 EOF 或仅包含单个 . 字符的行,然后安排投递。Postfix sendmail(1) 依赖 postdrop(1) 命令在 maildrop 目录中创建队列文件。
系统还提供了其他常见操作模式的特定命令别名:
mailq 列出邮件队列。每个条目显示队列文件 ID、邮件大小、到达时间、发件人以及仍需投递的收件人。如果上次投递失败,则会显示失败原因。队列 ID 字符串后可能跟随以下状态字符:
* 表示邮件在 active 队列中,即已被选中准备投递
! 表示邮件在 hold 队列中,即除非手动解除保留状态,否则不会尝试投递
# 表示邮件被强制过期(参见 postsuper(1) 的 -e 或 -f 选项)
此功能通过执行 postqueue(1) 命令实现
newaliases
初始化别名数据库。若未指定输入文件(使用下文所述的 -oA 选项),程序将处理 alias_database 配置参数指定的文件。若未指定别名数据库类型,则使用 default_database_type 配置参数指定的类型。此功能通过运行 postalias(1) 命令实现。
注意:别名数据库更新可能需要约一分钟才能生效。使用 "postfix reload" 命令可立即生效。
通过指定适当的命令行选项组合,可以选择这些及其他功能。部分功能由 main.cf 配置文件中的参数控制。
系统支持以下选项:
-Am (忽略)
-Ac (忽略)
Postfix sendmail 使用相同的配置文件,无论邮件是初始提交还是转发
-B body_type
指定邮件正文的 MIME 类型:7BIT 或 8BITMIME
-bd 进入守护进程模式。此功能通过执行 "postfix start" 命令实现
-bh (忽略)
-bH (忽略)
Postfix 没有持久化的主机状态数据库
-bi 初始化别名数据库。功能等同于上文所述的 newaliases 命令
-bl 进入守护进程模式。要像 Sendmail 的 -bl 选项那样仅接受本地连接,需在 Postfix main.cf 配置文件中设置 "inet_interfaces = loopback"
-bm 从标准输入读取邮件并安排投递(默认操作模式)
-bp 列出邮件队列。功能等同于上文所述的 mailq 命令
-bs 独立 SMTP 服务器模式。从标准输入读取 SMTP 命令,并向标准输出写入响应。在此模式下,邮件中继和其他访问控制默认禁用。要以启用这些功能,需以 mail_owner 用户身份运行该进程。
此功能通过运行 smtpd(8) 守护进程实现
-bv 不收集或投递邮件,而是验证每个收件人地址后发送电子邮件报告。适用于测试地址重写和路由配置。
此功能在 Postfix 2.1 及更高版本中可用
-C config_file
-C config_dir
指定 Postfix main.cf 文件或其父目录的路径。Postfix 2.3 之前的版本会忽略此信息。
在 Postfix 3.2 及更高版本中,非默认目录必须通过 main.cf 文件中的 alternate_config_directories 或 multi_instance_directories 参数授权。
所有 Postfix 版本都支持通过 MAIL_CONFIG 环境变量指定目录路径来覆盖配置文件位置
-F full_name
设置发件人全名。这会覆盖 NAME 环境变量,仅适用于没有 From: 邮件头的消息
-f sender
设置信封发件人地址(用于投递问题反馈)。在 Postfix 2.1 之前版本中,Errors-To: 邮件头会覆盖错误返回地址
-G 网关(中继)提交模式(与初始用户提交相对)。此模式下,要么完全不重写地址,要么用 remote_header_rewrite_domain 指定的域名信息更新不完整地址。
此选项在 Postfix 2.3 之前版本中会被忽略
-h hop_count (忽略)
跳数限制。请改用 hopcount_limit 配置参数
-I 初始化别名数据库。功能等同于上文所述的 newaliases 命令
-i 从标准输入读取时,不将仅包含 . 字符的行视为输入结束
-L label (忽略)
日志标签。请改用 syslog_name 配置参数
-m (忽略)
保持向后兼容
-N dsn (默认:'delay, failure')
投递状态通知控制。可指定以下逗号分隔的列表:
failure(投递失败时发送通知)
delay(投递延迟时发送通知)
success(成功投递后发送通知)
或指定 never(完全不发送通知)
此功能在 Postfix 2.3 及更高版本中可用
-O requiretls
要求投递时必须使用带有有效服务器证书的 TLS 连接,且服务器必须支持 REQUIRETLS。会尝试多个服务器,若所有尝试的服务器都无法满足要求,则将邮件退回为无法投递。"requiretls" 选项值不区分大小写。
此功能在 Postfix 3.10 及更高版本中可用
-O smtputf8
要求服务器必须支持 SMTPUTF8。会尝试多个服务器,当邮件包含 UTF8 信封地址或邮件头但所有尝试的服务器都不支持 SMTPUTF8 时,将邮件退回为无法投递。"smtputf8" 选项值不区分大小写。
此功能在 Postfix 3.10 及更高版本中可用
-n (忽略)
保持向后兼容
-oAalias_database
指定非默认别名数据库。格式为 pathname 或 type:pathname。详见 postalias(1)
-O option=value (忽略)
设置指定选项的值。请改用 main.cf 中的等效配置参数
-o7 (忽略)
-o8 (忽略)
要发送 8 位或二进制内容,请使用适当的 MIME 封装并指定相应的 -B 命令行选项
-oi 从标准输入读取时,不将仅包含 . 字符的行视为输入结束
-om (忽略)
在别名扩展等操作中从不排除发件人
-o x value (忽略)
设置选项 x 的值。请改用 main.cf 中的等效配置参数
-r sender
设置信封发件人地址(用于投递问题反馈)。在 Postfix 2.1 之前版本中,Errors-To: 邮件头会覆盖错误返回地址
-R return
投递状态通知控制。可指定:
"hdrs"(仅返回退回邮件的邮件头)
"full"(返回完整副本,默认行为)
-R 选项指定上限:当完整副本超过 bounce_size_limit 设置时,Postfix 将只返回邮件头
此选项在 Postfix 2.10 之前版本中会被忽略
-q 尝试投递所有队列中的邮件。通过执行 postqueue(1) 命令实现
警告:频繁刷新无法投递的邮件会导致其他邮件的投递性能下降
-qinterval (忽略)
队列运行间隔。请改用 queue_run_delay 配置参数
-qIqueueid
立即投递指定队列 ID 的邮件。通过执行 postqueue(1) 命令实现,适用于 Postfix 2.4 及更高版本
-qRsite
立即投递指定站点的所有队列邮件。此选项仅接受符合"快速刷新"服务条件的站点名称,通过执行 postqueue(1) 命令实现。详见 flush(8) 关于"快速刷新"服务的说明
-qSsite
此命令未实现。请改用较慢的"sendmail -q"命令
-t 从邮件头中提取收件人,并添加到命令行指定的收件人列表中
在 Postfix 2.1 之前版本中,此选项要求命令行中不能指定收件人地址
-U (忽略)
初始用户提交
-V envid
为支持 DSN 的服务器指定信封 ID 以便通知
此功能在 Postfix 2.3 及更高版本中可用
-XV (Postfix 2.2 及更早版本:-V)
可变信封返回路径(VERP)。对于形如 owner-listname@origin 的发件人地址,每个收件人 user@domain 将收到带有个性化发件人地址的邮件。
默认个性化发件人地址格式为 owner-listname+user=domain@origin。默认的 + 和 = 分隔符可通过 default_verp_delimiters 配置参数修改
-XVxy (Postfix 2.2 及更早版本:-Vxy)
功能同 -XV,但使用 x 和 y 作为 VERP 分隔符,而非 default_verp_delimiters 配置参数指定的字符
-v 发送首次投递尝试的电子邮件报告(Postfix 2.1 及更高版本)。邮件投递始终在后台进行。指定多个 -v 选项时,会启用详细日志记录用于调试
-X log_file (忽略)
记录邮件传输日志。请改用 debug_peer_list 和 debug_peer_level 配置参数
安全
根据设计,本程序未设置用户(或组)ID。它能够处理来自不受信任的(可能是远程)用户的邮件内容。
然而,与大多数 Postfix 程序一样,本程序不对其命令行参数强制执行安全策略,而是依赖 UNIX 系统根据进程的有效用户和组 ID 来实施访问控制。具体而言,这意味着以 root 身份(通过 sudo 或类似方式)代表非 root 用户运行 Postfix 命令可能会产生权限升级风险。
如果应用程序代表没有正常 shell 访问权限的用户运行任何 Postfix 程序,则该应用程序必须限制用户指定的命令行参数以防止权限升级:
o 过滤所有命令行参数,特别是包含路径名或指定数据库访问方法的参数。这些路径名检查必须拒绝用户控制的指向敏感文件的符号链接或硬链接,且不能存在 TOCTOU 竞争条件漏洞
o 对所有包含用户数据的命令参数禁用选项处理。例如,Postfix sendmail(1) 命令行必须按以下格式构造:
/path/to/sendmail 系统参数 -- 用户参数
其中 "--" 会禁用后续所有 用户参数 的选项处理
若缺少 "--",恶意用户可能通过指定以 "-" 开头的电子邮件地址来启用 Postfix sendmail(1) 命令选项
诊断
问题会记录到 syslogd(8) 或 postlogd(8),同时输出到标准错误流
环境变量
MAIL_CONFIG
Postfix 配置文件所在目录
MAIL_VERBOSE(值无关紧要)
启用详细日志记录用于调试
MAIL_DEBUG(值无关紧要)
启用外部命令调试,具体命令由 debugger_command 配置参数指定
NAME 发件人全名。仅用于没有 From: 邮件头的消息(另见上文的 -F 选项)
配置参数
以下 main.cf 参数与本程序特别相关。下文仅提供参数摘要,详见 postconf(5)(含示例)。
兼容性控制
(Postfix 2.9 及更高版本):
sendmail_fix_line_endings (always)
控制 Postfix sendmail 命令如何将邮件行结尾从 <CR><LF> 转换为 UNIX 格式 (<LF>)
故障排除控制
DEBUG_README 文件提供了 Postfix 系统故障排除的示例
debugger_command (empty)
当 Postfix 守护程序使用 -D 选项调用时执行的外部命令
debug_peer_level (2)
当下一跳目的地、远程客户端或服务器名称/网络地址匹配 debug_peer_list 参数指定的模式时,日志详细级别的增加量
debug_peer_list (empty)
可指定下一跳目的地、远程客户端或服务器名称/网络地址的模式列表,匹配时将日志详细级别提高 debug_peer_level 指定的量
访问控制
(Postfix 2.2 及更高版本):
authorized_flush_users (static:anyone)
有权刷新队列的用户列表
authorized_mailq_users (static:anyone)
有权查看队列的用户列表
authorized_submit_users (static:anyone)
有权使用 sendmail(1) 命令(及特权辅助命令 postdrop(1))提交邮件的用户列表
资源和速率控制
bounce_size_limit (50000)
在未送达通知中返回的原始邮件内容的最大字节数
fork_attempts (5)
尝试 fork() 子进程的最大次数
fork_delay (1s)
fork() 子进程尝试之间的延迟时间
hopcount_limit (50)
主邮件头中允许的最大 Received: 头数量
queue_run_delay (300s)
队列管理器扫描延迟队列的时间间隔(Postfix 2.4 之前默认为 1000s)
快速刷新控制
ETRN_README 详细说明了 Postfix "快速刷新"服务的配置和操作
fast_flush_domains ($relay_domains)
可指定目标列表,这些目标的邮件将记录到单独的日志文件
VERP 控制
VERP_README 详细说明了 Postfix 对可变信封返回路径地址的支持
default_verp_delimiters (+=)
两个默认的 VERP 分隔符
verp_delimiter_filter (-=+)
Postfix 在 sendmail(1) 命令行和 SMTP 命令中接受的 VERP 分隔符
其他控制
alias_database (参见 'postconf -d' 输出)
由 "newaliases" 或 "sendmail -bi" 更新的 local(8) 投递使用的别名数据库
command_directory (参见 'postconf -d' 输出)
所有 postfix 管理命令的位置
config_directory (参见 'postconf -d' 输出)
Postfix main.cf 和 master.cf 配置文件的默认位置
daemon_directory (参见 'postconf -d' 输出)
Postfix 支持程序和守护程序所在目录
default_database_type (参见 'postconf -d' 输出)
newaliases(1)、postalias(1) 和 postmap(1) 命令使用的默认数据库类型
delay_warning_time (0h)
当邮件仍在队列中时,向发件人发送邮件头副本的延迟时间
import_environment (参见 'postconf -d' 输出)
特权 Postfix 进程将从非 Postfix 父进程导入的环境变量列表,或 name=value 形式的环境变量覆盖
mail_owner (postfix)
拥有 Postfix 队列和大多数守护进程的 UNIX 系统账户
queue_directory (参见 'postconf -d' 输出)
Postfix 顶级队列目录的位置
remote_header_rewrite_domain (empty)
当参数值非空时,重写或添加来自远程客户端邮件的邮件头,使用指定域名更新不完整地址并添加缺失的邮件头
syslog_facility (mail)
Postfix 日志的 syslog 设施
syslog_name (参见 'postconf -d' 输出)
在 syslog 记录中预置到进程名称的前缀(例如 "smtpd" 变为 "prefix/smtpd")
(Postfix 3.2 及更高版本):
alternate_config_directories (empty)
可通过 "-c config_directory" 命令行选项(对 sendmail(1) 使用 "-C" 选项)或 MAIL_CONFIG 环境变量指定的非默认 Postfix 配置目录列表
multi_instance_directories (empty)
可选的非默认 Postfix 配置目录列表,这些目录属于与默认 Postfix 实例共享可执行文件和文档的其他实例,并与默认实例一起启动/停止等
(Postfix 3.10 及更高版本):
requiretls_enable (yes)
启用对 RFC 8689 定义的 ESMTP 动词 "REQUIRETLS" 的支持
文件
/var/spool/postfix 邮件队列
/etc/postfix 配置文件
参见
pickup(8) 邮件收取守护进程
qmgr(8) 队列管理器
smtpd(8) SMTP 服务器
flush(8) 快速刷新服务
postsuper(1) 队列维护
postalias(1) 创建/更新/查询别名数据库
postdrop(1) 邮件投递工具
postfix(1) 邮件系统控制
postqueue(1) 邮件队列控制
postlogd(8) Postfix 日志记录
syslogd(8) 系统日志记录
说明文件
使用 "postconf readme_directory" 或 "postconf html_directory" 查找这些文件
DEBUG_README Postfix 调试指南
ETRN_README Postfix ETRN 指南
VERP_README Postfix VERP 指南
许可证
本软件必须随附 Secure Mailer 许可证
作者
Wietse Venema
IBM T.J. Watson 研究中心
邮政信箱 704 号
美国纽约州约克镇高地 10598
Wietse Venema
Google 公司
纽约第八大道 111 号
美国纽约 10011
SENDMAIL(1)