用語 mailto: の使い方

質問
CGIなしでFORMの内容を受け取る方法はありますか?
mailto:を使いましょう。
質問
mailto:はどのように使ったらよいのですか?
質問
受け取った内容が人間には読めませんが?
この頁を読みましょう。

必要な環境

想像がつくかとは思いますが、mailto: スキームはメイラーに対して指示を出すものです。ですから、あなたがWebブラウザを使っていたとして、mailto:を引っかけたなら、Webブラウザに内蔵されたメイラーが動きます。
逆に言うと、メイラーを内蔵していないWebブラウザは、これに対応できません。せいぜい、別のメイラーを起動するだけです。
かつてのMicrosoft Internet Explorerはメイラーを内蔵しておらず、mailto:に出くわしたときにはMicrosoft Exchangeを起動するだけでした。IE4以降はようやく対応するようになったようですね。Windowsなんて職場でしか使わないので、詳しくは知りませんが。

そういうわけで、どの環境の人からもFORM入力の結果を受け取りたければ、面倒でもCGIで受ける必要があります。mailto: スキームが使えるのは、利用者側の装置がメイラーを装備している場合だけです。このことは承知しておいてください。

基本的な書き方

mailto: スキームはEメールを受け取るためのものですから、メールアドレスと共に使います。基本的な書き方は、mailto:にメールアドレスを繋げます。例えば

mailto:poetlabo@cap.bekkoame.ne.jp

後は、これを必要な部分に入れてやるだけです。

A要素に使う

mailto: の最も簡単な使い方は、A要素のHREF属性値に入れることです。例えば、このページの下端にある奥付では、次のようにマークアップしてあります。

<A HREF="mailto:poetlabo@cap.bekkoame.ne.jp">poetlabo@cap.bekkoame.ne.jp</A>

こうしておけば、錨になっている部分をポチるだけでメイラーが起動し、poetlabo@cap.bekkoame.ne.jp宛のEメールを出す用意が整います。

また、?subject= を付け加えておけば、Eメールのsubjectまで用意してやることができます。

<A HREF="mailto:poetlabo@cap.bekkoame.ne.jp?subject=mailto:の使い方">poetlabo@cap.bekkoame.ne.jp</A>

特定のsubjectが必要な場合には、これはなかなか便利です。

?subject=以降は、URIの一部となりますので、本来はUS-ASCII文字セットで書く必要があります。でも、対応するメイラーなら?subject=以降は送信されないので、実際には日本語文字セットでも支障ないでしょう。

FORM要素に使う

FORMのACTION属性にmailto: を使えば、CGIなしにEメールでFORMの入力結果を受け取ることができます。
この場合、METHOD=GETでも受け取れないことはないでしょうが、GETは一行文を受け取るための仕組なので、長い文章は途中で切れることもあります。METHOD=POSTの使用が薦められます。

<FORM METHOD="POST"
ACTION="mailto:poetlabo@cap.bekkoame.ne.jp"
ENCTYPE="multipart/form-data">

<DIV>
<TEXTAREA NAME="report" ROWS="10" COLS="40"></TEXTAREA>
</DIV>

</FORM>

ENCTYPEについて

上の例では、ENCTYPEという見慣れないものが出て来ました。この属性については、多くの参考書が説明をはしょっています(単に著者が知らないだけでしょう)。実は、FORMから送られるのは単なる文字列ではなく、何らかの形式で符号化されたものです。ENCTYPEは、その符号化形式を指定する属性です。

ENCTYPEの指定がない限り、送信内容はapplication/x-www-form-urlencoded形式で送られることになっています。これだと全てURL符号化して送られるわけですが、URL符号はUS-ASCII文字セットで書かなくてはならないので、US-ASCII以外の文字セットは全て文字コードに変換されて送られます。
ですから、ENCTYPEの指定がないときは、日本語で書かれた内容をそのまま受け取って読むことはできず、URL符号から再変換しなければなりません。そのためのデコーダもVectorを始めとするWeb上で拾うことはできるものの、各種デコーダが完全に復号できるとは限りません。

日本語文字セットのままで送信内容を受け取ることができる形式の一つは、text/plainです。ENCTYPE="text/plain"としておけば、これを理解するWebブラウザは日本語のままFORM内容を送信してくれるでしょう。また、charsetパラメタを追加して、ENCTYPE="text/plain;charset='ISO-2022-JP'"などと受け入れる文字セットまで指定することもできます。複数の文字セットを指定するにはコンマで区切ってENCTYPE="text/plain;charset='ISO-2022-JP',text/plain;charset='Shift_JIS',text/plain;charset='EUC-JP'"などとします。

ここで使っているmultipart/form-data形式は、RFC1867で提案され、RFC2388で更新されたものです。そして、HTMLの国際化を規定したRFC2070では、このmultipart/form-data形式の使用を薦めています。
この形式の特徴は、すべての項目についてContent-Typeヘッダがついてくることで、これだと文書文字セットのparameterまで含めることができるのです。つまり、どんな文字セットを使って書いたかまで伝わります。文字化けを防ぐ方法としても有用であると言えます。

というわけで、ENCTYPE="multipart/form-data"の使用をお薦めいたします。
なお、HTML 4.0 仕様書には、ENCTYPEが使えるのはMETHOD=POSTのときとされているのですが、DTD にはそんなこと書いてないですね。まあ、METHOD=POSTの方が無難ではあります。

Copyleft: 1998, 魔術幻燈
poetlabo@cap.bekkoame.ne.jp