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