POSTSUPER(1) POSTSUPER(1)
名称
postsuper - Postfix 队列管理工具
概要
postsuper [-psSv]
[-c config_dir] [-d queue_id]
[-e queue_id] [-f queue_id]
[-h queue_id] [-H queue_id]
[-r queue_id] [directory ...]
描述
postsuper(1) 命令用于维护 Postfix 邮件队列。该命令仅限于超级用户使用。
普通用户可使用 postqueue(1) 命令执行无特权的队列操作,例如查看或清空邮件队列。
默认情况下,postsuper(1) 会对所有 Postfix 队列目录执行 -s 和 -p 选项指定的操作,
包括存放消息文件的 incoming、active、deferred 和 hold 目录,
以及存放日志文件的 bounce、defer、trace 和 flush 目录。
选项说明:
-c config_dir
指定 main.cf 配置文件所在目录(替代默认配置目录)。
另请参阅下文的环境变量 MAIL_CONFIG 说明。
-d queue_id
从指定邮件队列中删除具有特定队列 ID 的消息(默认操作范围:hold、
incoming、active 和 deferred 队列)。
如需删除多个文件,可多次指定 -d 选项,或使用 queue_id 参数值为 -,
从标准输入读取队列 ID。例如删除所有收件人仅为 [email protected] 的邮件:
postqueue -j | jq -r '
# 参见 postqueue(1) 手册中的 JSON 对象格式章节
select(.recipients[0].address == "[email protected]")
| select(.recipients[1].address == null)
| .queue_id
' | postsuper -d -
(注意使用 "jq -r" 选项),或传统格式:
mailq | tail -n +2 | grep -v '^ *(' | awk 'BEGIN { RS = "" }
# $7=发件人, $8=收件人1, $9=收件人2
{ if ($8 == "[email protected]" && $9 == "")
print $1 }
' | tr -d '*!' | postsuper -d -
使用 "-d ALL" 可删除所有消息,例如 "-d ALL deferred"
可删除 deferred 队列中的所有邮件。安全措施:必须使用大写的 ALL。
警告:Postfix 队列 ID 会被重复使用(Postfix ≤ 2.8 版本始终如此;
Postfix ≥ 2.9 版本在 enable_long_queue_ids=no 时也会重复使用)。
当 Postfix 邮件系统正在投递邮件时执行 postsuper,有极小概率会删除错误的消息文件。
具体场景如下:
1) Postfix 队列管理器已删除 postsuper(1) 指定要删除的消息,
因为 Postfix 已完成对该消息的处理(已投递或已退回发件人)。
2) 新邮件到达,并被分配了与 postsuper(1) 要删除的消息相同的队列 ID。
重复使用已删除队列 ID 的概率约为 1/2^15(系统时钟在一秒内可区分的微秒值数量)。
3) postsuper(1) 误删了新消息而非本应删除的旧消息。
-e queue_id
-f queue_id
强制使指定队列中具有特定队列 ID 的消息过期(默认操作范围:
hold、incoming、active 和 deferred 队列)。
o 当队列管理器尝试投递时,消息将被退回发件人
(注意:Postfix 永远不会投递 hold 队列中的消息)。
o -e 和 -f 选项都要求强制过期。区别在于 -f 会同时释放
hold 队列中的消息。而使用 -e 时,此类消息需通过 -f 或
-H 释放后才会退回发件人。
o 当延迟消息被强制过期时,退回邮件会说明延迟原因。
否则退回原因将显示"消息被管理员强制过期"。
要使多个消息过期,可多次指定 -e 或 -f 选项,或使用 queue_id 参数值为 -
从标准输入读取队列 ID(示例可参考 -d 选项部分,注意替换选项)。
使用 "-e ALL" 或 "-f ALL" 可使所有消息过期,例如
"-e ALL deferred" 可使 deferred 队列中的所有邮件过期。
安全措施:必须使用大写的 ALL。
本功能在 Postfix 3.5 及更高版本中可用。
-h queue_id
将消息置于"保留"状态暂停投递。将指定队列 ID 的消息从原队列
(默认:incoming、active 和 deferred)移至 hold 队列。
要保留多个消息,可多次指定 -h 选项,或使用 queue_id 参数值为 -
从标准输入读取队列 ID。
使用 "-h ALL" 可保留所有消息,例如 "-h ALL deferred"
可保留 deferred 队列中的所有邮件。安全措施:必须使用大写的 ALL。
注意:处于"保留"状态的邮件不会因超过 maximal_queue_lifetime 或
bounce_queue_lifetime 设置的时间而过期。
只有在释放"保留"状态后才会开始计算过期时间。
本功能在 Postfix 2.0 及更高版本中可用。
-H queue_id
释放被"保留"的邮件。将指定队列 ID 的消息从原队列
(默认:hold)移至 deferred 队列。
要释放多个消息,可多次指定 -H 选项,或使用 queue_id 参数值为 -
从标准输入读取队列 ID。
注意:对于保留时间超过 $maximal_queue_lifetime 或
$bounce_queue_lifetime 设置值较长时间的邮件,
建议使用 "postsuper -r" 命令进行释放。
使用 "-H ALL" 可释放所有被保留的邮件。安全措施:必须使用大写的 ALL。
本功能在 Postfix 2.0 及更高版本中可用。
-p 清除系统或软件崩溃后残留的临时文件。
注意:-p、-s 和 -S 操作会优先于其他操作执行。
-r queue_id
将指定队列 ID 的消息重新排队(默认操作范围:hold、
incoming、active 和 deferred 队列)。
要重新排队多个消息,可多次指定 -r 选项,或使用 queue_id 参数值为 -
从标准输入读取队列 ID。
使用 "-r ALL" 可重新排队所有消息。安全措施:必须使用大写的 ALL。
重新排队的消息会被移至 maildrop 队列,随后由 pickup(8) 和
cleanup(8) 守护进程复制到新队列文件。其处理方式在多个方面
与新邮件的本地提交有所不同:
o 不会应用 smtpd_milters 或 non_smtpd_milters 设置。
当邮件已通过外部内容过滤器时,这会导致依赖原始 SMTP 连接
状态信息的 Milter 应用程序产生错误结果。
o 会再次执行邮件地址重写和替换。这在重写规则或虚拟映射
发生变化时非常有用。地址重写上下文(本地或远程)与消息
接收时保持一致。
o 会应用与新本地邮件提交相同的 content_filter 设置。
这在内容过滤器设置发生变化时非常有用。
警告:Postfix 队列 ID 会被重复使用(Postfix ≤ 2.8 版本始终如此;
Postfix ≥ 2.9 版本在 enable_long_queue_ids=no 时也会重复使用)。
当 Postfix 邮件系统正在运行时执行 postsuper(1),有极小概率会
重新排队错误的消息文件,但通常不会造成损害。
本功能在 Postfix 1.1 及更高版本中可用。
-s 执行队列结构检查和修复。应在 Postfix 启动前执行一次。
注意:-p、-s 和 -S 操作会优先于其他操作执行。
o 重命名文件名与消息文件 inode 编号不匹配的文件。
当从其他机器或备份恢复邮件队列时需要进行此操作,
特别是队列文件创建于 Postfix ≤ 2.8 或设置了
"enable_long_queue_ids = no" 的情况下。
o 移动位置错误的队列文件,并删除不再需要的子目录。
当 hash_queue_names 和/或 hash_queue_depth
配置参数发生变化后,需要进行此操作。
o 将创建于 "enable_long_queue_ids = yes" 环境下的队列文件
重命名为短名称,以便迁移到 Postfix ≤ 2.8。操作步骤如下:
# postfix stop
# postconf enable_long_queue_ids=no
# postsuper
重复执行 postsuper(1) 直到不再报告文件名变更。
-S -s 的冗余版本,额外要求长文件名也必须匹配消息文件 inode 编号。
本选项仅用于测试目的,在 Postfix 2.9 及更高版本中可用。
注意:-p、-s 和 -S 操作会优先于其他操作执行。
-v 启用详细日志记录用于调试。每增加一个 -v 选项,
都会提高软件的日志详细程度。
诊断
问题会同时报告到标准错误流和 syslogd(8) 或 postlogd(8)。
postsuper(1) 会报告以下统计信息:
- 使用 -d 删除的消息数量
- 使用 -e 过期的消息数量
- 使用 -f 过期或释放的消息数量
- 使用 -h 或 -H 保留或释放的消息数量
- 使用 -r 重新排队的消息数量
- 使用 -s 修复的队列文件名数量
这些统计信息会写入标准错误流和 syslogd(8) 或 postlogd(8)。
环境变量
MAIL_CONFIG
main.cf 配置文件所在目录。
已知问题
未经 Postfix 处理的邮件(即 maildrop 队列中的邮件)无法被置为"保留"状态。
配置参数
以下 main.cf 参数与本命令特别相关。下文仅提供参数摘要,
完整说明请参阅 postconf(5) 手册(包含示例)。
config_directory (参见 'postconf -d' 输出)
Postfix main.cf 和 master.cf 配置文件的默认位置。
hash_queue_depth (1)
hash_queue_names 参数所列队列目录的子目录层级数。
hash_queue_names (deferred, defer)
需要分割到多个子目录层级的队列目录名称。
import_environment (参见 'postconf -d' 输出)
特权 Postfix 进程从非 Postfix 父进程继承的环境变量列表,
或 name=value 形式的环境变量覆盖设置。
queue_directory (参见 'postconf -d' 输出)
Postfix 顶级队列目录的位置。
syslog_facility (mail)
Postfix 日志记录的 syslog 设施。
syslog_name (参见 'postconf -d' 输出)
在 syslog 记录中预置到进程名称前的字符串,
例如 "smtpd" 会变为 "prefix/smtpd"。
Postfix 2.9 及更高版本新增:
enable_long_queue_ids (no)
启用长格式、非重复的队列 ID(队列文件名)。
参见
sendmail(1), Sendmail 兼容的用户界面
postqueue(1), 非特权队列操作
postlogd(8), Postfix 日志记录
syslogd(8), 系统日志记录
许可
本软件必须随附 Secure Mailer 许可证。
作者
Wietse Venema
IBM T.J. Watson 研究院
美国纽约州约克镇高地 704 号信箱,邮编 10598
Wietse Venema
谷歌公司
美国纽约州纽约市第八大道 111 号,邮编 10011
POSTSUPER(1)