
というわけで、前回の続きで河馬屋二千年堂さんの、ActivePerlでメールを受けるを読んでいこうと思います。読んでいこうと思いますとか書くと、なんかゼミの輪読みたいですね。どっちかっていうと自分のレベルだと中学のリーディングの授業に近いものが('A`)ジショガテバナセネエ
いやそれとも第2外国語のアラビア語か…。辞書の引き方も独特で、さらに市原悦子みたいなアラブ人の先生になじめなくて2ヶ月で…おかげで4年生になっても外語を取る羽目に…。
ちなみに前回はMoblog設置ドキュメンタリー[その1]::[7korobi8oki.com]からどうぞ。
…さて。順番に、適度に引用しつついきます。
コードは断り無い場合河馬屋二千年堂さんから引用させていただいてます多謝多謝です。
最初に、読み込みモジュールやら定数宣言。POP3サーバの情報はconstantで定数にしておきます。この辺はお好みで。
use strict;
use Jcode;
use MIME::WordDecoder;
use MIME::Parser;
use Net::POP3;
use constant Pop3Svr => 'your.pop3svr';
use constant Pop3Usr => 'POP3user';
use constant Pop3Pwd => 'POP3Pwd';
そして、
MIME::WordDecoder->default(
MIME::WordDecoder->new( [ '*' => sub { jcode(shift)->sjis }, ] )
);
さっそく分からんです…"[]"はいったい何だ。
…気分転換にコンビニに行ってきて再開です。
cpanのMIME::WordDecoderドキュメントのを見ると、こういうコードがありました。
$wd = MIME::WordDecoder->new({'US-ASCII' => "KEEP", ### sub { $_[0] }
'ISO-8859-1' => \&keep7bit,
'ISO-8859-2' => \&keep7bit,
'Big5' => "WARN",
'*' => "DIE"});
このコードについての、cpanドキュメントから引用すると、MIME::WordDecoderはA MIME::WordDecoder consists, fundamentally, of a hash which maps a character set name (US-ASCII, ISO-8859-1, etc.) to a subroutine .
だそうです。
つまり、MIME::WordDecoderインスタンスを作る際に、そのインスタンスを使ってMIMEデコードする際、各Charsetごと、に処理させるサブルーチンを設定しておく必要がある模様。そして、KEEPやらWARNやらDIEはすでに定義されたサブルーチンで
KEEP 全てそのままスルーする.
IGNORE 特に警告を出さないまま消して、無かったことにする
WARN 警告を出しつつ消して、無かったことにする。
DIE 文字セットを扱えませんというエラーを発する・
となっているようです。
&keep7biは、このCPANドキュメントのサンプル内で定義しているサブルーチンです。
つまりこの場合、
「US-ASCIIはそのまま変換なし」
「ISO-8859-1(US-ASCII にラテン1拡張を加えたもの)は&keep7biサブルーチンで処理」
「ISO-8859-2(US-ASCII にラテン1拡張といくつかの記号を加えたもの)は&keep7biサブルーチンで処理」
「Big5(いわゆる中国語とか)は警告を出しつつ消して、無かったことにする。」
「その他はエラーを出す」
という意味のようです。すると、
MIME::WordDecoder->new( [ '*' => sub { jcode(shift)->sjis }, ] )
って云うのは、とにかく全てjcodeでsjisに変換しろということではなかろうか…と判断。
#ちなみにJcodeについてはJcode - Japanese Charset Handler参照
[]は分かりません…。無名ハッシュへのリファレンスって解釈でいいのだろうか。でも、cpanの方だと、{}になっている。分からん。保留。
とりあえずこの部分は、MIME変換のデフォルトを「jcodeでsjisに変換」に設定した、という部分だと思います('A`)
続いて。
my $oParse = new MIME::Parser;
$oParse->output_dir('pop3');
#Get From Server
my $oPop = Net::POP3->new(Pop3Svr, Timeout => 60);
$oPop->login(Pop3Usr, Pop3Pwd);
my $rhMsg = $oPop->list();
ここは、Net::POP3の基本的な奴で、出力先を"pop3"ディレクトリにして、POP3サーバに接続して、ログインしてメールのリストを取得するところ。前回このあたりは探ったトコです。Moblog設置ドキュメンタリー[その1]::[7korobi8oki.com]
続いてのforeachブロックは、
foreach my $sMsgId (keys %$rhMsg) {
#1)NET::POP3::getメソッドでメールデータを得て$raContに代入。
#この時点ではまだ、扱いづらい生のメールデータ。
my $raCont = $oPop->get($sMsgId);
#2)それをMIME::Parser::parse_dataメソッドをかまして、MIME:Entityに変換。そして$oEntに代入。
my $oEnt = $oParse->parse_data($raCont);
MIME::Parserでパースされたメールデータは、MIME::Entityクラスになって、様々なMIMEクラスのメソッドで、情報を取り出したり入れたりと操作できるようになります。
なので、続いてヘッダの情報を取り出すのに、めんどくさい正規表現などを使うのではなく、MIME::Entity::headrメソッドを使うだけで、事が済むようになります。モジュール万歳。
こうして、ヘッダを$oHeadに代入。
ちなみに、この結果$oHeadは、MIME::Headerインスタンスになっています。MIME周りのクラス郡は、それぞれ適切なクラスとして生成されるようになっています。MIME-toolsのドキュメントに図解が載っています。
my $oHead = $oEnt->head;
print "\n================================\n";
MIME::HeaderインスタンスであるoHeadからは、getメソッドで簡単にヘッダ情報が取り出せます。
なので、From、To、Subjectのヘッダ情報を取り出し、各変数に代入。
この時点では日本語になっていないので、MIME::WordDecoder::unmimeメソッドで日本語に。
unmimeメソッドはデフォルトに設定したMIME変換を適用するメソッドです。デフォルトの変換とは、さっき設定したjcodeの奴です。
メールデータ→MIME変換→日本語変換、という三段階が日本語などのマルチバイトには必要みたいです。
print "From:", unmime($oHead->get('From'));
print "To :", unmime($oHead->get('To'));
print "Subj:", unmime($oHead->get('Subject'));
PrnCont($oEnt);
MIME::Toolsに含まれる、ParserとかHeadとかBodyとかEntity等が上手く連携して出来てるのね…。
これで、ヘッダはOK。
続いて本文。このスクリプトでは、PrnContサブルーチンで処理。
sub PrnCont($;$) {
my($oEnt, $iLvl) = @_;
$iLvl = 0 unless($iLvl);
引数を2つ取る。一つ目の$oEnt は先ほどMIME::Parserでパースされたデータですな。2つ目は、マルチパートかシングルパートかのフラグか。指定が無ければ自動的に0が入る。ちなみに先ほど$oEntからheaderメソッドでMIME::Headerオブジェクトを作りましたが、別にそれで元のMIME::Entityである$oEntからヘッダ情報が消えたわけではないです。コピーのコピーみたいな感じでしょうか。
さて、MIME::ParserでパースされたデータはMIME::Entityインスタンスなので、MIME::Entityのメソッドが使えます。MIME::Entity::is_multipartメソッドで、データがマルチパートかどうか判別できますので、これを利用します。
シングルパートだったら、以下のようにしてから、jcodeでshift-jisにする。
$oEnt->bodyhandle->as_string
$oEnt->bodyhandleメソッドは、MIME::Entityインスタンスから、いわゆる本文部分をMIME::Bodyとして引っ張り出せるものです。
単純にやるなら"$bodyh = $ent->bodyhandle;"などとやれば左辺に代入されます。
そいでそれをMIME::BODY::as_stringメソッドを使って、文字として取り出します。
これでメールのの本文が、日本語として取り出せました。
このあたりのメソッド群は、cpanのドキュメントの色んな所を見なきゃいかんです('A`)。MIME::BodyのとこやMIME::Parserのとこや、MIME::WordDecoderのとこやらMIME::Headerのところやら。
つづいてマルチパートです。
マルチパートは、階層構造になっている場合があるので、その時の為に、再帰処理をします。
そしてそうでない、ないしそうでなくなった場合、改めてマルチパートの種類を確認します。
具体的には。MIME::Entityのpartsメソッドで各パートにアクセスし、mime_typeメソッドで種類を確認。
$oEnt->parts($i)->mime_type
っていうところ。これが
1)text/plain だったら、シングルパートと同じ処理
2)text/html だったら、やっぱり同じ処理。
3)そのほかだったら、pathメソッドでローカルに保存。返り値のパスを表示。
#メソッドについてはsearch.cpan.org: MIME::Body
というわけで、マルチパートの添付ファイルの処理もするようです。
以上で一応MIME-toolsでメールの受信をする[河馬屋二千年堂さん]のソース読みの完了となります。何とか、読めた…のだろうか。ものすごく不安だ…。
しかし読み返してみると、あっちにいったりこっちにいったりで読みづらい。自分の普段の会話そっくりだ。
このエントリーのトラックバックURL:
http://www.7korobi8oki.com/mt/mt-tb.cgi/11
» brother sister sex from brother sister sex
brother sister sex [続きを読む]
トラックバック時刻: 2006年07月01日 04:13
» incest stories from incest stories
incest stories [続きを読む]
トラックバック時刻: 2006年07月05日 07:18
» order vicodin from order vicodin
order vicodin
[続きを読む]
トラックバック時刻: 2006年11月10日 04:27
» informatoin on ultram tramadol from informatoin on ultram tramadol
informatoin on ultram tramadol [続きを読む]
トラックバック時刻: 2006年11月23日 11:33
» buy tramadol from buy tramadol
Trackback [続きを読む]
トラックバック時刻: 2006年12月09日 12:05
» happy nigga from happy nigga
Trackback [続きを読む]
トラックバック時刻: 2007年01月02日 19:14
» 【無料レポート】◇メルマガ発行者必見!有料商材を無料で読める方法☆ from 稼げるレポートで稼ぐ会
このメルマガは全て無料レポートですので安心してレポートを手にいれてくださいね無料レポートだけで月30万稼いでいる「どんべい」が優良レポートを紹介しています今回の... [続きを読む]
トラックバック時刻: 2007年01月31日 03:10
» http://hondayo.seesaa.net from ホンダバイク最新情報
今日は、少し違ったことを書いてみます。ホンダバイクに乗るバカな人、乗らないバカな人についてです。バイクに乗らない人から見たら、あんな危ないバイクに乗る人はバカに... [続きを読む]
トラックバック時刻: 2007年03月11日 17:50
» パートするには from 558110の短期アルバイト アルバイトした??い
アルバイトとともにパートというのも、ありますね。 パートの求人というのも沢山あり... [続きを読む]
トラックバック時刻: 2007年03月16日 17:51
» 558110 他 短期アルバイト??アルバイトを探し方へ from 558110 アルバイトをお探しの方に!558110短期でアルバイトより簡単にお金を稼ぐ方法!!
558110 他 短期アルバイト??アルバイトを探し方Webの普及とともに、求人サイトとよばれる、アルバイトの求人募集を網羅したサイトがポピュラーになっている。... [続きを読む]
トラックバック時刻: 2007年04月27日 13:04
» バイトルドットコム 人気です ☆バイトルドットコム バイト検索 ピッタリの アルバイト from 生活 悩み★生活 問題 ちゃんねる 回せば 楽天 生活
バイトルドットコムの人気がすごいようですね。バイトルドットコムを利用すればコンテンツ内容やサービスから、その優れていることを実感できます。あなたもバイトルドット... [続きを読む]
トラックバック時刻: 2007年05月29日 00:18
» 558110 短期 バイト from バイトバイトバイト!!
●日払い バイト ... 『バイトルドットコム』をチェック!短期・日払い・高収入のアルバイトも満載です!日本全国、様々な職種・条件 ... ■ ゴーゴーバイト... [続きを読む]
トラックバック時刻: 2007年06月04日 16:40
» ジョブアイデムでアルバイト探し from ジョブアイデム
ジョブアイデムについてのブログです☆ [続きを読む]
トラックバック時刻: 2007年10月08日 13:19
» 売れまくり「けんいち」の謎!? from 究極マガジン
【数分の作業で最大4000もの検索エンジンに一括登録申請】検索エンジン一括登録ソフト「けんいち」毎日2??3本は出ているこの「けんいち」私のブログの売れ筋商品で... [続きを読む]
トラックバック時刻: 2007年10月08日 15:49
» 20日で344万円を稼ぐ雪だるま式貯金の方法 「ネットとメールしかできないフリーターがたった20日で344万円を稼ぎ出し232万円の借金地獄をあっという間にリセットした雪だるま式貯金を10日間の作業で仕掛けた方法」 → http://netomailshika.jugem.jp/ from ネットとメールしかできないフリーターがたった20日で344万円を稼ぎ出し232万円の借金地獄をあっという間にリセットした雪だるま式貯金を10日間の作業で仕掛けた方法とは? で稼ぐのはあなた?
初めまして、いつも楽しく拝見しています。この度「ネットとメールしかできないフリーターがたった20日で344万円を稼ぎ出し232万円の借金地獄をあっという間にリセ... [続きを読む]
トラックバック時刻: 2007年12月08日 12:15
» アイデムと言ったらジョブアイデムですよ from アイデムで仕事探しませんか?
こんにちわ。就職活動中のかずですアイデムは、仕事情報をインターネットやフリーペーパーなどで発信する求人広告企業です。 [続きを読む]
トラックバック時刻: 2007年12月28日 00:17
» 歌舞伎町 ホストクラブ Definition『デフィニション』 ホスト募集 from 歌舞伎町 ホストクラブ Definition『デフィニション』 ホスト募集
歌舞伎町ホストクラブ ホスト募集 Definition 初めまして!ホスト募集・歌舞伎町ホストクラブ・面接を担当します相沢と申します。業界の事を詳しく知らない... [続きを読む]
トラックバック時刻: 2008年01月18日 11:12
» アイデムエールスタッフのPC研修制度 from アイデムで仕事探し
アイデムエールスタッフにはパソコンのスキルアップができるPC研修制度があります。... [続きを読む]
トラックバック時刻: 2008年01月27日 18:12
» アイデム 関西で給料の高いお仕事【アイデム 求人 エキスパート@アイデム しごと.com】 from グラビアアイドル 画像ちゃんねる☆☆【グラビアアイドル無料画像】
この度は、トラックバックをお受けいただき誠にありがとうございます
アイデムの関西求人情報の中で、比較的月給や日給、時給の高いアルバイトをいくつか検索してみ... [続きを読む]
トラックバック時刻: 2008年02月04日 22:50
» アイデム from アイデム
映画では、レニー・ゼルウィガ−が好演してますね。 内容もとても好評で、どの映画... [続きを読む]
トラックバック時刻: 2008年02月06日 15:49
» Ree Amateur Adult Action from Ree Amateur Adult Action
Rotic Cruise [続きを読む]
トラックバック時刻: 2008年05月12日 20:35
» 558110派遣 from 558110派遣
558110派遣 [続きを読む]
トラックバック時刻: 2008年05月13日 06:00
» Wwwpornpassplanetcom from Wwwpornpassplanetcom
Eyes W... [続きを読む]
トラックバック時刻: 2008年05月16日 20:47
» Nudist Fun from Nudist Fun
[続きを読む]
トラックバック時刻: 2008年05月17日 01:13
» Ornbilly from Ornbilly
Uge Nipples... [続きを読む]
トラックバック時刻: 2008年05月17日 10:23
サイン・インを確認しました、 . さん。コメントしてください。 (サイン・アウト)
(いままで、ここでコメントしたとがないときは、コメントを表示する前にこのウェブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)