シェルスクリプトでPostfixメールキューファイルをeml形式に変換するには?
Postfixのメールキューディレクトリ(/var/spool/postfix/holdなど)には、もちろんメールキューファイルが入っているけど、それは普通のeml形式のファイルじゃない。どうもバイナリのようだ。
このバイナリをテキストとして見るためのファイルがpostcatだけど、この出力にまたクセがある。こんな感じだ。
eml形式のファイルとして扱うには、「メール本文」の部分だけ抜き出してファイルにしなければならない。そこで、まずこうする。
これで「MESSAGE CONTENTS」行から「HEADER EXTRACTED」行までを切り出せる。
しかし、このままでは「MESSAGE CONTENTS」行と「HEADER EXTRACTED」行も含まれてしまう。そこで、さらにこうする。
「head -n -1」で1行目から最終行の手前まで切り出す。これで「HEADER EXTRACTED」行が消える。
「tail -n +2」で2行目から最終行まで切り出す。これで「MESSAGE CONTENTS」行が消える。
これで「メール本文」の部分だけを得られる。最後にこうする。
これで「ABC443BD5B6」というメールキューファイルが「email.eml」というeml形式のファイルに変換される。
もう少し一発で行う方法は無いのだろうか?postcatで余計な情報を出力しないオプションでもあればなぁ・・・
このバイナリをテキストとして見るためのファイルが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で余計な情報を出力しないオプションでもあればなぁ・・・
コメント
コメントを投稿