sendmail キュー内の電子メール メッセージを完全に削除し、再び表示されないようにするにはどうすればよいでしょうか?

sendmail キュー内の電子メール メッセージを完全に削除し、再び表示されないようにするにはどうすればよいでしょうか?

かなり厄介な問題があります。アプリケーションをテストしていて、偽の電子メール アドレス宛てにテスト メールをいくつか作成しました (言うまでもなく、私のサーバーは電子メールの送信用にセットアップされていません)。もちろん、sendmailこれらのメッセージは送信できず、キューに溜まっています。再試行が停止するまで通常sendmail5 日間かかるのを待つ代わりに、キューに溜まっているメッセージを手動で削除したいと考えています。sendmail

私は Ubuntu 10.04 を使用していますが、/var/spool/mqueue/私が読んだすべてのハウツーでは、キューに入れられた電子メールが保存されるのは ディレクトリであると書かれています。このディレクトリ内のファイルを削除すると、sendmailcron スクリプトが実行され、送信したくないメッセージがこのディレクトリに再度入力されるまで、電子メールの処理が停止します。以下は、私の からのいくつかの行です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 を停止する必要はありません。最悪の場合、メッセージの 1 つが再度キューに入れられ、再試行するとほぼ確実に削除されます。

逆に、Sendmail を停止するservice sendmail stopだけでは不十分な場合があります (たとえば、Ubuntu では を使用)。停止しても、一部の (子) プロセスがまだ実行されている可能性があります。プロセスが終了するまで待つか (推奨)、それらを強制終了する必要があります。

mqueue からメッセージを安全に削除するには、メッセージのキュー ID が必要です。ID は、ログの「sm-mta[...]:」の後に表示されます。ログ抜粋の ID はo530SlbK009365、、、o4VHn3cw003597... です。ID ごとに 2 つのファイルが mqueue に保存されます。1 つは「qf」で始まり、もう 1 つは「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]>

この例では、ID の付いたメッセージは現在処理中であり、アスタリスクで示されています。他のメッセージは削除しても問題ありません。たとえば、ID の付いたoBDDuKAB023946メッセージを削除するには、次のようにします。oBAEMuV8000429

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

キューに入れられたメッセージを削除するより汎用的なアプローチは、Brandon Hutchinsonによって提供されています。メールキューからメールを削除するBrandon には、ドメイン部分、電子メール アドレスなどに基づいてメッセージを削除するスクリプトも含まれています。Brandon のスクリプトは、定期的なクリーンアップや大量削除に非常に役立ちます。

しかし、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

関連情報