FreeBSD: sendmail savemail panic

メールの利用者から届くはずのメールが届いていないと連絡がありました。

私はメールを受信しているけどな〜、、、、、と思ってメールボックスをチェックしてみたところ、確かに毎日届くメールの一部が届いていないことがわかりました。

ネットワーク障害でも起きているかな〜とメールログを見てみると、見慣れない行があります。savemail panic だそうです。

sm-mta[55697]: v7C9Zxvl055697: Losing ./qfv7C9Zxvl055697: savemail panic

こんなメッセージは今まで見たことがないのですが、よくよく見てみると正常送信されたメールログに混じって以下のログが残っていました。

Aug 12 18:35:59 mailserv sm-mta[55697]: v7C9Zwvm055696: v7C9Zxvl055697: DSN: Service unavailable
Aug 12 18:35:59 mailserv sm-mta[55697]: v7C9Zxvl055697: to=<ultra@facebook.com>, delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=53829, relay=smtp.mxlogic.net, dsn=5.0.0, stat=Service unavailable
Aug 12 18:35:59 mailserv sm-mta[55697]: v7C9Zxvl055697: v7C9Zxvm055697: return to sender: Service unavailable
Aug 12 18:35:59 mailserv sm-mta[55697]: v7C9Zxvl055697: Losing ./qfv7C9Zxvl055697: savemail panic
Aug 12 18:35:59 mailserv sm-mta[55697]: v7C9Zxvl055697: SYSERR(root): savemail: cannot save rejected email anywhere

どうも、何らかの事情でエラーになったメールを、送信元に送り戻そうとして、そのReturn mail もエラーになってしまった場合に、savemail panic になるようです。

今回、たまたま Smart Relay Host を使用した配信モードに設定しており、Master Relay host と 2ndary Relay host の両方にSMTP接続することが出来なくなる事情が生じたために、savemail panic が発生したようです。

普通、正常送信できなかった場合、mail queue に保存され、一定時間ごとにリトライされるのですが、savemail panic になった場合は、一発で終了。

例えばFreeBSDの場合、savemail panic になったメールは、/var/spool/mqueue に、次のように保管されます。

/var/spool/mqueue # ll *v7C9Zxvl055697
-rw------- 1 root daemon   932 8月 12 18:35 Qfv7C9Zxvl055697
-rw------- 1 root daemon 24130 8月 12 18:35 dfv7C9Zxvl055697

しかし、mailq コマンドで未配達メールを表示しようとしても

/var/spool/mqueue # mailq
/var/spool/mqueue is empty
		Total requests: 0

となり、再送信可能な形で表示されません。man mailq で調べてみたところ、ロストメールは、mailq ではなく

mailq -qL

としないと表示されないとのことでした。確かに mailq -qL で表示できたものの、どうやって再送するのか?

FreeBSD の場合は、root で

sendmailq -q -v

としたり、

service sendmail restart

とすれば、sendmail に喝が入りspoolに溜まっているメールを送り直そうとするのですが、今回この方法は効果がありませんでした。
FreeBSDの mail spool の場合は、qfvxxxxxで始まるファイルと、dfvxxxxx で始まる二つのファイルで一通のメールが成立しています。

/var/spool/mqueue # ll
-rw-------  1 root  daemon   885  8月  6 12:19 qfv763JDlq001893
-rw-------  1 root  daemon  9945  8月  6 12:19 dfv763JDlq001893

今回、qf の部分が、小文字ではなくQが大文字であることに気づきました。

/var/spool/mqueue #	ll *v763JDlq001893
-rw-------  1 root  daemon   885  8月  6 12:19 Qfv763JDlq001893
-rw-------  1 root  daemon  9945  8月  6 12:19 dfv763JDlq001893

オンラインマニュアルを見てみたのですが、この違いに触れた記述を簡単に見つけることができず、とりあえず自分宛のロストメールを手作業で Q→q に変更してみることにしました。

ファイル名を

# mv Qfv763JDlq001893 qfv763JDlq001893

としてみたところ、mailq コマンドで表示されるようになりました。放置しておいたら、通常の遅延メールとして処理されました。ただし、正常配送メールとして届いたのではなく、不達メールとして到着しました。
私の場合は、宛先であり、root でもあるので、このメールが送信先に届いたのか送信元に戻ってきたのかがイマイチよくわかりません。それでもqueueで腐ったままになっているよりはマシでしょう。

コメントを残す