web-dev-qa-db-ja.com

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を設定してメールを「偽造」する方法があるかどうかも知りたいです。ある?

20
Steven Oxley

送信されたメッセージまたは送信しようとしているメッセージは、_/var/spool/mqueue_に格納されます。 Sendmailがまだキューに入れようとしていないメッセージは、_/var/spool/mqueue-client_にあります。

だからこれを試してみてください(キュー内のallメッセージを削除したいと思います):

  • Sendmailを停止する
  • _rm /var/spool/mqueue/*_
  • 待機中にメッセージを削除する場合は、_rm /var/spool/mqueue-client/*_。
  • Sendmailを起動

これにより、システムが別のメッセージを受信するまで、キューフォルダーがクリアされます。 mailq(両方のキューフォルダー)、または_sendmail -bp_(キューフォルダーのみ)を実行することで、ダブルチェックできます。

注:ほとんどのLinuxディストリビューションでは、_service sendmail <start|stop|restart>_または_/etc/init.d/sendmail <start|stop|restart>_。どちらのオプションにも、ステータスフラグなしでコマンドとサービスを入力することで確認できる他の多くのステータスフラグがあります。

28
weeheavy

たとえば、_rm /var/spool/mqueue/*_またはそれ以下(_rm -rf_など)を使用して、Sendmailのmqueueディレクトリからファイルを削除するという提案がよくあります。私見、これは非常に危険です。多くのケースで機能しますが、シートベルトを締めることをお勧めします。 mqueueからすべてのファイルを削除すると、正当なメッセージが削除される可能性があります。

キューに入れられたメッセージを削除する前にSendmailを停止することは、多くのメッセージを削除する必要がある場合は特に良いアドバイスです。ただし、いくつかのメッセージのみを削除する場合、またはキューを定期的にクリーンアップする場合(例: cronジョブを使用すると、実際にはSendmailを停止する必要はありません。最悪の場合、メッセージの1つが再度キューに入れられ、再試行するとほぼ確実に削除されます。

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

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 _oBDDuKAB023946_のメッセージが現在処理されており、アスタリスクが付いています。他のメッセージは削除しても安全です。たとえば、ID _oBAEMuV8000429_のメッセージを削除するには

_rm /var/spool/mqueue/{d,q}foBAEMuV8000429
_

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

それでも、Brandonのスクリプトでさえメッセージのステータスを処理していません。ただし、追加は簡単です。スクリプトの冒頭に含める

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

次に、「必要な」サブルーチンの最初に、アクティブなメッセージをスキップするチェックを追加します。と

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

HTH。そして、バックアップを作成することを忘れないでください:-)

10
xebeche

同じ問題があり、キューに入れられたメッセージを含む2つのフォルダーがあることがわかりました。/var/spool/clientmqueue /フォルダーには、配信に失敗した場合に最終的に/ var/spool/mqueue /に送信されるメッセージがありました。問題を解決するには、両方のフォルダからファイルを削除する必要がありました。

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

4
JFister

私はこのbashスクリプトを使用してこれをどうにかして

for i in `Sudo ls /var/spool/mqueue`
do
    Sudo rm -rv `echo /var/spool/mqueue/$i`
done
0
Shu Hikari

これはcronスクリプトの動作ではないと思います。アプリケーションの問題、またはsendmail自体に関連する何かである可能性が高くなります。とにかく、これを行うcronジョブを除外するには、しばらくcrondを停止して、これが引き続き発生するかどうかを確認します。

0
Massimo