如何清除/重置 Postfix 队列

如何清除/重置 Postfix 队列

我最近发现我们的一台 Ubuntu 服务器每分钟生成数十封通知电子邮件,并限制了它与其他几台服务器共享的 Office 365 中继帐户。我停止了这台服务器上的 Postfix 服务,并禁用了生成所有这些警报(以及随后的传递失败消息级联)的脚本。但是,我没有考虑到 Postfix 队列管理器,它保留了数千条这样的消息,并在我重新启动 Postfix 时尝试再次发送它们。

我第一次尝试清除队列,虽然有点笨拙,但尝试方法是导航到队列目录/var/spool/postfix并手动从“活动”和“传入”文件夹中删除文件。但是,当我运行时,postqueue -p队列中仍然显示大量电子邮件。

完全重置或清除 Postfix 队列的最佳方法是什么?

答案1

您应该使用postsuper命令从 Postfix 队列中删除消息 - 该-d <queueid>选项将删除具有指定队列 ID 的消息。

我正在使用类似以下脚本来运行邮件队列中的所有消息:

mailq | awk '$7~/@/{print$1}' | while read qid; do postsuper -d $qid; done

答案2

由于您直接弄乱了队列的文件,您可能需要发出一个postsuper -p

-p 清除系统或软件崩溃后留下的旧临时文件。


几年前,我编写了一个小脚本,以便更好地处理 Postfix 邮件队列中的某些情况,而不仅仅是执行临时的一行代码。将来您可能会发现它很有用。

$ cat /usr/local/sbin/postclear

#!/bin/bash

usage() {
        echo "${0/*\/} --from <address1> [<address2> .. <addressN>]"
        echo "${0/*\/} --bounce <address1> [<address2> .. <addressN>]"
        echo "${0/*\/} --to <address1> [<address2> .. <addressN>]"
}

if [ $# -lt 2 ]; then
        usage 1>&2 ;
        exit 1;
fi


case $1 in
        --from )
                shift
                while (( $# )) ; do
                        postqueue -p | grep -e "$1" | grep -Eo '^[A-F0-9]+' | postsuper -d -
                        shift
                done
                exit;;
        --bounce )
                shift
                while (( $# )) ; do
                        postqueue -p | grep -E -B2 -e "$1" | grep MAILER-DAEMON | grep -Eo '^[A-F0-9]+' | postsuper -d -
                        shift
                done
                exit;;
        --to )
                shift
                while (( $# )) ; do
                        postqueue -p | grep -E -B2 -e "$1" | grep -Eo '^[A-F0-9]+' | postsuper -d -
                        shift
                done
                exit;;
        * )
                echo "Unknown option $1" >&2
                exit 1;;
esac

相关内容