注意: この文書の内容には古い事柄が含まれています。 最新の情報は SuikaWiki:manakai をご覧ください。
たとえば Perl で書かれた CGI script, それも掲示板なんかには、 こんなみっともない code が載っていたりします。
jcode'convert(*from, "jis");
jcode'convert(*subject, "jis");
jcode'convert(*message, "jis");
open (MAIL, "| $sendmail");
print MAIL "From: $mail ($from)\n";
print MAIL "To: $mailto\n";
print MAIL "Subject: $subject\n";
print MAIL "\n";
print MAIL "$message";
print MAIL "\n";
close (MAIL);
これでは視認性も良くないですし、うっかり修正し間違えると 変なメッセージを送信してしまいます。 (筆者はしょっちゅうはまってました:-) (それに多くの code では、 HTML でのクロスサイトスクリプティング (CSS) 問題と 類似の問題への対処をしていません。)
オブジェクト指向を取り入れて次のような感じでメッセージを 構成したいところです。
use Message::Entity; my $msg = new Message::Entity; my $hdr = $msg->header; $hdr->add ('From')->add ('me@bar.example'); $hdr->add ('To')->add (['foo@bar.example', display_name => 'Mr. foo']); $hdr->add (Subject => $subject); $msg->body ($body); # $smtp->send は SMTP で送信する method と仮定。 $smtp->send ($msg);
CPAN を探すと、
これに似たようなことができそうなモジュールはあるようですが、
実際に使ってみると、与える値によっては RFC 822/2822 に違反する
結果を出力するとか、そもそもそれ以前に、
$hdr->addr ('Foo Bar <foo@bar.example>')
のようにメッセージ形式をモジュール内に隠匿しきれていないとか、非
ASCII 文字を考慮していないとかの不満があります。
(実装方針としては不正な値はモジュールに渡す前に弾くべきという考え方もあるでしょうけど、一般的な利用に際しては賢い設計だとは思えません。)
ということで、はじめは既存のモジュールの wrapper (あるいは補完) を書くつもりでしたが、なんだかごちゃごちゃしていて、 それなら車輪の再発明になっても一から書いてみようと考えました。
group
を解釈出来ます。Message-ID
を生成出来ます。Content-Disposition
) に対応しています。
パラメーター値拡張 (RFC 2231)
も入出力ともに実装しました。encoded-word
)
の解読に対応しています:-)Content-Location
にも対応しています。CR
や LF
が単体で出現する場合、
正しく処理出来CRLF
と等価とみなします。)
将来の版ではオプションで制御可能になるかもしれません。comment
を表すのに正規表現
(??{ code })
を使っているので、これを解釈出来る、
5.6 以降の版である必要があります。
Message-ID の生成にこれらを使用する場合のみ、 Message::Field::MsgID が使います。
Content-MD5:
領域の付加や検証を行う場合、
Digest::MD5 が必要です。 (Message::Entity)
ちなみに、 Quoted-Printable や RFC 2231 の % 符号化は自力で復号します。
日本語メッセージを扱うなら必須でしょう。 詳しくは文字コードの扱い の章をご参照下さい。
suika.fam.cx の SSH account をお持ちの場合、 CVS から入手出来ます。
$ cvs -d :ext:username@suika.fam.cx:/home/cvs co messaging/manakai
Web からも取り出せます:
<http://suika.fam.cx/gate/cvs/messaging/manakai/>
最新開発版 snapshot の tarball を取得することもできます。
manakai は自由ソフトウェアです。 GNU GPL に従って利用出来ます。 詳しくは各構成ファイルを御覧下さい。
Web 上の連続する資源 (掲示板の記事のようなもの) を切り出して RFC 822 形式のメッセージにするエンジン部分。
Bunshin.pm を使って、電子ニュースに記事を投稿する script。 (cron とかから呼び出して使う。)