sendmail のキューを再送・削除する

メールサーバーの管理者にとって、メールがキューにたまっている状況は好ましくない。メールサーバーのキューにたまっているメールを再送する方法、削除する方法を紹介する。対象は、sendmail だ。

キューの削除

sendmail でメールのキューを確認するには、「mailq」コマンドを使う。

[root@server ~]# mailq
                /var/spool/mqueue (1 request)
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-----------
rBTAi7m0032598      355 Sun Dec 29 19:44 <送信元メールアドレス>
                 (Deferred: Connection refused by mail.example.com.)
                                         <宛先メールアドレス>
                Total requests: 1

キューにたまっているメールは、通常「/var/spool/mqueue」にファイルとして格納されており(設定により変更可能)、「Q-ID」列に表示されている ID の先頭に「df」と「qf」がついたファイルがある。

[root@server ~]# ls -al /var/spool/mqueue/
total 16
drwx------  2 root mail  4096 Dec 29 19:44 .
drwxr-xr-x 12 root root  4096 Jan 29  2012 ..
-rw-------  1 root smmsp  355 Dec 29 19:44 dfrBTAi7m0032598
-rw-------  1 root smmsp 1113 Dec 29 19:44 qfrBTAi7m0032598

ID の先頭の2文字には意味があり、「df」はメッセージのボディを格納するファイル、「qf」はメールの送信を行うために必要な情報、メールヘッダーが含まれる。キューから削除する場合は、この2つのファイルをsendmail を停止してから削除すればよい。

[root@server ~]# rm /var/spool/mqueue/[dq]frBTAi7m0032598

なお、キューのディレクトリには一時ファイル「tf」やセッション中の情報を記録する「xf」、コントロールファイルを失った場合に作成される「Qf」ファイルなどが格納されていることもある。

キューを再送する

通常の運用でメールがキューにたまってしまうのは、送信先のメールサーバーがダウンしている状況だ。送信先のメールサーバーが復旧すれば、リトライ間隔に従って順次送信されるはずだが、すぐに送信したい場合もある。
再送したい場合は、sendmail に配送を指示する「-q」オプションをつけて実行する。実行状況を確認するために、「-v」オプションをつけた方がよいだろう。

[root@server ~]# sendmail -q -v

Running /var/spool/mqueue/rBTAi7m0032598 (sequence 1 of 1)
<宛先メールアドレス>... Connecting to mail.example.com. via relay...
220 mail.example.com ESMTP Sendmail 8.13.8/8.13.8; Sun, 29 Dec 2013 19:44:42 +0900
>>> EHLO server.united-bears.co.jp
250-mail.example.com Hello server.united-bears.co.jp [xxx.xxx.xxx.xxx], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-DELIVERBY
250 HELP
>>> MAIL From:<送信元メールアドレス> SIZE=1047
250 2.1.0 <送信元メールアドレス>... Sender ok
>>> RCPT To:<宛先メールアドレス>
>>> DATA
250 2.1.5 <宛先メールアドレス>... Recipient ok
354 Enter mail, end with "." on a line by itself
>>> .
250 2.0.0 rBTAig1X021218 Message accepted for delivery
<宛先メールアドレス>... Sent (rBTAig1X021218 Message accepted for delivery)
Closing connection to mail.example.com.
>>> QUIT
221 2.0.0 mail.example.com closing connection

キューを強制的に再送する

内部のクライアントがメールを送信するマルウェアに感染した場合、メールのキューには送信できないメールが大量にたまることがある。マルウェアは正しいメールアドレスに送信するとは限らないため再送が発生したり、メールサーバーがスパムを送信するサーバーと識別されて、相手のメールサーバーに一時的に受信を拒否されてしまうことなどが原因だ。
キューから不要なファイルを削除すればよいが、大量になると処理が難しい。単純に再送するだけだと sendmail がリトライするためにキューに戻し、処理が終わるまで時間がかかる。また、メールサーバーがスパムを送信するサーバーと識別されている場合、接続後に応答を戻さなかったり、送信元アドレスや宛先アドレスが分かったときにエラーを戻すこともある。

接続後に応答を戻さなかったり、送信元アドレスや宛先アドレスが分かったときにエラーを戻すサーバーがあることも想定した上で、sendmail にオプションを与えて強制的に再送、送信できない場合は送信者アドレスにメールを戻すようにコマンドを実行する方法を紹介する。

[root@server ~]# sendmail -q -v -OTimeout.queuereturn=0 -OTimeout.connect=5s -OTimeout.initial=5s -OTimeout.aconnect=5s -OTimeout.mail=5s -OTimeout.helo=5s -OTimeout.rcpt=5s -OTimeout.command=5s

「-OTimeout.queuereturn=0」は、送信できなかったメールの保持期間を0に設定して、すぐにエラーメールとして戻すオプションだ。「-OTimeout.connect=5s -OTimeout.initial=5s -OTimeout.aconnect=5s」は、TCP のコネクト(セッションを確立するとき)の待ち時間を5秒に設定する。「-OTimeout.helo=5s -OTimeout.rcpt=5s -OTimeout.command=5s」は、SMTP の各種コマンド実行時の待ち時間を5秒に設定する。コネクトの待ち時間や、コマンドの待ち時間を短くすることで処理時間を短くできる。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.