MAILER-DAEMONからのメールを読み飛ばすTeraTerm Proマクロ

Linuxマシン上のmailx(標準のmailコマンド)でMAILER-DAEMONからのメールを削除しつつ、それ以外のメールを読むためのTeraTerm Proマクロを作成しました。

MAILER-DAEMONからメールがたくさん届く

私が管理しているサーバーでは、MAILER-DAEMONメーラーだえもんさん )からのメールがたくさん届きます。宛先不明のメールなどがpostmaster宛メールとして返ってきます。postmasterはrootに設定してあるので、root宛の他のメール(LogWatchからの報告など)と入り混じることになります。

メールの例:

 U1252 MAILER-DAEMON  Wed Jul 29 18:46 507/16973 "Postmaster notify: see transcript for details"
 U1253 MAILER-DAEMON  Wed Jul 29 20:46 459/13543 "Postmaster notify: see transcript for details"
 U1254 MAILER-DAEMON  Wed Jul 29 20:46 459/13561 "Postmaster notify: see transcript for details"
 U1255 root           Thu Jul 30 04:02 3286/140454 "LogWatch"
 U1256 MAILER-DAEMON  Thu Jul 30 08:46 454/13071 "Postmaster notify: see transcript for details"
 U1257 MAILER-DAEMON  Thu Jul 30 08:46 455/13076 "Postmaster notify: see transcript for details"
 U1258 MAILER-DAEMON  Thu Jul 30 08:46 454/13084 "Postmaster notify: see transcript for details"

本来は宛先不明メールを出さないようにすればMAILER-DAEMONのお世話にならずに済むのですが、色々な事情で出てしまうので、ここでは「いかにMAILER-DAEMONからのメールを読み飛ばすか」というのを考えました。

アルゴリズムを考える

MUALinux上のmailxです。また、ターミナル・ソフトはUTF-8 TeraTerm Pro with TTSSH2です。

次のように考えました。

  1. メールのヘッダーを表示する
  2. もしヘッダーに「MAILER-DAEMON」が入っていたら、そのメールを削除し、次のメールに移動し、1番に戻る
  3. もしヘッダーに「MAILER-DAEMON」が入っていなかったら、そのメールを表示する
  4. ユーザーがメールを読み終わったら手順1に戻る

ここで手順4の「メールを読み終わったら」の判別が難しいところです。メールの表示には環境変数PAGERで指定されたソフトが使われるため、どのような文字列が来たらユーザーが読み終わったことになるか、色々考えました。

結局、次のような操作をすることを前提にしました(以下の手順はすべてユーザーの手作業です)

  1. ユーザーはメールを読み終わったらPAGERを終了し、Enterキーで次のメールに移動する
  2. 次のメールがMAILER-DAEMON以外からのものだったら、そのメールを読み、手順1に戻る
  3. 次のメールがMAILER-DAEMONからのものだったら、ユーザーは“d .”を入力して、当該メールを削除する

この、“d .”の入力(のエコーバック)を拾ってメールを読み終わったことを判別し、マクロの動作を再開することにしました。

作成したマクロ

上記の動作をするマクロを“DeleteMailerDaemonMail.ttl”という名前で作成しました。

DeleteMailerDaemonMail.ttl

:next_mail
timeout = 2
sendln 'f .'
wait 'MAILER-DAEMON'
if result = 0 goto not_daemon_mail
if result = 1 goto daemon_mail
end

:daemon_mail
sendln 'd .'
goto next_mail

:not_daemon_mail
timeout = 600
sendln '.'
wait '& d .'
if result = 0 goto end
pause 1
goto next_mail

:end
end

これでMAILER-DAEMONからのメールを読み飛ばすことができるようになりました。