2012年8月10日金曜日

シェルスクリプトでPostfixメールキューファイルをeml形式に変換するには?

Postfixのメールキューディレクトリ(/var/spool/postfix/holdなど)には、もちろんメールキューファイルが入っているけど、それは普通のeml形式のファイルじゃない。どうもバイナリのようだ。

このバイナリをテキストとして見るためのファイルがpostcatだけど、この出力にまたクセがある。こんな感じだ。

*** ENVELOPE RECORDS ABC443BD5B6 ***
・・・(各種情報が続く)
*** MESSAGE CONTENTS ABC443BD5B6 ***
・・・(メール本文)
*** HEADER EXTRACTED ABC443BD5B6 ***
*** MESSAGE FILE END ABC443BD5B6 ***

eml形式のファイルとして扱うには、「メール本文」の部分だけ抜き出してファイルにしなければならない。そこで、まずこうする。

postcat ABC443BD5B6 | sed -n -e "/MESSAGE CONTENTS/,/HEADER EXTRACTED/p"

これで「MESSAGE CONTENTS」行から「HEADER EXTRACTED」行までを切り出せる。

しかし、このままでは「MESSAGE CONTENTS」行と「HEADER EXTRACTED」行も含まれてしまう。そこで、さらにこうする。

postcat ABC443BD5B6 | sed -n -e "/MESSAGE CONTENTS/,/HEADER EXTRACTED/p" | head -n -1 | tail -n +2

「head -n -1」で1行目から最終行の手前まで切り出す。これで「HEADER EXTRACTED」行が消える。

「tail -n +2」で2行目から最終行まで切り出す。これで「MESSAGE CONTENTS」行が消える。

これで「メール本文」の部分だけを得られる。最後にこうする。

postcat ABC443BD5B6 | sed -n -e "/MESSAGE CONTENTS/,/HEADER EXTRACTED/p" | head -n -1 | tail -n +2 > email.eml

これで「ABC443BD5B6」というメールキューファイルが「email.eml」というeml形式のファイルに変換される。

もう少し一発で行う方法は無いのだろうか?postcatで余計な情報を出力しないオプションでもあればなぁ・・・