sendmailキュー内の電子メールメッセージを完全に削除し、戻ってこないようにするにはどうすればよいですか?


18

ここにはかなり厄介な問題があります。私はアプリケーションをテストしており、偽の電子メールアドレスへのテスト電子メールをいくつか作成しました(とにかくサーバーが実際に電子メールを送信するように設定されていないことは言うまでもありません)。もちろん、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電子メールの送信を「偽」に設定する方法があるかどうかも知りたいと思います。ある?


まあ、私はまだこの問題の解決策を見つけていません。それはそれが起こることを引き起こしているcronスクリプトのいくつかの並べ替えだようにこれは間違いなく見えますが、それはキューに入れられたメッセージを格納している場合、私は理解することはできません...
スティーブン・オクスリー

回答:


28

送信済みまたは送信しようとしているメッセージはに保存され/var/spool/mqueueます。Sendmailがまだキューに入れようとしていないメッセージは、にあります/var/spool/mqueue-client

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

  • 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>。どちらのオプションにも、ステータスフラグなしでコマンドとサービスを入力することで確認できる他の多くのステータスフラグがあります。


彼はすでにこれを行ったと言いましたが、メッセージが再表示さ
Massimo

1
しかし、sendmailを最初に停止することなく、それがポイントです。
weeheavy

さて、あなたは私が逃したステップにぶつかったようです。
スティーブンオックスリー

Fedoraの19日、私は見るの/ var / spool / clientmqueueに(同様の/ var /スプール/ mqueueを)
TomG

何らかの理由でsudoを使用しても、これは機能しません(言うでしょうno matches found)。そのchmodため、フォルダを編集して777、コンテンツを削除することができました。
シュリダールSarnobat

9

たとえば、Sendmailのmqueueディレクトリからファイルを削除することを提案する場合がありますrm /var/spool/mqueue/*(たとえば、それ以上rm -rf)。私見、これは非常に危険です。多くの場合は機能しますが、シートベルトを締めることをお勧めします。mqueueからすべてのファイルを削除すると、正当なメッセージが削除される場合があります。

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

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

mqueueからメッセージを安全に削除するには、メッセージのキューIDが必要です。IDは、「sm-mta [...]:」の後のログに表示されます。あなたのログの抜粋からIDがされているo530SlbK009365o4VHn3cw003597... IDのそれぞれについて、2つのファイルをmqueueを、「QF」で始まる1、「DF」と他の出発に格納されています。

mailq通常、キューのコンテンツをリストするために使用されます。最初の列にIDが表示されます。さらに、mailqメッセージがアクティブ/現在処理されているかどうかも表示されるため、の出力を参照する必要があります。例えば

-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient----------
oBDDuKAB023946*    1058 Mon Dec 13 14:56 <vfn-l-bounces+so=example.com@fam.tuwi
                 (Deferred: 450-4.2.1 The user you are trying to contact is re)
                                         <so@example.com>
oBAEMuV8000429     1058 Fri Dec 10 15:22 <vfn-l-bounces+sby=example.com@fam.tuw
                 (Deferred: 450-4.2.1 The user you are trying to contact is re)
                                         <so@example.com>

この例では、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。そして、バックアップを作成することを忘れないでください:-)


4

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

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


0

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


0

私はこのbashスクリプトを使用してこれを行うことができました

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

そのため、サブシェルを開いて、echosaid echoのパラメーターとして使用するためのsaidの出力を呼び出して取得するだけrmです。さえの無償フォークを無視sudoしてrm、このsubshel​​lingはプレーン無駄です。
フェリックスフランク14

さて、より「受け入れられる」ソリューションがあれば、コメントがどれほど役に立たないかを示すのではなく、ソリューションを説明するのに時間の無駄はありません。事前のおかげで
シュウひかり

2
これが攻撃的で慢なものに遭遇した場合は申し訳ありません。より経済的なアプローチは次のようになりますsudo find /var/spool/mqueue -maxdepth 1 -delete。特にスクリプトの問題点を指摘することが重要だと思いました。タクトの欠如をおologiesびします。
フェリックスフランク

2
うん、しかし今あなたはあなたのポイントを説明し、私はそれを完全に理解した。そして謝罪は受け入れられた、心配しないでください。ありがとう:D
シュウヒカリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.