2008-05-07 ららら〜♪ぶっ壊れろお♪
■[Perl]メールのヘッダと本文を分割する。
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://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
■[Perl]Active Perlのモジュールを追加する。
コマンドプロンプトでppmを実行すると、とってもきれいなGUIが表示されます。
ppm install [パッケージ名]
でもいけるよん。
参考:
http://digit.que.ne.jp/work/wiki.cgi?Perl%E3%83%A1%E3%83%A2%2F%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB(PPM)
http://www.ksknet.net/cat28/mimeparser.html
