ホームページを訪れたとき、「お問い合わせはこちら」や「メール」といったボタンやリンクがあるサイトを見たことがあるだろう。このボタンやリンクをクリックすると、メールソフトが起動し、Toフィールドにアドレスが入ることがある。INTERNET Watchのトップページもそうだ。この機能はHTMLのmailtoタグを利用しており、実装は非常に簡単だ。
このほかにも、クリックすると入力フォームが表示され、自分の名前やアドレス、コメントを記載して「送信」ボタンを押すと、メールで送信されるものもある。こちらは「フォームメール」と呼ばれるCGIを使って、Web上で入力された内容をサーバーからメールするものだ。このフォームメールはアクセスした人のメッセージを受け取るだけでなく、アンケートにも使用することができる。今回は、このフォームメールについて紹介する。
フォームメールは、ホームページに訪れた人に名前やアドレス、コメントを記載してもらい、「送信」ボタンを押してもらうと、ホームページオーナーがメールで内容を受け取れるシステムだ。
このフォームメールとmailtoタグは、どちらもメールを受けるためのものだが、フォームメールの場合は、メールアドレスをWeb上に掲載しないで済むというメリットがある。「なぜメールアドレスを公開しないのか?」「メールに返信すればメールアドレスは通知されるではないか?」という疑問があるかと思うが、Web上にメールアドレスを掲載した結果Webサイトをスキャンしてメールアドレスを集められて、SPAMを送信される…という問題などから逃れることができるのである。
もうひとつのメリットとしては、送信する内容を指定できることだ。コメントだけのメールならばどちらの方法を利用しても同じであるが、必ず記入してほしい項目がある場合には、フォームメールならばその旨を送信者に伝えられるし、さらにその項目が記入されていなければ送信できないようにもできる。
フォームメールは、CGIとして動作するため、基本的にはCGIが動作するサーバーでなければ使うことはできない。メールを送信するのに、Unix等で使われているメール配送ソフト「sendmail」を使用するため、sendmailがインストールされていないサーバーでは使えない。プロバイダーが、不正送信を防止するために、CGIからのsendmail利用を禁止しているところも多い。
だが、自分でCGIを置かなくてもフォームメールを使うことができるサイトもあるし、sendmailがなくても送信するかわりに内容をファイルに落としておいて後で見るということもできる。これから順にそれらを説明していこう。
フォームメールは、基本的にCGIが動作しなければ使えない。ただし、プロバイダーによってはCGIを自分で置けなくても、プロバイダーが用意したフォームメールなら利用できることもある。
たとえば、BEKKOAMEがそれにあたる。BEKKOAMEではこれまでCGIが使えなかったため、メールを送信する「MailBack」と呼ばれる機能を会員のために設けていた。最近では、BEKKOAMEでもCGIを使うことができるようになったが、CGIからsendmailを使用できないようにしているので、今でもMailBack機能を使うように推奨している。
もうひとつは、フォームメールサービスを利用する方法もある。こちらもCGIを設置する知識がなくても、HTMLを書くだけ、またはアンケートに答えるだけで簡単に設置できる。
■BEKKOAME - MailBackの使い方
http://www.bekkoame.ne.jp/HOMEPAGES/mailback/index.html
■YAMA.NETCGIサービス/フォームメール通知システム
http://www.yama.net/cgi/
WWW上に掲載されているHTMLを少々書き換えるだけでさまざまな項目を指定でき、フォームメールを設置することができる。
■簡単ホームページ制作工房
http://fukuoka-jp.com/cgi/page/post.html
背景の色、名前、メールアドレスなどのアンケートに答えると専用のフォームを作ることができる。作ったフォームは「簡単ホームページ制作工房」上で公開され、名前、メールアドレス、ホームページURLとコメントが受けとれる。
続いて、フォームメールCGIについて紹介しよう。CGIはWebサーバーと連動して動作するプログラムなので、あらかじめCGIが動作するWebサーバーを用意しておく必要がある。
また、メールを送信するためには、そのWebサーバーにsendmailがインストールされている必要がある。もし、sendmailが使えないという場合は、「sendmailがない場合」で紹介する方法を参考にしよう。メールは漢字コードがJISである必要があるので、漢字コード変換プログラム「nkf」やPerlの漢字コード変換ライブラリにjcode.plが必要になる。
フォームメールCGIは、フォームに書かれた内容を変換してメールで送るだけなので、CGIが動作するWebサーバーとsendmail等が備わっていれば作るのは簡単だ。しかし、ある程度Perlを知っていなければイチから作成するのは難しいので、フリーソフトやシェアウェアなどの形態で配布されているフォームメールCGIを利用していこう。これらを利用すればプログラミングの知識がなくてもCGIを設置できる。また、これをたよりに改造していくことで細かい処理が可能となる。
以下にフォームメールCGIを配布しているサイトを紹介する。フォームメールCGIによって、CGIを設置後のメンテナンスや運用の手間などが違ってくるので、よく説明を読んで自分にあったものを見つけよう。下記のサイト以外にも、掲示板CGIの解説(本誌6月21日号参照)の際に紹介したサイトなども参考にするとよいだろう。
■ネットサーフレスキュー
http://www.rescue.ne.jp/
http://www.rescue.ne.jp/cgi-rescue/cgi?form2mail (フォームメール)
各種の有名なCGIがダウンロードできる。「nkf」や「sendmail」を使用する「フォームメール」がある。設置情報も掲載されているので、安心して設置できるだろう。
■North Net Initiative
http://www2.snowman.ne.jp/~nnet/
「フリーCGIダウンロード 」コーナーにある「全てのフォームに対応したデコードCGI」がこれにあたる。また、「CGIの簡単な覚え方(Perl)」にはPerlの作り方が掲載されている。手持ちのCGIにさまざまな機能を追加するための参考になるだろう。
■Matt's Script Archive
http://www.worldwidemart.com/scripts/
各種の世界的に有名なCGIがダウンロードできる。「formmail」がフォームメールCGIにあたる。日本語に対応していないが、改造すれば日本語の送信もできる。
いつもの特集ではフリーのCGIの設置する方法を紹介しているが、フォームメールCGIは処理が非常に簡単なので、今回はオリジナルのプログラムを作ってみる。UNIXサーバー上のperlで動作することを前提に説明するが、ある程度変更すれば、perlをインストールしたWindows NTでも動作すると思われる。なお、できるだけ簡素に作っているので、細かい動作を必要とする場合にはさらに改良をしてみよう。
プロバイダーによっては、不正なメール送信を避けるために、CGIからのsendmailの使用を制限しているところも多い。そのため、あらかじめsendmailが使えるか確かめておこう。sendmailが使えない場合の方法は「sendmailがない場合」で紹介する。
今回のCGIのサンプルは下記の場所から入手できる。このほか、今回のプログラムでは、漢字コード変換のために「jcode.pl」を必要とするので、自分のサーバーに設置されていない場合はダウンロードしておこう。
■今回作成したCGIサンプル
http://www.wizvax.net/ymasa/impress/
■漢字コード変換のPerlライブラリ「jcode.pl」
ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/
【1】CGIプログラムを作る
以下に今回のプログラムのコードを、上から順を追って実行順に説明する。
(1)Perlの場所の指定
Perlで組まれたCGIでは、一番先頭の行に「Perl」の場所を書く。これがサーバー上のPerlの場所と同じでなければCGIは動作しない。perlが/usr/local/bin/perlにある場合は「#!/usr/local/bin/perl」、/usr/bin/perlある場合は「#!/usr/bin/perl」と指定する。2行目にあっても動作しないので、必ず1行目に書く。
#!/usr/local/bin/perl |
(2)jcode.plの場所の呼び出し
日本語を使用するCGIの多くは漢字コードを統一するために漢字コードを変換する外部プログラムを使用する。「nkf」を使用する方法もあるが、サーバーによってはインストールされていないことがあるので、ここでは「jcode.pl」を使用する。
「jcode.pl」はCGIと同一の場所に置き、「require './jcode.pl';」と指定してプログラムから呼び出す。すでにサーバーに用意されている場合には「require '/usr/local/bin/jcode.pl';」などのように指定する。
require './jcode.pl'; |
(3)sendmailの場所の指定
Web上で入力された内容をメールで送信するためにsendmailを用いる。今回のプログラムでは、「$sendmail = '/usr/lib/sendmail';」のように後で変更したりしやすいように変数に指定する。これ以外の場所にある場合は「$sendmail = '/usr/sbin/sendmail';」というようにサーバーに合わせて設定する。
$sendmail = '/usr/lib/sendmail'; |
(4)受け取るメールアドレスの指定
フォームメールCGIによっては、CGI内でメールアドレスを指定するのではなく、フォームメールページのHTML中にメールアドレスを指定するものもある。しかし、これでは送信先を変更されてしまい、他人にメールが送ることができてしまうので好ましくない。今回のプログラムでは、送信先メールアドレスはCGI内で指定する。メールアドレスを後で変更したりしやすいように、$mailto変数に設定しておく。
$mailto = 'user@mail.host'; |
(5)送信後にジャンプするURLの指定
フォームメールCGIからメールを送信した後、記載された内容はメールで送られるが、送った後にWeb上になにかを表示しなければならない。例えば、「メール送信ありがとう」といったページを作っておき、そのページにジャンプするように指定すればよい。このジャンプ先のURLも後で変更しやすいように、$page変数に設定しておく。
$page = 'http://mail.host/~user/thankyou.html'; |
(6)フォームから送信されたデータの変換
フォームから送信された日本語テキストは、プログラムが扱いやすい形式に変換されているため、そのままでは日本語として扱いにくい。掲示板CGIでもチャットCGIでも、日本語を日本語として使うためにデータを変換する必要がある。
Perlを知らないとプログラムを組めないと思われるかもしれないが、わからなくても下記のプログラムを呪文だと思って使用すればよいので、そのまま使ってみよう。なお、送られたテキストのHTMLタグを無効にするため「<」「>」「"」を取り除いているが、それらを有効にする場合は該当行を削除しよう。
|
(7)受信した内容を変数に入れる
上記のデータ変換をすると、HTMLの「INPUT NAME=タグ」で指定されたテキストを、プログラム中で「$FORM{'フォーム名'}」で受けられるようになっている。例えばHTMLで「<INPUT NAME="mail">」となっていれば「$FORM{'mail'}」にその内容がセットされる。このままでは、プログラム上で扱いにくいので、下記のように変数に入れておく。
|
この場合は、name、mail、commの3つの変数にセットされる。さらに「<INPUT NAME="nick">」のように別項目も必要という場合には、「$nick =$FORM{'nick'};」と増やしていけばよい。なお、すでに使用している$sendmail、$mailto、$pageなどの変数を使うと動作しなくなるので、重ならないように気をつけよう。
(8)メールの送信
ここまでのコードで必要なデータが変数設定された。これらを元に、sendmailを用いてメールを送信する。
ただし、このままではSubjectに日本語が使えないので日本語を指定してはならない。また、「$_ = <<"EOM";」は、$_という変数に、そこから「EOM」という行までのテキストをセットする指定になっている。そのため、この間に他の命令をいれることはできない。
|
(9)送信終了メッセージのページへのジャンプ
送信が終了したら、後は指定したURLにジャンプすればCGIが完成する。
以上の全プログラムコードを書き込んだファイルは「mail.cgi」として保存しておこう。
【2】メール送信ページを作成する
CGIが完成したら、入力フォームのページを作成する。ここでは例として簡素なものを掲載するが、実際に使うものはもっと凝ったものになるだろう。このファイルは「mail.html」として保存しておこう。
|
【3】メール送信後のジャンプページの作成
メールを送信した後にジャンプするページを作成する。これも例として簡素なものを掲載するが、実際に使うものは、もっと凝ったものになるだろう。このファイルは「thankyou.html」として保存しておこう。
|
【4】作ったファイルのサーバー設定
以上で作成した「mail.cgi」「mail.html」「thankyou.html」および必要に応じて「jcode.pl」をアップロードする。
アップロードにはFTPクライアントを使用する。このとき注意するのは、いままで説明したファイルはすべてアスキーファイルなので、「アスキーモード」で転送するのを忘れないことだ。
FTPクライアントによっては、「.txt」のファイルはアスキーモードで、「.cgi」や「.pl」のファイルはバイナリーモードで転送されることがある。FTPクライアントの設定をよく確かめよう。
Webサーバーやプロバイダーによっては、CGIを動作させるために、「.htaccess」というファイルを作成する必要がある。必要かどうかはサーバーやプロバイダーの説明書を確認すること。サーバーによっては不要であったり、逆にこのファイルがあると動作しなくなることもある。
このファイルを作るには、「.htaccess」というファイルを新規で作成し、「AddType application/x-httpd-cgi .cgi」と書いてセーブする。これをCGIと同じ所にアップロードすればよい。
【5】ファイルのパーミッション(権限)を変更する
ファイルを転送したら、転送したファイルや作成したディレクトリのパーミッション(権限)を、CGIが動作するために設定する必要がある。パーミッションを設定するには、UNIXとそのサーバーのシステムを学んでおく必要がある。
「mail.cgi」は「755」、「mail.html」「thankyou.html」および「.htaccess」は「604」と設定するのが基本となる。ただし、パーミッションをどう設定するかは、CGIやサーバーによって設定が異なるので、説明書を参考にしよう。また、設定をしっかりしておかないと、同じプロバイダーの別のユーザーによってファイルを消されたり、書きかえられたりするという可能性もあるので、十分に注意しよう。
【6】動作確認をしてみる
実際にmail.htmlにアクセスして、メールを送信してみよう。ここで動作しない場合はなにかしらの設定ミスが考えられる。
動作しない理由を知る方法で一番基本なのは、Webサーバーのerror_logファイルを確認することだ。ただし、プロバイダーなどでerror_logを含むログが見られないサーバーもある。そのような時はエラーを推測するしかない。例えば、単純な記述ミス、ディレクトリ、HTMLファイル、jcode.plなどの関連ファイルの名前やパーミッション設定を間違えたり、それらをCGI内で指定する時にミスタイプしていたり、アップロードに失敗するなどが考えられる。推測する方法は掲示板CGIの解説(本誌6月21日号参照)の「8:動作確認をする」を参考にしてほしい。
フォームメールCGIを自分で作成した人が「Subjectが文字化けして困る」ということがある。実は、メール本文はJISコードならば日本語を使用しても問題はないのだが、SubjectやTo、Fromなどのメールヘッダー部分には、日本語(2バイトコード)を使用することはできないのだ。よって、メールソフトで受信をしたときに文字化けを起こしてしまうのである。
しかし、今となっては当たり前のように日本語を含んだSubjectを使っているので、話に矛盾を感じる方もおられるかもしれない。実は、メールソフトでメールを送るときSubjectやTo、Fromなどに日本語を入力すると、メールソフトがMIMEコードと呼ばれる1バイトコードに変換して送信してくれるのだ。受信側でも、そのデータはメールソフトが日本語(2バイトコード)に変換しているのだ。
つまり、フォームメールCGIの場合も、メールヘッダー部分に日本語を使用する場合は、MIMEコードに変換してから送信してやる必要がある。
MIMEコードに変換(Bエンコード)する1つの方法は、Perlモジュール「Base64.pm」をインストールして、プログラムの中で
|
とすることだ。
もう1つはPerlライブラリ「bese64.pl」を用いる方法だ。こちらのほうがわかりやすいので、以下ではこちらの方法をおすすめしよう。そのためにはあらかじめbese64.plをダウンロードし、jcode.plと同じようにWebサーバーにアップロードしておく必要がある。bese64.plはさまざまなサイトから入手することが可能だ。
■bese64コンバートPerlライブラリ「base64.pl」
ftp://ftp.dti.ad.jp/.1/lang/CPAN/scripts/mailstuff/base64.pl
このファイルをダウンロードし、「----- cut here -----」の行と、それより上を削除する。
base64.plを使用するためには、先ほど使ったmail.cgiから呼び出す必要がある。設定方法はjcode.plと同じだ。jcode.plの設定の部分を下記のように変更すればよい。
|
そして、プログラム中でメールを送信する部分を下記のように書き換えれば、Subjectを日本語にすることができる。下記の例では「さぶじぇくと test」というSubjectがMIMEエンコードされて送信されることになる。ただし、$subjectが長いとうまく動作しないので気をつけよう。
もし、Web上で書き込まれた内容をSubjectにしたいときには、<FORM INPUT>タグにおいて「SIZE=32」などあらかじめ長さを制限することで解決できるだろう。その場合には十分のテストをしてから運用してもらいたい。
なお、今回のプログラムでは、話を簡単にするために、1バイト文字もMIMEコードに変換されてしまうようになっているのだが、本来は2バイトコードのみをMIMEコードに変換するほうが好ましい。特に、ToやCcを変換してしまうと、メールアドレスがわからなくなってしまうのでやってはいけない。
|
sendmailがなくてメールを送信できない場合の一番簡単な解決方法は、メール送信するべき内容を、かわりにWebサーバー上のファイルに落としてしまう方法がある。この方法はメールを送信する部分open(SENDMAIL,~sendmail.");を下記のように書き換えてしまえばよい。
この方法ではメールで送信するべきかわりに、「sendmail.txt」というファイルに追加して書き込まれるので、あらかじめsendmail.txtという空のファイルを作成し、パーミッションを606などにしておくことを忘れずに。あくまでファイルで書き込まれるだけなので、自分で読みに行くのを忘れないようにしよう。また、ある程度ファイルが大きくなったら自分で「sendmail.txt」の中身を空にしよう。
open(SENDMAIL,">>sendmail.txt") || die("Cannot use sendmail."); |
参考までに、sendmailと同一の機能をもつPerlモジュール「Sendmail.pm」をCGIに組み込んでしまうことで、sendmailがなくてもメールは送信できる。
■Simple platform independent mailer「Sendmail.pm」
まず、このファイルをダウンロードしよう。ファイルを展開して、mail.cgiをアップロードしたディレクトリに「Mail」ディレクトリを作成し、そこにSendmail.pmをアップロードすればよい。ただし、本文が日本語であることを宣言するためのヘッダー「Content-Transfer-Encoding: 7bit」と「Content-Type: text/plain; charset=iso-2022-jp」が使用できないので、日本語が文字化けしてメールの内容が読めないことがある。よって、自分以外の人にメールを送信しないほうがよい。
以下に、Sendmail.pmを使用した方法を紹介する。なお、これで動作をしない場合、Sendmail.pmを「Mail」ディレクトリに置いていないというミスも考えられるので、Mail/Sendmail.pmを確認してみよう。
|
以下に、改良するときの注意点について述べておく。
1:フォームから送信元と宛先の両方は指定できないようにする
フォームメールの目的は、ホームページの閲覧者からメールを受けるために設置するものだ。その場合には、メールの宛先(To)は必ず自分になるので、送り主が宛先を指定できるようにする必要はない。逆に、送信された内容を入力した人に送ることもあるかもしれないが、その際には送信元(From)は、必ず自分のメールアドレスとしておこう。
なぜ、このことを避けるべきかといえば、他人のメールアドレスを書いてメールを送信するいたずらをされる恐れがあるからである。Cさんが、ToにAさんを書き、FromにBさんを書いたとしよう。この場合、BさんがAさんにメールを送ったように見えてしまい、他人になりすますことが容易になってしまうからである。
2:できれば送り先は自分だけにするほうがよい
入力した人にもメールを送るようにすると、アドレス欄に他人のアドレスを書かれた場合、その他人にメールを送ってしまうことになる。
自由にメッセージを記載できる場合には、その他人が嫌な思いをすることもありえる。もちろん、そのことをわかった上でサービス上必要なこともあるのだが、細心の注意は必要だ。もし、サービス上で行う場合には「そのメールがどこから、なぜ送信されたのか?」、「苦情はどこで受け付けているのか?」を“1行目”に明確にしておくとよい。受信をした人は、自分に関係ないメールは、最後まで読まないので、文章内や文末に書かれても読まれないことが多いからである。
3:sendmailを使うときの注意点
技術的な注意になるが、いままでに紹介したsendmailの呼び出し方、フォームに入力された内容をsendmailのパラメータにするようなプログラムを書いてはいけない。
open(SENDMAIL,"|$sendmail -t -f $mailto") || die("Cannot use sendmail."); |
と指定している場合には、$mailtoはCGI内を書いた人だけが指定できるので、問題ない。それに対して、
open(SENDMAIL,"|$sendmail $mail") || die("Cannot use sendmail."); |
などとして、フォームに入力された内容である$mailをパラメータに使用すると、その$mailになにを書かれるかがわからない。例えば、サーバー上でプログラムを実行させるといったことも、フォームの入力で指定できてしまうことになるのだ。よって、sendmailに渡す内容は必ず固定されたものを使用すべきなのである。
4:メールは必ずJISで送信、ヘッダーには2バイトコードを使わない
メールの内容をWeb上から書かれたコードのまま送信するCGIもあるが、メールのテキストは必ずJISで、ヘッダーは1バイトコードで送信すると決められているので、本文はJISに変換、ヘッダーに2バイトコードが含まれるときにはMIMEに変換してから送信しよう。
5:メールアドレスなどをHTMLに書くときの注意点
よくフォームメールを使ったページのソースを見ると、送信先のメールアドレスをhiddenタグによって指定しているものを見かける。hiddenタグに記入しておくことで、CGIを書き換えなくてもHTMLを書き換えるだけで変更できるのは便利かもしれない。しかし、hiddenタグを書き換えることができないと思っている人も多いが、実はhiddenタグをホームページ上で書き換えるツールが存在するのだ。メールアドレスだけでなく、パスワードやユーザーIDなども含めできるだけCGI内で指定すべきである。
6:誰でも利用できるフォームデコードサービスはやらない方がよい
「CGIが使えない場合はどうすればいいのか」でも紹介した、HTMLだけを書けば誰にでもメール送れるサービスは、CGIが使えないサーバーの利用者にはありがたいものだ。しかし、ToもFromも自由に設定できるというところで、やはりこれも危険なのだ。このようなサービスを設けたい場合は、使用者を登録して、特定の使用者、特定のページ以外からは使用できないようにしておくことが好ましいだろう。
以上の「フォームメールの改良について」に記載したとおり、なにも考えずに改良してしまうと、思わず他人に迷惑をかけてしまうこともあるので、十分に気をつけたいところだ。
フォームメールの基礎を覚えることで、ホームページをさらに発展させることができる。たとえば、Web上に設置したアンケートの内容をメールで受けとったり、ショッピングモールでWeb上の注文をメールで受け取って即時に対応したり、掲示板CGIを改造して掲示板に書かれたことをメールでも受けたりなど、アイデアはいろいろと考えられる。情報を公開するだけのホームページから双方向性を持つようになれば、ホームページがさらに楽しいものになっていくだろう。
('99/11/22)
[Reported by ymasa@wizvax.net]