メールをheader部とbody部に分解・解析 (module)MIME-Parser

back
単純に「最初の空行までがヘッダ、残りがボディ」ということで

while (<FH>) {
  last if (/^$/);
  $header .= $_;
}
while (<FH>) {
  $body .= $_;
}

みたいな感じで。
各フィールド名とフィールドボディはうまいこと split するべし。


モジュールを使うなら、MIME::Parser で
(MIME::Tools に同梱)

----
use MIME::Parser;

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

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

# 特定ヘッダのフィールドボディの取得
$from    = $entity->head->get('from');
$to      = $entity->head->get('to');

# 複数のフィールドがあるヘッダのその個数の取得
$receive_count = $entity->head->count('received');

# 複数のフィールドがあるヘッダから、一つフィールドボディを取得
$receive[0] = $entity->head->get('received', 0); # スカラコンテキスト
                                                 # 第二引数は省略可能

# 複数のフィールドがあるヘッダから、全てのフィールドボディを取得
@receives = $entity->head->get('received');      # リストコンテキスト

# とりあえず全部ゲット
$headers = $entity->head->stringify;

# リスト(のリファレンス)で全部ゲット (行ごとでなく、ヘッダごとにリスト化)
$headers = $entity->head->header;

# 特定のヘッダを MIME デコードして取得する場合は decode メソッドを入れる
$subject = $entity->head->decode->get('subject');

# 全てのヘッダを MIME デコードして取得する場合は、parse_data する前に
# decode_headers インスタンス変数に 1 をセット
$parse->decode_headers(1);

# body の取得 (1行1要素のリストのリファレンス)
$body = $entity->body;
foreach (@$body) {
  print;
}

back