Moblog設置ドキュメンタリー[その1]

メールを送るだけでBlogを更新するのって何気に難しいですな。

一時期moblogの話を色々なところで聞いたので、それほど苦労せずにMTに組み込めたりするのかと思っておりました。

しかしどうやら暗雲が。とりあえず”moblog”で検索してみると出てくるのはサービスばかり。

もちろんきちんとしてるし信頼性もあるし手軽でいいのですが、出来れば自前で全てまかないたいという思いが。

というわけで大したWebプログラミングの知識も無く設置してみようと言う、ドキュメンタリーエントリーです。

本当に今から悩みながら書くので、どうなるか分かりません(‘A`) 明日には無かったことになってるかも。 まずmoblogはどんなもんかと調べると、伊藤譲一氏によると、moblogはmail2entryというもので成り立っているらしい。

Aron Atkins氏作成らしいですが、この記事からダウンロードできます。

Joi Ito’s Web: mail2entry moblog code update これが、基本的にサーバに入れて動かすもの。

我が家のVineに入れられないこともないのでしょうが、そこにたどり着くまでに自分のスキルではどえらく時間がかかりそうなのでナシ…。

インストールされた方も結構おられるので、将来のためにメモメモ。

 #Bell’s Memorandum: mail2entry

 #matsubokkuri: mail2entry

さて、どうしたものかと検索していると、どうやらWEB-YATAIさんの方で、cgi版が出ている模様。

さっそくこれを使わせてもらうことに。

とは言っても、そのまま使っていてもいつまでたってもヘボのままなので、それだけはどうしても嫌なのでソースも読んでいく事に。

教材ですなー。

何ていうかみんなゴリゴリ書ける人のブログばっかりだから、たまにゃこういったショボいのもいいのでは…検索すると凄い人たちばっかりだもんよ(‘A`)キガヒケル

ちなみに自分のスキルは、C言語をやろうと発奮するも『明解C言語』と『ポインタ完全制覇』をやってなんか満足してコードも書かずにいて振り出しに戻り、その後、もう一度発奮してPerlやろうと、O’REILLYの『初めてのPerl』『プログラミングPerl』をなんとか消化した程度です。

Moduleとかの知識は『Blog Hacks』読みながら得たものくらいです。

未来検索の結果を正規表現やらでRSSにしてパースして、Javascriptにしてサイトに表示する位が限界です。

さらに、サーバは基本的な操作位しか出来ない。

はてさて、どこまでやる気が持つか…(‘A`)

とりあえずスタート

ひとまず先ほどのWEB-YATAIさんからソースをダウンロード。

印刷して斜め読みした感じでは、対象のPOPサーバにあるメールをModuleで定期的に取得して、それをパース。

さらにそれを目標のMTにエントリーとしてPOSTする、というもののようです(本当に読みながら書いているので違うかも)

使うModuleが結構あります。

Net::POP3; MIME::Parser; MIME::WordDecoder; Image::Size; Jcode; CGI File::Copy; MT; MT::Entry; MT::Blog; MT::Image;、と10個以上です。

この中で良く分からんものをまずは調べておくことにします。

Net::POP3

とりあえず POP3がPost Office Protocol 3だと今初めて知った(‘A`)

perldocがNet::POP3 – POP3(Post Office Protocol 3)クライアントクラス (RFC1939)にあるので、とりあえず問題なさげ。

簡単なサンプルはモジュールを使って POP3 クライアントを作ってみようにあります。

しかしこんな簡単にCGIからPOPとかいじれるのね…もっと、こう、なんか凄いことになっているイメージが。

0と1がたくさん出てくるんですよ、えぇえぇ。

しかし、モジュールの概要を調べる前に、ひとまずPOP3そのものについて知っておかないと、痒いところに手が届かない感じで気持ち悪くて仕方ないです。

なので、調べてみる。

とりあえずNet::POP3のソースを見てみるも、イマイチどうやってPOP3サーバと通信してるのか分からない(と言うかModuleのソースがよく理解できない。

Classとか完全に忘れている)さかのぼってNet::Netrcを見てもよう分からんですわ。

そんなこんなで、モチベーションが急激に右肩下がりですが気を取り直してPOP3サーバの仕組みから探ってみることに。

すると、@ITに魅力的な記事が。さすが。

その記事とは、インターネット・プロトコル連載のPOP3の回。  #ラスト・ワン・ホップ プロトコル「POP3」   図1の動作模式図は分かりやすい…POP3もFTPやらHTTPやらと同じで、コマンドのやり取りで成り立ってるのか…。

つまり、これを実装すればCGIでPOP3クライアントが出来る、と。

大まかな動作の流れが分かったので、これで何とか吸収できそうな予感。

さて、モジュールのメソッドなどは、具体的にはこんな感じのようです。

#目的のPOPサーバにセッションを張る
$pop = Net::POP3->new($hostname) ;
#POP3で言う、USERとPASSコマンドでログイン認証を行う。
# Net::POP3でも、userメソッドとpassメソッドがそれに当たる。
$pop->user($username);
$auth_check = $pop->pass($password);
#LISTコマンドで取得できる
# 1 1142 # 2 1102 #みたいな、メッセージ番号とサイズのリストは、Net::POP3だと、
#同じくlistというメソッドで得られる。
#直接引数にメッセージ番号を渡せば、そのメールのサイズが返る。
$msg = $pop->list($msg_num)
#引数なしだと、keyがメッセージ番号、valueがサイズのハッシュへのリファレンスが返る。
$msg_hash = $pop->list();
#RETRコマンドは、 メッセージ番号を引数として、メッセージのダウンロードを行う。削除はしない。
#Net::POP3だと、getメソッド。メッセージのテキストが入った配列へのリファレンスで来る。
$msg_content_ref = $pop->get($msg_num);
#DELE メッセージ番号で、メッセージを消去
#Net::POP3では、同じくdeleteメソッド。引数にメッセージ番号。
$msg_flag = $pop->delete($msg_num);
#QUITでセッション終了。
#Net::POP3でもquitメソッド。
$msg_flag = $pop->quit();

コマンド名とメソッド名が大体同じで助かるところです。なんとかOK。

しかしPOP3だけでずいぶん時間を食いました。

でも、仕組みがそれなりに理解できたのでさっぱりさっぱり。

土台がどうなってるのか分からないまま上に家を建てるのが、どうにも気持ち悪い性質でして。

@ITのプロトコル連載には、他にもHTTPやらMIME、SMTP、FTPもあります。読まねば。

何はともあれ@ITの中の人に感謝。

MIME::Parser

さて、続いてMIME::Parserです。何と言うか、すぐに@ITのさっきのMIMEのところを読むべきか…。

読みました。分かりやすい。  

#しかし、何か目的もなしに読むと頭に入らない罠。

MIME::Parserは日本語ドキュメントがないので原文。

search.cpan.org: MIME::Parser – experimental class for parsing MIME streams

しかし、何気に今MIME::Parserで検索すると九割五分以上moblogの記事がひっかかる。

MIME::Parserは、MIME::Toolsのサブクラスみたいです(送信とかするにはそっちが必要。)

#MIME-Toolsの概要はsearch.cpan.org: MIME-toolsから。以下も同。

MIME::Parserは、メールデータをMIME::Entityクラスに変換し、様々なメソッドを通じて操作できるようにするために存在するようです。

こいつを通せば、とても扱いやすくなり、メールのヘッダ情報とか本文とかがメソッド一発で簡単に取り出せるようになります。凄い。

my $parser = new MIME::Parser;
#データが “in core”(メモリ内ってことでいいのだろうか)の場合の読み込み方法
$entity = $parser->parse_data($message);
#ファイルハンドルなどのストリームから入力する場合の読み込み方法
$entity = $parser->parse(*STDIN);
#ファイルから入力するときの読み込み方法
$entity = $parser->parse_open(“/some/file.msg”);

入力のバリエーションとパースはこんな感じ。

RSSを作るのに使った、XML::Parserに似ていてちょっと安心。

同じパーサーだから当たり前か(‘A`) 続いて、パースしたものをどこのディレクトリに展開するかとかどういう名前をつけるかとかそういったセッティングが必要らしい。

#メモリ上に展開する。ただ、メールを装った悪意あるファイルかもしれないので処理に注意。
$parser->output_to_core(1);
#出力ディレクトリを設定する。各メッセージごとに1フォルダ割り当て
$parser->output_under(“/tmp”);
#出力ディレクトリを設定する
$parser->output_dir(“/tmp”);
#拡張子を指定する $parser->output_prefix(“msg”);

そしてエラー処理について。

#エラーをキャッチしたら
eval { $entity = $parser->parse(*STDIN) };
#エラー情報を取得
( $parser->results )
#最後に処理していたメールのヘッダを得る。
if ($@) { $results = $parser->results; $decapitated = $parser->last_head; }

後オプションとか色々ありましたが、MIME:Parserはこんな感じなのだろうか。

イマイチピンときてない。

だがとりあえずNet::POP3; MIME::Parser;と最後にMIME::WordDecoder;で、ひとまとまりな気がするのでMIME::WordDecoderを見てから悩むことにしますか…(‘A`)

MIME::WordDecoder

Cpanのドキュメントはsearch.cpan.org: MIME::WordDecoder – decode RFC-1522 encoded words to a local representationから。

これも、さっきのMIME::Toolsのサブクラス。

MIME::Wordの方に実例があった。  

IME::Words – deal with RFC-1522 encoded words

たとえば下のようなものがあって、

From: =?US-ASCII?Q?Keith_Moore?= <moore@cs.utk.edu> To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk> CC: =?ISO-8859-1?Q?Andr=E9_?= Pirard <PIRARD@vm1.ulg.ac.be> Subject: =?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?= =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?= =?US-ASCII?Q?.._cool!?=

こいつにWord::Decorderをかますとこうなるらしい

From: Keith Moore <moore@cs.utk.edu> To: Keld J/orn Simonsen <keld@dkuug.dk> CC: Andr’e Pirard <PIRARD@vm1.ulg.ac.be> Subject: If you can read this you understand the example… cool!

…Subjectの中の人は大変だ(‘A`) ギャル文字どころじゃないぞ。

変換されてるところがあったり無かったり。readは駄目でcoolは素通しなのかよ。

ひとまずメソッドとしては

$enc = ‘=?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk>’; @decoded_enc = decode_mimewords($enc) ;

みたいにするらしい。

配列に入れるのは、返り値が @decoded_enc[0]が[DATA]で、@decoded_enc[1]が[CAHRSET]だからだそうだ。うーむ。

まとめると、

NET::POP3でPOP3サーバに接続してメールデータを得て、それをMIME::ParserでパースしてMIME::Entityにする。

そしてMIME::WordDecoderで各文字コードにデコード、という感じなのかな…。

うぅむ。 なんか文字コードとMIME変換とマルチバイトと、そのあたりの変換がかなりの勢いでごっちゃになっているような気がします。

その辺が一番の混乱のもとのような。

そんな感じで机に突っ伏していたら河馬屋二千年堂さんに、ActivePerlでメールを受けるという記事が。

シンプルにこういたモジュールを使った、POP3へのアクセススクリプトが載っていました。

ありがたやありがたや…やっぱりサンプルはありがたいですな…。

というわけで、まず先にこっちのソースを読みながらmoblogへの基礎固めをする予定です。

次回はMoblog設置ドキュメンタリー[その2]::[7korobi8oki.com]です。

しかし、Google 検索: MIMEは凄いな。

Webコンサルタント中山陽平公式サイト お悩みの方へ。一回のご相談で解決することもあります
ラウンドナップ・コンサルティングへのお問合せ方法 お電話でのご相談もお気軽に。[048-234-3361](10〜16 土日祝日除)全国対応 24時間受付 お問合せメールフォーム