[Perl] MIMEマルチパートメール中のテキスト本文を置換する

Perl Email Project というプロジェクトで開発されている
Perl のメール処理モジュール群がかなり充実しています。
「ファイル添付メール」や「HTMLメール」などの「MIME マルチパートメール」は
自前のコードで処理するのは結構面倒で、多様な MTA に対応するのは難しく
バグも発生しやすい状況でしたが、この Email::MIME モジュール達を利用すると、
手軽にマルチパートメールを扱えるようになります。

以下のサンプルコードは、sample-in.eml ファイルのメールの本文中にある
文字列『FOO』を『BAR』に置換して、sample-out.eml として出力する例。
マルチパートの有無、plain テキスト、HTML メールの本文どれも置換できます。
(添付されたテキストファイルの中身も置換しちゃいます)
メールの件名などのヘッダ類、添付画像ファイルなどは置換しません。

#!/usr/bin/perl

    use strict;
    use Email::MIME::Modifier;
    &main();

sub main {
    my $src = 'sample-in.eml';
    my $dst = 'sample-out.eml';
    open( SRC, $src ) or die "$! - $src\n";
    local $/ = undef;
    my $text = <SRC>;
    close( SRC );
    $text = &modmail( $text );
    open( DST, "> $dst" ) or die "$! - $dst\n";
    print DST $text;
    close( DST );
}

sub modmail {
    my $text = shift;
    my $email = Email::MIME->new( $text );
    my @parts = $email->subparts();
    foreach my $part ( $email, @parts ) {
        my $ctype = $part->content_type();
        next unless ( $ctype =~ m#^text/# );
        my $decoded = $part->body();

        # ここで置換処理を記述する
        $decoded =~ s#FOO#BAR#;

        $part->body_set( $decoded );
        $email->parts_add( [] ); # オマジナイ
        }
    $email->as_string();
}


要は、modmail サブルーチンの数行だけで、やりたいことができます。
置換した文字列以外の部分は、エンコーディングも含めて元のメールを
そのまま再現してくれるので、副作用が少なそうな点も安心です。

『オマジナイ』と書いてある行は、ダミーで空(0個)のパートをメールに
追加しています。この行がないと、置換した本文が出力結果に反映されません。
たぶん、モジュール側のバグなんじゃないでしょうか。
(バージョンは Email::Simple 1.999、Email::MIME 1.859 です)



(オマケ情報)
携帯電話の絵文字を含む日本語のメール送信用で EmailJP.pm モジュール といのを
かつて公開したこともありました。各キャリアの絵文字自動変換処理付。
しばらく更新していないので、最新携帯でうまく動くか分かりませんが。
Email::MIME の携帯絵文字対応版とか、欲しいね。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 2

なるほど(納得、参考になった、ヘー)
面白い

この記事へのコメント

この記事へのトラックバック