如何永久刪除 sendmail 佇列中的電子郵件並防止它們再次出現?

如何永久刪除 sendmail 佇列中的電子郵件並防止它們再次出現?

我這裡有一個非常煩人的問題。我一直在測試一個應用程序,並創建了一些測試電子郵件到虛假的電子郵件地址(更不用說我的伺服器並沒有真正設置為發送電子郵件)。當然,sendmail無法發送這些訊息並且它們一直卡在sendmail隊列中。我想手動刪除佇列中累積的訊息,而不是等待sendmail通常需要 5 天的時間才能停止重試。

我使用的是 Ubuntu 10.04,/var/spool/mqueue/我讀過的所有指南都在這個目錄中保存了排隊的電子郵件。當我刪除此目錄中的文件時,sendmail停止嘗試處理電子郵件,直到看起來像是 cron 腳本運行並用我不想發送的消息重新填充此目錄。以下是我的一些內容syslog

Jun  2 17:35:19 sajo-laptop sm-mta[9367]: o530SlbK009365: to=, ctladdr= (33/33), delay=00:06:27, xdelay=00:06:22, mailer=esmtp, pri=120418, relay=e.mx.mail.yahoo.com. [67.195.168.230], dsn=4.0.0, stat=Deferred: Connection timed out with e.mx.mail.yahoo.com.
Jun  2 17:35:48 sajo-laptop sm-mta[9149]: o4VHn3cw003597: to=, ctladdr= (33/33), delay=2+06:46:45, xdelay=00:34:12, mailer=esmtp, pri=3540649, relay=mx2.hotmail.com. [65.54.188.94], dsn=4.0.0, stat=Deferred: Connection timed out with mx2.hotmail.com.
Jun  2 17:39:02 sajo-laptop CRON[9510]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -n 200 -r -0 rm)
Jun  2 17:39:43 sajo-laptop sm-mta[9372]: o52LHK4s007585: to=, ctladdr= (33/33), delay=03:22:18, xdelay=00:06:28, mailer=esmtp, pri=1470404, relay=c.mx.mail.yahoo.com. [206.190.54.127], dsn=4.0.0, stat=Deferred: Connection timed out with c.mx.mail.yahoo.com.
Jun  2 17:39:50 sajo-laptop sm-mta[9149]: o51I8ieV004377: to=, ctladdr= (33/33), delay=1+06:31:06, xdelay=00:03:57, mailer=esmtp, pri=6601668, relay=alt4.gmail-smtp-in.l.google.com. [74.125.79.114], dsn=4.0.0, stat=Deferred: Connection timed out with alt4.gmail-smtp-in.l.google.com.
Jun  2 17:40:01 sajo-laptop CRON[9523]: (smmsp) CMD (test -x /etc/init.d/sendmail && /usr/share/sendmail/sendmail cron-msp)

有誰知道我如何永久擺脫這些消息?順便說一句,我還想知道是否有辦法設定sendmail「假」發送電子郵件。有沒有?

答案1

已傳送或正在嘗試傳送的訊息儲存在 中/var/spool/mqueue。 Sendmail 尚未嘗試排隊的郵件可以在 中找到/var/spool/mqueue-client

所以試試這個(我假設你想擺脫全部佇列中的消息):

  • 停止發送郵件
  • rm /var/spool/mqueue/*
  • 如果您想要刪除等待中的訊息,rm /var/spool/mqueue-client/*.
  • 啟動發送郵件

這將清除您的佇列資料夾,直到系統收到另一個訊息。您可以透過運行mailq(兩個隊列資料夾)或sendmail -bp(僅隊列資料夾)來仔細檢查。

筆記: service sendmail <start|stop|restart>對於大多數 Linux 發行版,您可以使用或來啟動/停止服務/etc/init.d/sendmail <start|stop|restart>。這兩個選項都有許多其他狀態標誌,可以透過鍵入不帶狀態標誌的命令和服務來觀察這些狀態標誌。

答案2

您經常會發現從 Sendmail 的 mqueue 目錄中刪除檔案的建議,例如rm /var/spool/mqueue/*或更糟(rm -rf等等)。恕我直言,這很危險。它在很多情況下都有效,但我建議係好安全帶。簡單地從 mqueue 中刪除所有檔案可能會刪除合法訊息。

在刪除排隊的郵件之前停止 Sendmail 是個好建議,尤其是在需要刪除許多郵件的情況下。然而,如果僅刪除少數郵件或定期清理佇列(例如透過 cron 作業),則實際上無需停止 Sendmail。在最壞的情況下,其中一條訊息將重新排隊,當您再次嘗試時,幾乎肯定會刪除該訊息。

相反,停止 Sendmail(例如在 Ubuntu 中使用service sendmail stop)可能還不夠。即使停止,某些(子)進程可能仍在運作。人們必須等到他們完成(推薦)或殺死他們。

為了安全地從 mqueue 中刪除訊息,您需要訊息的佇列 ID。 ID 顯示在日誌中的「sm-mta[...]:」之後。日誌摘錄中的 ID 為o530SlbK009365, o4VHn3cw003597, ... 對於每個 ID,mqueue 中儲存 2 個文件,一個以「qf」開頭,另一個以「df」開頭。

mailq通常用於列出隊列的內容。它在第一列中顯示 ID。此外,您應該查閱mailq的輸出,因為它還顯示訊息是否處於活動狀態/目前正在處理。例如

-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient----------
oBDDuKAB023946*    1058 Mon Dec 13 14:56 <[email protected]
                 (Deferred: 450-4.2.1 The user you are trying to contact is re)
                                         <[email protected]>
oBAEMuV8000429     1058 Fri Dec 10 15:22 <[email protected]
                 (Deferred: 450-4.2.1 The user you are trying to contact is re)
                                         <[email protected]>

oBDDuKAB023946在此範例中,目前正在處理帶有 ID 的訊息,如附加的星號所示。其他訊息可以安全刪除。例如,為了刪除帶有 ID 的訊息,oBAEMuV8000429請使用

rm /var/spool/mqueue/{d,q}foBAEMuV8000429

Brandon Hutchinson 提供了一種更通用的方法來刪除排隊訊息從郵件佇列中刪除郵件。 Brandon 還包括用於根據網域部分、電子郵件地址等刪除郵件的腳本。

然而,即使是布蘭登的腳本也沒有考慮到訊息的狀態。不過,添加起來很容易。包含在他的腳本的開頭

# Get current mailq status
my $mailq = `mailq`;

然後,在子例程「wanted」的開頭新增一個檢查以跳過活動訊息,例如

# skip if file is currently processed by MTA
if ($mailq =~ /\n$queue_id\*/) {
   $debug && print "$queue_id is locked.\n";
   last;
}

HTH。並且,記得進行備份:-)

答案3

我遇到了同樣的問題,發現有 2 個資料夾包含排隊的訊息。資料夾 /var/spool/clientmqueue/ 中的訊息如果無法傳遞,則最終會出現在 /var/spool/mqueue/ 中。要解決該問題,必須從兩個資料夾中刪除檔案。

rm -f /var/spool/clientmqueue/* rm -f /var/spool/mqueue/*

答案4

我設法使用這個 bash 腳本來做到這一點

for i in `sudo ls /var/spool/mqueue`
do
    sudo rm -rv `echo /var/spool/mqueue/$i`
done

相關內容