努力したWiki

推敲の足りないメモ書き多数

ユーザ用ツール

サイト用ツール


documents:mail:mail-005

メールの本文を書き換えするスクリプト

2009年08月04日 03時17分46秒

これは何?

これは、メール本文に色々書込む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メソッドで出力した内容がそのまま本文と置き換わります。

使い道?

メール送信時にこのスクリプトを挟んで、メール本文に夏季休業期間のお知らせを自動挿入させたりできますよね。広告を入れたければメールの最後あたりに挿入させるとか。

documents/mail/mail-005.txt · 最終更新: 2016/01/08 15:47 by k896951

ページ用ツール