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からのメールを読み飛ばすか」というのを考えました。
アルゴリズムを考える
MUAはLinux上のmailxです。また、ターミナル・ソフトはUTF-8 TeraTerm Pro with TTSSH2です。
次のように考えました。
- メールのヘッダーを表示する
- もしヘッダーに「MAILER-DAEMON」が入っていたら、そのメールを削除し、次のメールに移動し、1番に戻る
- もしヘッダーに「MAILER-DAEMON」が入っていなかったら、そのメールを表示する
- ユーザーがメールを読み終わったら手順1に戻る
ここで手順4の「メールを読み終わったら」の判別が難しいところです。メールの表示には環境変数PAGERで指定されたソフトが使われるため、どのような文字列が来たらユーザーが読み終わったことになるか、色々考えました。
結局、次のような操作をすることを前提にしました(以下の手順はすべてユーザーの手作業です)
- ユーザーはメールを読み終わったらPAGERを終了し、Enterキーで次のメールに移動する
- 次のメールがMAILER-DAEMON以外からのものだったら、そのメールを読み、手順1に戻る
- 次のメールが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からのメールを読み飛ばすことができるようになりました。