Postfix

如何清除/重置 Postfix 隊列

  • December 22, 2020

我最近發現我們的一個 Ubuntu 伺服器每分鐘生成數十封通知電子郵件,並限制了它與少數其他伺服器共享的 Office 365 中繼帳戶。我停止了該伺服器上的 Postfix 服務並禁用了生成所有這些警報(以及隨後的傳遞失敗消息的級聯)的腳本。但是,我沒有考慮 Postfix 隊列管理器,它保留了數千條這樣的消息,並在我重新啟動 Postfix 時嘗試再次發送它們。

我第一次嘗試清除隊列是笨拙的,是導航到隊列目錄/var/spool/postfix並手動從“活動”和“傳入”文件夾中刪除文件。但是,當我執行postqueue -p大量電子郵件時,隊列中仍然出現。

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

您應該使用該postsuper命令從 Postfix 隊列中刪除消息 - 該-d <queueid>選項將刪除具有指定隊列 ID 的消息。

我正在使用類似這個腳本的東西來遍歷郵件隊列中的所有消息:

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

由於您直接弄亂了隊列的文件,您可能需要發出postsuper -p.

-p 清除系統或軟體崩潰後遺留的舊臨時文件。


幾年前,a 寫了一個小腳本來更好地處理 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

引用自:https://serverfault.com/questions/1047113