マルチパートメールの添付ファイルを取り出す (module)MIME-Parser

back
MIME::Parser にて

----
use MIME::Parser;

my $parse = new MIME::Parser;
$parse->output_to_core(1);

my $buf = (メールデータの取得)
my $entity = $parse->parse_data($buf);

#
# ヘッダに対する処理
#


# 以下、ボディに対する処理
# 入れ子のマルチパートがあるかもしれないので、再帰処理にて

&body_parse($entity);

sub body_parse {
  my $entity = shift;
  # part 毎に分解 (要素数 = パート数)
  # マルチパートでない場合は偽
  my @parts = $entity->parts;

  if (@parts) {
    # マルチパート

    # 各パートごとに更に解析
    foreach (@parts) {
      &body_parse($_);
    }
  }
  else {
    # シングルパートもしくは、マルチパートの各パート

    # 必要なら MIME Type の取得
    $mime_type = $entity->head->mime_type;

    # 必要ならエンコード種の取得
    $encoding = $entity->head->mime_encoding;

    # 必要なら(んで、指定してあれば)添付ファイル名の取得
    $filename = $entity->head->recommended_filename;

    # ボディ部分をそのまま(デコードせずに)ファイルハンドルへ出力
    $entity->print_body(\*STDOUT);

    # ボディ部分をデコードして open したファイルハンドルを取得
    $bh = $entity->bodyhandle->open("r");
    while (<$bh>) {
      print;
    }
  }
}

----

いわゆる「添付ファイルを削除したい」であれば、第1パートのみ使って、
第2パート以降を切り捨てれば、よほど変なメールでない限りOK

あとはメールのマルチパートボディのボディ(変な表現…)をファイルに書き出すなり
なんなりすればよい。

実は、メールのファイルから、添付ファイルをファイルに書き出すだけなら、
----
#!/usr/bin/perl

use MIME::Parser;
new MIME::Parser->parse(\*STDIN);
----
だけでもよかったりして :D

back