これは、メール本文に色々書込むPerlスクリプトのメモ。
FromやToの書き換えはよく見るけど本文の書き換えはあまり見なかったので書いた。
毎度おなじみの MIME-Tools を使ってます。
ファイル名は sign.pl とでもしましょうか。
- sign.pl
#!/usr/local/bin/perl
use MIME::Parser;
my $parseObj = MIME::Parser->new();
my $entity;
my $body,$bodyHandle;
my $lines;
$parseObj->output_dir('./');
$entity = $parseObj->parse(\*STDIN);
$body = $entity->is_multipart ? $entity->parts(0) : $entity;
$bodyHandle = $body->bodyhandle;
$lines = $bodyHandle->as_string;
$handle = $bodyHandle->open("w");
$handle->print( "***ダメダメですな***" );
$handle->print( "\n" );
$handle->print( $lines );
$handle->close();
$entity->print(\*STDOUT);
$entity->purge();
やっていることは、標準入力から流し込んだメールを MIME::Parser でパースし、パース結果の MIME::Body オブジェクトの本文データを書き換えするだけ。その後標準出力にメールを出力します。
これは、フィルタなどで利用するためです。例えば、maildrop の .mailfilter の先頭あたりに
xfilter "/home/hoge/sign.pl"
とか書くと、maildropで処理する際には必ずメール本文に「***ダメダメですな***」が1行追加される事になります。
$body = $entity->is_multipart ? $entity->parts(0) : $entity;
本文として認識すべきEntityオブジェクトを決定しています。
マルチパートのメールであれば、最初のパートが本文として使われるという仮定の下の処理です。シングルパートの時はそのまま。
$body が、メール本文(ボディ)として扱うEntityオブジェクトになります。
$bodyHandle = $body->bodyhandle;
$lines = $bodyHandle->as_string;
$handle = $bodyHandle->open("w");
$handle->print( "***ダメダメですな***" );
$handle->print( "\n" );
$handle->print( $lines );
$handle->close();
$linesにメール本文が改行を含めた文字列として代入されます。これで本文を退避します。
次に、$handleを通じて、本文を書換えします。printメソッドで出力した内容がそのまま本文と置き換わります。
メール送信時にこのスクリプトを挟んで、メール本文に夏季休業期間のお知らせを自動挿入させたりできますよね。広告を入れたければメールの最後あたりに挿入させるとか。