「Mailform」
取り敢えず完成形になったかな、というのがメールフォームのAcci_Correo(cgi)。
試しに似たようなのをPHPで作ってみた。
cgiでのメールフォーム作成で一番ネックになるのが受信した日本語が文字化けしていた、のところだと思う。
日本語でのメールのエンコーディング(漢字コード)は、jis と決められているので、jcode.pl、jcode.pm、nkf 等で送信前に本文などを変換すれば良い。
時代からすれば jcode.pm と思うのだけど、昔からのお馴染でつい可能なら jcode.pl を使ってしまう。
しかしメールのヘッダ、例えばタイトルが日本語の場合などは、MIMEエンコーディングでBASE64に変換しなければならない。
MIMEエンコーディングと言われても私にはさっぱり訳分からないので、mimew.plというライブラリを使わさせてもらった。
sendmailをopenしたら、
print MAIL &mimeencode("Subject: $subject")."
";
print MAIL "Content-Transfer-Encoding: 7bit
";
print MAIL "Content-Type: text/plain\; charset=iso-2022-jp
";
print MAIL "$Honbun
";
・・・・・・
とか記して、そしてメール本文の$Honbunは、予め
&jcode'convert(*contenido,'jis');
のようにしてjisに変換しておく。
できてしまえばそれはそれで簡単だと感じるのだが、知識ゼロからあやふや的に理解しながらよちよちスクリプトを記してちゃんと送信できた時の喜びは何物にも変え難いと思ったのは、のべ2ヶ月ぐらいかかったからかもしれない。6年くらい前だったかな(遠い目)。
それから改良を重ねて最終系的v3.8になったのが今のAcci_Correo。
フォームタグのhtmlに書き込んでそのまま送信ボタンを押せば受信、というのならまだ良いのだけど、送信前にこれで良いですか?など事前の確認画面を出すのが親切だと思った。
最初からいきなりつまずいてしまった諸悪の根源?は、htmlやcgi等をshift_jisで記していた事だ。
どうしても文字化けしてしまう幾つかの漢字があるので、shift_jisでのcgiも内部ではeuc-jpで処理してhtmlで表示する時に改めてshift_jisに変換して、という面倒なことをやっていた。
今思うとそれがすごく勉強になったのだが、htmlからcgiまで全てをeuc-jpで書き直せば良いことにずっと後になって気付いた。
htmlタグのcharsetだけならずhtml自体もeuc-jpに変更しないと文字化けする。
cgi/PHPに限らず、一つの大きな試練があるのが改行(コード)だ。
フォームhtmlタグの<textarea>〜</textarea>内に、
-----------------------------
こんにちは。
目玉焼き定食が喰いたい〜。
-----------------------------
と記して、そのまま送信前の確認画面にて表示させると、
-----------------------------
こんにちは。 目玉焼き定食が喰いたい〜。
-----------------------------
のような一列表示になる。
この一列表示をそのままメールで送ると、ちゃんと改行されて受信される。
この改行は
という記号によって改行されているのだが、html内では無視されて一列になるので、
ではなくて、ご存知の<br>に入れ替えなくてはならない。そういうのが分かるまで数日ハマった。
というのがcgiで、これがPHPで作成すると最初のmimew.plやjcode.pmなどが不要になり、たった一つの関数で事が済んでしまい、PHPの便利さの一つだと思った。
mb_send_mail( $to_mail, $subject, $Honbun, "FROM: $my_mail" );
で終わり。
↓気休めかもしれないけど、phpの最初の方に、
mb_language("Japanese");
mb_internal_encoding("EUC-JP");
と記しておくと、全てが一応euc-jpに合わせてくれる。
それでもPHPにアキレス腱があるとすれば、PHPのバージョンによる挙動の違い だと思う。
具体例をちょっと失念してしまったが、abcd_efg('○○', '××', '★★'); という関数があった場合、PHP 4.× だと abcd_efg('○○', '××',); でもちゃんと動いたのに、5.×で走らせると '★★' を明記しないとエラーがでたり動作が著しく緩慢になったりとetc。
運良く?PHPを始めたのはPHPの動乱期(v3〜4.前半)後だったので、それほど大きな混乱はなかったけど、それでも微妙な違いは残っていた。
現在(2008)は、v4 → 5への移行期間だけど、自宅サーバーと契約しているレンタルサーバーは5になったがクライアントなどのサーバーはいまだ4が多いので、チェック稼働の時にはあちらこちらにデバックのエラー表示を入れている。
4と5の両方を入れて切り替える方法もあるけど、私レベルだとかなり煩雑だし、もともとApacheやPHPなどが入っているMacOS自体に新たなMAMPを入れているので、まず4で動くようなスクリプトで記してから5でチェックしている〜。
現在(2011)は、PHP4は過去のものになったので、PHP5で気にせず記している。