1 |
wakaba |
1.1 |
<?xml version="1.0" encoding="iso-2022-jp"?>
|
2 |
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
3 |
|
|
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
4 |
|
|
<html xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml">
|
5 |
|
|
<head>
|
6 |
|
|
<title xml:lang="en">Message::* Perl modules</title>
|
7 |
|
|
<link rel="index" href="./" />
|
8 |
|
|
<?xml-stylesheet href="/s/simpledoc"?>
|
9 |
|
|
<link rel="stylesheet" href="/s/simpledoc" />
|
10 |
|
|
<link rev="made" href="mailto:w@suika.fam.cx" />
|
11 |
|
|
<link rel="copyright" href="/c/pd" title="Public Domain." />
|
12 |
|
|
<meta name="author" content="若葉" />
|
13 |
|
|
<meta name="keywords" content="Perl, module, pm, Message, RFC 822, RFC 2822, RFC 1036, son-of-RFC 1036, MIME, Usefor, HTTP, CGI, header, field" />
|
14 |
|
|
</head>
|
15 |
|
|
<body>
|
16 |
|
|
<h1>Message::* Perl modules</h1>
|
17 |
|
|
|
18 |
|
|
<h2>はじめのはじめに</h2>
|
19 |
|
|
|
20 |
|
|
<p>たとえば Perl で書かれた CGI script, それも掲示板なんかには、
|
21 |
|
|
こんなくだらない code が載っていたりします。</p>
|
22 |
|
|
|
23 |
|
|
<pre class="application-x-perl">
|
24 |
|
|
jcode'convert(*from, "jis");
|
25 |
|
|
jcode'convert(*subject, "jis");
|
26 |
|
|
jcode'convert(*message, "jis");
|
27 |
|
|
open (MAIL, "| $sendmail");
|
28 |
|
|
print MAIL "From: $mail ($from)\n";
|
29 |
|
|
print MAIL "To: $mailto\n";
|
30 |
|
|
print MAIL "Subject: $subject\n";
|
31 |
|
|
print MAIL "\n";
|
32 |
|
|
print MAIL "$message";
|
33 |
|
|
print MAIL "\n";
|
34 |
|
|
close (MAIL);
|
35 |
|
|
</pre>
|
36 |
|
|
|
37 |
|
|
<p>これでは視認性も良くないですし、うっかり修正し間違えると
|
38 |
|
|
変なメッセージを送信してしまいます。
|
39 |
|
|
(筆者はしょっちゅうはまってました:-)
|
40 |
|
|
(それに多くの code では、
|
41 |
|
|
HTML でのクロスサイトスクリプティング (CSS) 問題と
|
42 |
|
|
類似の問題への対処をしていません。)</p>
|
43 |
|
|
|
44 |
|
|
<p>オブジェクト指向を取り入れて次のような感じでメッセージを
|
45 |
|
|
構成したいところです。</p>
|
46 |
|
|
|
47 |
|
|
<pre class="application-x-perl">
|
48 |
|
|
use Message::Entity;
|
49 |
|
|
my $msg = new Message::Entity;
|
50 |
|
|
my $hdr = $msg->header;
|
51 |
|
|
$hdr->add ('From')->add ('me@bar.example');
|
52 |
|
|
$hdr->add ('To')->add ('foo@bar.example', display_name => 'Mr. foo');
|
53 |
|
|
$hdr->add ('Subject' => $subject);
|
54 |
|
|
$msg->body ($body);
|
55 |
|
|
|
56 |
wakaba |
1.2 |
# $smtp->send は SMTP で送信する method と仮定。
|
57 |
|
|
$smtp->send ($msg);
|
58 |
wakaba |
1.1 |
</pre>
|
59 |
|
|
|
60 |
|
|
<p><a href="http://www.cpan.org/" xml:lang="en">CPAN</a> を探すと、
|
61 |
|
|
これに似たようなことができそうなモジュールはあるようですが、
|
62 |
|
|
実際に使ってみると、与える値によっては <a href="urn:ietf:rfc:822">RFC 822</a>/<a href="urn:ietf:rfc:2822">2822</a> に違反する
|
63 |
|
|
結果を出力するなどの不満があります。 (例えば今の例で
|
64 |
|
|
<code xml:lang="en">To:</code> 領域に使っている
|
65 |
|
|
<code xml:lang="en">display_name</code> で「.」が含まれますが、
|
66 |
|
|
RFC 2822 的には新しいメッセージでは互換性のため
|
67 |
|
|
<code xml:lang="en" class="bnf rfc2822">quoted-string</code>
|
68 |
|
|
にする必要があります。しかしそのまま出力されます。)</p>
|
69 |
|
|
|
70 |
|
|
<p class="note">参考: 「.」の場合は RFC 2822 的には正しく解釈
|
71 |
|
|
されなければなりませんが (出力はすべきでない)、
|
72 |
wakaba |
1.2 |
これ以外の文字、例えば制御文字 <code class="character">ESCAPE</code> でも同じようになります。
|
73 |
wakaba |
1.1 |
こちらは完全に間違いです。</p>
|
74 |
|
|
<p class="note">参考: 実装方針としては不正な値はモジュールに
|
75 |
|
|
渡す前に弾くべきという考え方もあるでしょう。
|
76 |
|
|
でもそんなのは不便です。</p>
|
77 |
|
|
|
78 |
|
|
<p>ということで、はじめは既存のモジュールの wrapper (あるいは補完)
|
79 |
|
|
を書くつもりでしたが、なんだかごちゃごちゃしていて、
|
80 |
|
|
それなら車輪の再発明になっても一から書いてみようと考えました。</p>
|
81 |
|
|
|
82 |
|
|
<h2>実装状況</h2>
|
83 |
|
|
|
84 |
|
|
<ol>
|
85 |
|
|
<li>RFC 822, RFC 2822 の頭領域 (<code class="bnf rfc2822">header</code> <code class="rfc2822">field</code>) を解釈出来ます。</li>
|
86 |
|
|
<li>電子ニュース (<a href="urn:ietf:rfc:1036">RFC 1036</a> など), MIME, その他の追加頭領域の幾つかを解釈出来ます。</li>
|
87 |
|
|
<li>RFC 822/2822 の <code class="bnf rfc2822">group</code> なメイル・アドレスの領域内容を解釈出来ます。</li>
|
88 |
|
|
<li>日付形式では RFC 822/<a href="urn:ietf:rfc:1123">1123</a>, <a href="urn:ietf:rfc:733">RFC 733</a>, asctime, ISO 8601 (HTTP) などに対応。他の用途に転用出来ます。</li>
|
89 |
|
|
<li><a href="urn:ietf:id:draft-ietf-usefor-msg-id-alt-00">draft-ietf-usefor-msg-id-alt-00</a> に基づいた送信アドレスなどによる <code class="rfc2822">Message-ID</code> を生成出来ます。</li>
|
90 |
|
|
<li>まだ解釈出来ない構造化 (<code class="rfc2822">structured</code>) 頭領域について、表示のために <code class="bnf rfc2822">quoted-pair</code> を unquote して値を返すなど出来ます。</li>
|
91 |
|
|
<li>MIME 本体 (<code class="bnf rfc822">body</code>) にはまだ対応していません。 (<code class="media-type">text/plain</code> <code class="mime-cte">8bit</code> 固定)</li>
|
92 |
|
|
<li>説明はまだ不備です。各モジュールに pod で説明が入っていますが、
|
93 |
|
|
抜けていたり実態に合っていなかったりもします。
|
94 |
|
|
今の段階では code そのものが簡単に理解出来るとは思いますが。</li>
|
95 |
|
|
</ol>
|
96 |
|
|
|
97 |
|
|
<h2>今後の予定</h2>
|
98 |
|
|
|
99 |
|
|
<ol>
|
100 |
wakaba |
1.2 |
<li>電子ニュースの頭領域 (RFC 1036, <a href="spec/son-of-RFC1036">son-of-RFC1036</a>, draft-usefor-article) の実装</li>
|
101 |
wakaba |
1.1 |
<li>MIME の頭領域の実装。</li>
|
102 |
|
|
<li>追加/非標準の頭領域の実装。</li>
|
103 |
|
|
<li>MIME 本体 (<code class="bnf rfc822">body</code>) の実装。</li>
|
104 |
|
|
<li>文字符号変換のための hook の実装?</li>
|
105 |
|
|
<li>documentation。</li>
|
106 |
|
|
<li>使用例の作成。</li>
|
107 |
|
|
</ol>
|
108 |
|
|
|
109 |
|
|
<h2>入手</h2>
|
110 |
|
|
|
111 |
|
|
<p>suika.fam.cx の SSH account をお持ちの場合、 CVS から入手出来ます。</p>
|
112 |
|
|
|
113 |
|
|
<p class="example">$ cvs -d :ext:<var xml:lang="en">username</var>@suika.fam.cx:/home/cvs -d perl/lib/Message/</p>
|
114 |
|
|
|
115 |
|
|
<p>Web からも取り出せます。 <<a href="/gate/cvs/perl/lib/Message/">http://suika.fam.cx/gate/cvs/perl/lib/Message/</a>> (tarball で一括取得も出来ます。)</p>
|
116 |
|
|
|
117 |
|
|
<h2>ライセンス</h2>
|
118 |
|
|
|
119 |
|
|
<p>Message::* Perl modules は自由ソフトウェアです。
|
120 |
|
|
GNU GPL に従って利用出来ます。詳しくは各ファイルを御覧下さい。</p>
|
121 |
|
|
|
122 |
|
|
<h2>参考文献</h2>
|
123 |
|
|
|
124 |
|
|
<ul>
|
125 |
|
|
<li><a href="spec/">関連する仕様書 (RFC, Internet-Draft 等)</a></li>
|
126 |
|
|
</ul>
|
127 |
|
|
|
128 |
|
|
<div class="navigation">
|
129 |
|
|
[<a href="/" title="このサーバーの首頁">/</a>
|
130 |
|
|
<a href="/map" title="このサーバーの案内" rel="index">地図</a>
|
131 |
|
|
<a href="/search/" title="このサーバーの検索">検索</a>]
|
132 |
|
|
<a href="http://validator.w3.org/check/referer" xml:lang="en"><img
|
133 |
|
|
src="http://www.w3.org/Icons/valid-xhtml11" id="w3c-html"
|
134 |
|
|
alt="Valid XHTML 1.1!" style="height: 31px; width: 88px" /></a>
|
135 |
|
|
<a href="http://jigsaw.w3.org/css-validator/validator?uri=http://suika.fam.cx/~wakaba/Message-pm/introduction.ja.html" xml:lang="en">
|
136 |
|
|
<img style="width: 88px; height: 31px" id="w3c-css"
|
137 |
|
|
src="http://jigsaw.w3.org/css-validator/images/vcss"
|
138 |
|
|
alt="Valid CSS!" /></a>
|
139 |
|
|
</div>
|
140 |
wakaba |
1.2 |
<div class="update">$Date: $</div>
|
141 |
wakaba |
1.1 |
<ul class="myuri">
|
142 |
|
|
<li><URL:<a href="http://suika.fam.cx/~wakaba/Message-pm/introduction">http://suika.fam.cx/~wakaba/Message-pm/introduction</a>></li>
|
143 |
|
|
<li><CVS:<a href="http://suika.fam.cx/gate/cvs/perl/web/Message-pm/">suika.fam.cx:/home/cvs/perl/web/Message-pm/</a>></li>
|
144 |
|
|
</ul>
|
145 |
|
|
</body></html>
|