フォームメールのCGI

formail.cgi

次に送られてきたフォームのデータをデコードし、メールとして送るスクリプトです。perlというスクリプト言語を使ったCGIです。

それぞれの値は以下のような変数名に格納されてCGIに渡されています。
お名前は? name
性別は? sex
E-Mailアドレス email
どうやってこのページを知りましたか? where
どのページがおもしろかったですか? good
どのページが役に立ちましたか? study
ご挨拶スペース comment

これをメールとして送るスクリプトは以下の通りです。

★最重要!これから説明するHTMLドキュメントやCGIはすべて、文字コードをEUC、改行コードをLFにします。CGIで文字コードを統一させる事もできますが、文字化け等のトラブルを極力減らすために、すべて、EUC,LFに統一するということにします。


#!/usr/local/bin/perl

        $sendmail = '/usr/lib/sendmail';
        $myaddress = 'yyy@xxx.xxx.or.jp';  

                require "cgi-lib.pl";
                require "jcode.pl";

                &ReadParse;
        $agent = $ENV{'HTTP_USER_AGENT'};
        $referer = $ENV{'HTTP_REFERER'};
        $host = $ENV{'REMOTE_HOST'};
        $name = $in{'name'};
        $sex = $in{'sex'};
        $email = $in{'email'};
        $homepage = $in{'homepage'};
        $where = $in{'where'};
        $good = $in{'good'};
        $study = $in{'study'};
        $comment = $in{'comment'};

                @good = &SplitParam($good);
                @study = &SplitParam($study);

        $comment =~ s/&/&/g;
        $comment =~ s/</&lt;/g;
        $comment =~ s/>/&gt;/g;
        $comment =~ s/\015/\012/g;
        $comment =~ s/\015\012/\012/g;

($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime;
        $mon++;
@week = ('日','月','火','水','木','金','土');
        $wday = $week[$wday];

if($email eq ""){
    print<<Error_Message;
    Content-type: text/html

    <HTML><HEAD><TITLE>Error</TITLE></HEAD>
    <BODY><CENTER><H2>メールアドレスを必ずお書きください</H2><BR>
    <B>ブラウザのバックボタンでお戻りください</B></CENTER>
    </BODY></HTML>
Error_Message
}else{

# 以下、メール送信;

$message = <<END_OF_MESSAGE;
Subject: enquete
Reply-To: $email

■年月日
$year/$mon/$mday($wday) $hour:$min:$sec

■ブラウザ
$agent

■リンク先
$referer

■プロバイダー
$host

■お名前
$name

■性別
$sex

■メールアドレス
$email

■ホームページ
$homepage

■このWebを見つけたきっかけ
$where

■面白かったページ
$good[0]
$good[1]
$good[2]
$good[3]
$good[4]

■為になったページ
$study[0]
$study[1]
$study[2]
$study[3]
$study[4]
$study[5]

■コメント
$comment
END_OF_MESSAGE

&jcode'convert(*message,'jis');

                open(MAIL,"|$sendmail $myaddress");
                        print MAIL $message;
                close(MAIL);

print <<END_OF_HTML;
Content-type: text/html

<HTML>
        <HEAD><TITLE>TANKS</TITLE>
        </HEAD>
<BODY>
<H1>以下のように書き込みました。</H1><BR>
年月日:$year/$mon/$mday<BR>
お名前:$name<BR>
性別  :$sex<BR>
E-Mail:$email<BR>
HOMEPAGE:$homepage<BR>
きっかけ:$where<BR>
END_OF_HTML

print "<B>面白かったページ</B>:<BR>\n";
  foreach $goods(@good){
    print "${goods}<BR>\n";
    }

print "<B>ためになったページ</B>:<BR>\n";
  foreach $studys(@study){
    print "${studys}<BR>\n";
    }

print <<END_OF_HTML;
<B>コメント</B>:$comment<P>

これはメールでホームページ作者に送られます。

</BODY>
</HTML>
END_OF_HTML

exit;


では簡単に説明しておきます。特にHTMLのフォームの方でNAME="xxx"で指定した名前が、ここでは活躍しますので、もう一度HTMLで付けた名前を確認しておいてください。

#!/usr/local/bin/perl
# perlで書いたスクリプトなので、perlを呼び出す為にパスです。#!の後に書くのがお約束です。パスはサーバーによって違うのでプロバイダーに確認が必要です。
$sendmail = '/usr/lib/sendmail';
# sendmailというUNIXのメールプログラムを利用する為、起動するためのパスを書きます。これもプロバイダーによって違います。sendmailをドライブする事を禁止しているところもあるので注意です。
$myaddress = 'yyy@xxx.xxx.or.jp';
# 自分のメールアドレスを指定します。
require "cgi-lib.pl";
require "jcode.pl";
# cgi-lib.plというライブラリーのスクリプトを利用しますが、その使用を宣言します。これは送られてきたデータは通常URLという形式にエンコード(暗号化)されています。name=%25%2B%46%3A%24 といった感じですので、これを=でわけて、%25などを通常の文字に変換してくれるスクリプトです。
# jcode.pl文字コードを変換してくれるスクリプトです。EUC、JIS、SJISに対応しており、これもインストールしておく必要があります(すでに用意されているプロバイダーも有ります)
&ReadParse;
# cgi-lib.plの中のデコードの部分の機能を実行します。
$agent = $ENV{'HTTP_USER_AGENT'};
$referer = $ENV{'HTTP_REFERER'};
$host = $ENV{'REMOTE_HOST'};
# これらは、訪問者が記入したデータではなく、ブラウザが環境変数というところに保持しているデータを引き出すためのものです。環境変数に関してはアクセスログのコーナーに詳しい説明があります。上の3つは、ブラウザ名とここに来る前に居たWebと、使用しているサーバー(プロバイダー)の情報を引き出し、それぞれの変数に代入しています。$xxxxが変数で、データを入れておく入れ物です。
$name = $in{'name'};
$sex = $in{'sex'};
$email = $in{'email'};
$homepage = $in{'homepage'};
$where = $in{'where'};
$good = $in{'good'};
$study = $in{'study'};
$comment = $in{'comment'};
# 送られてきたデータはcgi-lib.plによってデコードされ、%in という連想配列に格納されているので、それをそれぞれ変数に代入します。$name = $in{'name'}は%inからname部分を抜き出し、$nameという変数に代入します。
@good = &SplitParam($good);
@study = &SplitParam($study);
# ここでもcgi-lib.plの機能を一部利用しています。これは上記で$good $studyという変数に入ったデータを(これらは複数のデータが入ってるはずですね。面白かったページと為になるページは複数選択されていますから)、配列に代入します。なぜこういう事をするかというと、$xxxxxという変数に代入されていると一つのデータとして扱われてしまいますが、@xxxxxという配列の場合は、複数のデータとして処理できるからです。
$comment =~ s/&/&amp;/g;
$comment =~ s/</&lt;/g;
$comment =~ s/>/&gt;/g;
# これは、置換えをしています。comment欄に書かれたメッセージにHTMLタグを使う人がいます。これを生かしたいのであれば、この三行は必要ないので、消してもOKです。これは例えば<H1>で大きな文字を指定した人が、</H1>を忘れると、その後の文字がすべて大きくなるので、掲示板やBBSでは禁止したり、この様に < をタグとして扱わないようにコードに置換えてしまう方法を使ってます。まあ、メールなら問題はないので消してもいいでしょう。
$comment =~ s/\015/\012/g;
$comment =~ s/\015\012/\012/g;
#改行コードをUNIX用に統一しています。Macが\015 UNIXが\012 Winが\015\012です。
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime;
        $mon++;
@week = ('日','月','火','水','木','金','土');
        $wday = $week[$wday];
# メッセージが送られてきた時間を知る為のスクリプトです。localtimeのデータをそれぞれの変数に代入しています。
# $mon++ は、月は0〜11という数字で表示されるので、それを月と考えると一月足りなくなりますので、++で1を足して正しい月に変更します。++ は +1と同じです。
if($email eq ""){
    print<<Error_Message;
    Content-type: text/html

    <HTML><HEAD><TITLE>Error</TITLE></HEAD>
    <BODY><CENTER><H2>メールアドレスを必ずお書きください</H2><BR>
    <B>ブラウザのバックボタンでお戻りください</B></CENTER>
    </BODY></HTML>
Error_Message
}else{
#電子メールで送るため、メールアドレスが未記入の場合に、エラーを返します。
  if(条件){
     条件が合うときに行うこと
  }else{
     条件が合わないときに行うこと
  }
#もし(if)、email イコール(eq) 空欄("")の時、エラーを表示し、沿うでない場合(else)は、メールを送る。という事です。
$message = <<END_OF_MESSAGE;
Subject: enquete
Reply-To: $email
# $message = <<END_OF_MESSAGE; 以下、再度END_OF_MESSAGEで締めくくるまでは記述されたとおりに、変数$message に代入してゆきます。
# Subject: でタイトルを指定します。タイトルは必ず英数半角にしてください。sendmailでタイトルに日本語を使うと化けます。
# Reply-To: には、送信者のメールアドレス($emailという変数に入っています)を入れます。通常このシステムでは、送信者アドレスはwww@xxx.xxx.or.jp などといったサーバーのアドレスになっている為、返事を書く時に間違ったところに送らないよう、返事は送信者のアドレスに送ると指定するためです。
■年月日
$year/$mon/$mday($wday) $hour:$min:$sec
# それぞれに変数に入った年月日時間のデータを書き込みます。
■ブラウザ
$agent
# $agentという変数に入っているブラウザのデータを書き込みます。
以下同じ事の繰り返しです。
■リンク先
$referer
■プロバイダー
$host
■お名前
$name
■性別
$sex
■メールアドレス
$email
■ホームページ
$homepage
■このWebを見つけたきっかけ
$where
■面白かったページ
$good[0]
$good[1]
$good[2]
$good[3]
$good[4]

■為になったページ
$study[0]
$study[1]
$study[2]
$study[3]
$study[4]
$study[5]
# @good と @study に格納された複数の答え(値)を、縦に並べて表示します。
@goodは、答えが最大5つありますので、配列から5つの答え(値)を引き出します。
$good[0]は、配列@goodに入っている最初の値です(0から始まる)。3つしか値がなければ、$good[3]と$good[4]は何も表示しません。
#$study[0]は、@studyという配列に入った最初の値です。最大6つの値があります。
■コメント
$comment
END_OF_MESSAGE
# ここまでがメールのメッセージになります。
&jcode'convert(*message,'jis');
# メールはJISコードで送るという約束があるため、ここでメッセージをすべてJISに変換します。
open(MAIL,"|$sendmail $myaddress");
         print MAIL $message;
close(MAIL);
# ここでメールをsendmailにて送信します。MAILというファイルハンドル(ファイルを操作する時は、かならずこのファイルハンドルを指定します)で、sendmailを起動し、$myaddress で指定したアドレスに、$messageに代入されているメールメッセージをprint(書き込み)して送信します。最後に、ファイルハンドルを閉じます。
"|$sendmail $myaddress"は。| $sendmailへのパイプを接続し、$myaddressに送ります。
print <<END_OF_HTML;
# ここからは訪問者にお礼を言うメッセージを表示します。
print <<EOH; でこの下からはすべて表示するという意味になります。END_OF_HTML でもEOHでも、基本的にはなんでも可。
Content-type: text/html

<HTML>
        <HEAD><TITLE>TANKS</TITLE>
        </HEAD>
# Content-type: text/html で、HTMLドキュメントである事を知らせます。このヘッダーと<HTML>との間には必ず一行間を空けないとエラーになります。
<BODY>
<H1>以下のように書き込みました。</H1><BR>
年月日:$year/$mon/$mday<BR>
お名前:$name<BR>
性別  :$sex<BR>
E-Mail:$email<BR>
HOMEPAGE:$homepage<BR>
きっかけ:$where<BR>
END_OF_HTML

print "<B>面白かったページ</B>:<BR>\n";
  foreach $goods(@good){
    print "${goods}<BR>\n";
    }

print "<B>ためになったページ</B>:<BR>\n";
  foreach $studys(@study){
    print "${studys}<BR>\n";
    }

print <<END_OF_HTML;
<B>コメント</B>:$comment<P>
# 一応書き込んだ内容をそれぞれの変数から取り出して訪問者に確認させてますが、既に送った後なので、訂正はできません

#面白かったページと、ためになったページは、配列に入っている値をすべて、foreachによって引き出して表示するスクリプトになっています。
   foreach 変数(配列){
      print 変数;
   }

こう書くことで配列から順に値を引き出して表示するということになります。
これはメールでホームページ作者に送られます。

</BODY>
</HTML>
END_OF_HTML
# ここまでで表示は終わりです。
exit;

上記をコピーしてもいいのですが、必要なものをアーカイブでまとめてありますので、ダウンロードしてください。(すべて文字コードはEUC、改行コードはLFになっていますので、EUC LFに対応したエディタが必要です)
Windows版は解凍にLHAソフトが必要です。ディレクトリ付で解凍してください。
Macintosh版は解凍にStuffIt Expanderが必要です。

 ZAPさんのフリーソフトダウンロードページへ ←ここをクリックする

前ページでダウンロードした場合は、同じものですのでダウンロードしないでください。

★かならず文字コードをEUC、改行コードをLFにしてください。
  • 前ページ:enquete.html(アンケート用フォームHTML)
  • formail.cgi(CGI)の説明
  • 次ページアンケートメールの設置
  • 次次ページ:HTMLから直接メールサーバーに送る方法

  • Copyright:ZAP 1997.4