Hatena::ブログ(Diary)

MiDの日記

2008-05-07 ららら〜♪ぶっ壊れろお♪

[]メールのヘッダと本文を分割する。

RFC:http://www.puni.net/~mimori/rfc/rfc2822.txt

参考:

http://search.cpan.org/dist/Mail-XML-0.03/XML.pm

http://search.cpan.org/~markov/MailTools-2.03/lib/Mail/Internet.pod

http://erika.piedey.co.jp:8088/log.html?MLID=testml4&TID=2475&F=0&L=10&R=0

http://blawat2015.no-ip.com/~mieki256/diary/200602204.html

改行だけで分けちゃえばOK?多分いいはず。。。それしかないだろ。。。

メールヘッダの区切りとして認識される改行コード(\n、\r\n、\r等)

ヘッダフィールドはCRLFで終わる?

0x0D0x0AがCRLFかなぁ。

perl上では

\n は LF
\r は CR

windowsのactive perlで\nを出力したら0x0D 0x0Aが出力された。

\rは0x0Dだったけど。

つかwhile(<FILE>)って改行ごとにとるんだから、取れるわけないじゃん。。。orz

chompが削った改行の数を返すっていうから使ったけど、1しか入ってないよ。それが普通の動きだよね。。。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=26961&forum=10&8

thunderbirdで受け取ったメールはmbox形式とかいうのになってる。

だから解析できねぇんじゃねぇか ぼけぇ。

  • メールの格納形式

メールの格納形式には大きく分けて以下のふたつのものがあります。

    • mh 形式

vmail や Sylpheed は mh 形式です。mh 形式の特徴は、メール一通ゝを別のファイルとして保存する点です。メールの振り分けをしやすい、万一メールのファイルが壊れたときにもダメージが少ないといった利点があります。

mew や mnews などもこの mh 形式を用いています。

    • mbox 形式

mbox 形式を用いているものとしては、Netscape messenger 等があげられます。mbox 形式の特徴は全てのメールを1つのファイルに格納している点です。複数のメールを別々に扱う mh 形式のメール格納形式に比べて、mbox 形式の方が使用するディスクスペースが少なくて済む利点があります。

    • eml形式

rfc2822形式に則ったメール一通ずつ保存する形式。


。。。なんか散々悩んだけど、すごく簡単にできた。。。

#!/usr/bin/perl
use warnings;
use strict;

my $mail = "$ARGV[0]";
open(MAIL, "$mail") or die "can`t open file : $!";

my $flg = 0;

print "--- MAIL HEADER ---\n";

while(<MAIL>){
	if(($_=~/^\n/) and ($flg == 0)){
		print "--- MAIL BODY ---\n";
		$flg = 1;
	}
	print $_;
}

むずかしく考えすぎだぉ。。。

結構いい感じに分かれたけど、添付ファイルとかMIMEを考えてないね。

MIMEの区切りについてもCRLFっぽい。

ぺりるめもさんのところにもっといいコードがあった。

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

MIME使うとヘッダの次のCRLFはMIMEの情報が出てるな。。。うざい。。。

まぁ2,3行だからいいかなぁ。

本文の次のCRLFは添付ファイルについてのMIMEヘッダ

その次のCRLFは添付ファイルをBASE64したものになっている。

本文の改行もやっぱりCRLFじゃねぇか。。。

参考:http://digit.que.ne.jp/work/wiki.cgi?Perl%E3%83%A1%E3%83%A2%2FPerl%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E5%8F%97%E3%81%91%E3%82%8B

http://oshiete1.goo.ne.jp/qa1560994.html?ans_count_asc=2

http://www.ksknet.net/cat28/mimeparser.html

MIME::Parserで本文のみ出力

#!/usr/bin/perl
use warnings;
use strict;
use MIME::Parser;

#MIMEパーサオブジェクトの作成
my $parse = new MIME::Parser;
#ディスクへのデフォルト出力に分析されたメッセージ本体を保つ。
$parse->output_to_core(1);

#メールファイルオープン
open(MAIL, "$ARGV[0]") or die "can`t open mail file : $!";

my $entity = $parse->parse(\*MAIL); #ファイルハンドルもスカラも渡せる。

my $from = $entity->head->get('from');


my $body = $entity->body;
foreach (@$body) {
  print;
}

参考:

http://search.cpan.org/~dskoll/MIME-tools-5.420/lib/MIME/Parser.pm

http://www.7korobi8oki.com/mt/archives/000019.html