メールサーバーの管理者にとって、メールがキューにたまっている状況は好ましくない。メールサーバーのキューにたまっているメールを再送する方法、削除する方法を紹介する。対象は、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秒に設定する。コネクトの待ち時間や、コマンドの待ち時間を短くすることで処理時間を短くできる。