Japan-Net ホーム サイトマップ
ジャパンネット サービス案内 サポート ビジネスソリューション サイト制作 サービス体制 会社情報 お問い合せ
カスタマーサポート

メールフォーム


使い方等は、ソースを読んで理解して使用してください。


●ご質問について
form や cgi についてどのように使ったいいかとか、自分の利用しているサイトで利用するには、どうすればいいのかといった内容のご質問には、申し訳ありませんが、回答致しません。

【重要な注意事項】
サンプルソースは、参考のために、差出人、宛先がどちらも ブラウザーから指定できるようにしてありますが、このまま使用するとSPAMメールに利用される可能性があります。 サンプルソースをこのまま使用することは絶対にせず、必ず、宛先は、CGIスクリプトの中に直接記述してブラウザーから指定できないようにして使用するようお願いいたします。



■postmail.cgiの使い方。
下のサンプルは、皆さんに内容を理解してもらえる様に、全ての項目が入力可能にしてありますが、 通常は、mailto, subject, message0, message1, message2, message3, は、TYPE="text" ではなく TYPE="hidden" にして使うでしょう。
<FORM ACTION ="https://www.Japan-Net.ne.jp/cgi-bin/postmail.cgi" METHOD ="POST">
<DL COMPACT>
<DT>メール送信先アドレス(半角/英数)これが電子メールの To: になります(必須)<BR>
(この欄が空だとエラーになります)<BR>
複数のアドレスを入れる場合は、半角カンマで区切って下さい。
<DD><INPUT TYPE="text" NAME="mailto" SIZE="60"><P>
<DT>メール送信先アドレス(半角/英数)これが電子メールの CC: になります<BR>
複数のアドレスを入れる場合は、半角カンマで区切って下さい。
<DD><INPUT TYPE="text" NAME="cc" SIZE="60"><P>
<DT>メール送信先アドレス(半角/英数)これが電子メールの BCC: になります<BR>
複数のアドレスを入れる場合は、半角カンマで区切って下さい。
<DD><INPUT TYPE="text" NAME="bcc" SIZE="60"><P>
<DT>メールのサブジェクト これが電子メールの Subject: になります
<DD><INPUT TYPE="text" NAME="subject" SIZE="60" VALUE="CGI-postmail.cgi-sample"><P>
<DT>送信ボタンをクリックしたときに表示されるメッセージタイトル。 これは、電子メールでは、送られません。
<DD><INPUT TYPE="text" NAME="message0" SIZE="60" VALUE="正常に送信されました。"><P>
<DT>送信ボタンをクリックしたときに表示されるメッセージ1。 これは、電子メールでは、送られません。
<DD><TEXTAREA NAME="message1" ROWS="4" COLS="60">メッセージ1</TEXTAREA><P>
<DT>送信ボタンをクリックしたときに表示されるメッセージ2。 これは、電子メールでは、送られません。
<DD><TEXTAREA NAME="message2" ROWS="4" COLS="60">メッセージ2</TEXTAREA><P>
<DT>送信ボタンをクリックしたときに表示されるメッセージ3。 これは、電子メールでは、送られません。
<DD><TEXTAREA NAME="message3" ROWS="4" COLS="60">メッセージ3
メッセージ1〜3の中には HTML のタグを入れることもできます。<BR>
たとえば<A HREF="http://www.Japan-Net.ne.jp/">
ジャパンネットのホームページ</A>とか。</TEXTAREA><P>
<DT>メール発信人の名前。これと下の電子メールアドレスが、電子メールの From: になります
<DD><INPUT TYPE="text" NAME="name" SIZE="60" VALUE="へのへのもへじ"><P>
<DT>メール発信人の電子メールアドレス
<DD><INPUT TYPE="text" NAME="email" SIZE="60" VALUE="foo@bar.co.jp"><P>
<DT>メール発信人のホームページのURL これも、電子メールのヘッダになりますが、なくてもかまいません。
<DD><INPUT TYPE="text" NAME="url" SIZE="60" VALUE="http://foo.bar.co.jp"><P>
<DT>メールを送る内容
<DD><TEXTAREA NAME="コメント" ROWS=8 COLS=60>ここにメールを送る内容を書けます。
実際には、サンプルのページの様にいろいろなタグを使うことができます。</TEXTAREA><P>
</DL>
<INPUT TYPE="submit" VALUE="送信">
<INPUT TYPE="reset" value="内容を消去">
</FORM>

このページの上へ



■postmail.cgi ソースリスト。
このcgiは、自由に使用可とします。下記サンプルを参考にしてご利用下さい。
#!/usr/local/bin/perl
# perl の path を ご使用の環境に合わせて下さい。
#
$sendmail="/usr/sbin/sendmail";
# sendmail は、メールを送る為のプログラムです。これもご使用の環境に合わせて下さい。
$nkf="/usr/local/bin/nkf -e";
# nkf は、漢字コードの変換です。ご使用の環境に合わせて下さい。
$encode="/usr/local/bin/enMime";
# enMime は、MIMEエンコードするものです。ご使用の環境に合わせて下さい。
#
require 'jcode.pl';
&jcode'init();
# jcode.plを使って、このスクリプトで使用している漢字コードと
# ブラウザで使用している漢字コードが違う場合の文字化けを解消しました。
# $KCODE に、このスクリプトで使用している漢字コードをセットして下さい。
$KCODE="euc";
#
$version="Version 0.45/Beta(2000/9/25)";
#
# postmail.cgi : sending mail from www Version 0.43/Beta
#
# Version 0.44/Betaになりました。
# charset の指定がなかったので文字化けをする場合がありました。
# ブラウザ-画面へはEUCで返すようにしました
#
# Version 0.43/Beta
# returnurlが送れたよの画面で表示してしまっていたので表示しないようにした。
#
# Version 0.42/Beta
# MIMEKIT1.8を使ってMIMEエンコードするようにしました。
#
# Version 0.41/Beta
# 戻るのリンク先を、"returnurl" で指定できるようにしました。
# "returnurl" が空の場合には、今まで通りcgiが呼び出されたページになります。
# クライアントのホスト名を表示するようにしました。
#
# Version 0.4/Beta
# メールアドレスを複数記述する際の区切りを半角スペースから
# 半角カンマに変更しました。
#
# Version 0.39/Beta
# メールアドレスに全角文字を入力される方が、このごろ非常に増えてきました。
# そのため、文字をチェックするようにしました。
# 自動変換はせずに、エラーを表示させます。
# (全角文字を使っちゃいけない事を理解してもらうためです)
# (1998/11/16)入力文字についてのコメント追加
# メールアドレス等の入力項目の文字チェックは、cgiでは簡単なチェックしか
# しておりません。より使いやすくするには、cgiを手直しするよりも、cgiを
# 呼び出す FORM 側に JavaScript等を 使って チェックするようにしたほうが
# いいでしょう。
#
# Version 0.38/Beta
# いままでは、
# From: "名前" <e-mail_address> となる様にしてありましたが、
# 名前に 全角カタカナの"ア"が入っているとおかしくなってしまいます。
# 他の文字でもおかしくなるかも知れません。
# (MIME エンコードしていないので)
# MIME エンコードをしても、MIME デコード機能のないメーラーでは、
# 読めませんので、
# From: <e-mail_address>
# と言う形にしました。
# (名前は、半角英数字しか使えない様にすればいいのですが。。。)
#
# Version 0.37/Beta
# 若干の修正
#
# Version 0.36/Beta
# このスクリプトをそのまま使用して、差出人が空欄のメールを受けて
# その差出人空欄のメールに対してそのまま返信(自動応答で)をする方が
# 見受けられますので、差出人が空欄の場合、メールを出せなくしました。
# (こんな処理は入れたくありませんでした。)
#
# Version 0.35(97/2/13)
# メールで送られる順番が変わってしまったので、その部分の処理を元に戻しました。
#
# Version 0.34(97/1/26)
# ごめんなさい。Version 0.33 は、間違って 古いプログラム(テスト途中)を
# アップしてしまいました。<BR>
# ついでなんで、CC: と BCC: の 処理を入れました。
#
# Version 0.33(97/1/21)【削除】
# ここで追加された機能は、間違っていたのでバージョンコメントも
# 削除しました。
#
# Version 0.32
# jcode.plを使って、cgiスクリプトで使用している漢字コードと
# フォームのページの漢字コードと
# ブラウザで使用している漢字コードが違う場合の文字化けを解消しました。
#
# Version 0.31
# 少しだけ変えました。(使い方は、何も変わってません)<BR>
# <BLOCKQUOTE>Version 0.2の「name に 漢字が使える様になりました。」を、説明不足で
# NAME="xxx" の xxx に漢字が使えると勘違いした方ごめんなさい。<BR>
# 実際には、NAME="name" VALUE="xxx" の所に漢字が使える様になったのでした。<BR>
# NAME="xxx" では漢字が使えません。</BLOCKQUOTE>
#
# Version 0.3
# メールを送った後のページに「戻る」をつけました。<BR>
# postmail.cgi に 少しコメントを入れました。<BR>
# cgiをやろうというかたは、ある程度プログランミングの知識がおありになると
# 思われますので、この程度のコメントでお許し下さいませ。
#
# Version 0.2
# 少しだけ変えました。name に 漢字が使える様になりました。
#
# Version 0.1
# 最初のバージョンです。
#
# 定数
#
@aname=("mailto","email","cc","bcc");
$bname{'mailto'}="宛先";
$bname{'email'}="差出人";
$bname{'cc'}="カーボンコピー";
$bname{'bcc'}="ブラインドカーボンコピー";
#
# REQUEST_METHOD
#
# ホームページから渡されるデータを 変数 $buffer に格納する。
# cgiの作り方が載っている本には、必ず載っている定版のルーチンです。
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
#
#
# ホームページから渡されるデータを それぞれ 分離して $FORM に格納する。
# $buffer に aaa=xxxxx&bbb=yyyyy&ccc=zzzzz と入っているものを
# $FORM{'aaa'}=xxxxx
# $FORM{'bbb'}=yyyyy
# $FORM{'ccc'}=zzzzz
# にする。
# この際に %xx とコード表現になっている unprintable character を
# バイナリーにする作業もここで行っています。
# これもcgiの作り方が載っている本には、必ず載っている定版のルーチンです。
@pairs = split(/&/,$buffer);
foreach $pair(@pairs) {
($name,$value) = split(/=/,$pair);
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
&jcode'convert(*name,$KCODE);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
&jcode'convert(*value,$KCODE);
$FORM{$name} = $value;
}
#
# クライアントマシンのホスト名の取得
# proxy server 経由 の場合にもある程度対応
# (squid 等 の HTTP_X_FORWARDED_FOR をセットするproxy の場合)
local($flag)=0;
$host="";
@ips = split ( "," , $ENV{'HTTP_X_FORWARDED_FOR'} );
foreach $x(@ips){
$hostname = '';
if ($x =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/) {
$ip = "$1.$2.$3.$4";
$hostname = gethostbyaddr(pack('C4',split(/\./,$ip)),2);
if ($hostname eq '') { $hostname = $ip; }
$host=$host . $hostname . "[" . $ip . "] ";
if ($flag==0) {
$remote_host=$host;
$host=$host . "<BR>Use Proxy: ";
$flag=1;
}
}
}
$x=$ENV{'REMOTE_ADDR'};
$hostname = '';
if ($x =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/) {
$ip = "$1.$2.$3.$4";
$hostname = gethostbyaddr(pack('C4',split(/\./,$ip)),2);
if ($hostname eq '') { $hostname = $ip; }
$host=$host . $hostname . "[" . $ip . "]";
}
# パラメータチェック
if ( $FORM{'returnurl'} eq "") {
$ReturnPath=$ENV{'HTTP_REFERER'};
} else {
$ReturnPath=$FORM{'returnurl'};
}
if ( $FORM{'mailto'} eq "") {
# メールの宛先の指定がありません
open(OUT, "| $nkf");
print OUT "Content-type: text/html;charset=x-euc-jp\n\n";
print OUT "<TITLE>Request Not Accepted</TITLE>\n";
print OUT "<H1>メールを送信する事が出来ません。</H1>\n";
print OUT "<HR>\n";
print OUT "<H3>ホームページのフォームに問題があると思われます。</H3>\n";
print OUT "<H3>ホームページの作成者にご連絡下さい。</H3>\n";
print OUT "<HR>\n";
print OUT "<A HREF=\"$ReturnPath\">戻る</A><BR>\n";
print OUT "Postmail.cgi: $version\n";
print OUT "<HR>\n";
print OUT "Your Address: $host\n";
close(OUT);
exit(1);
}
if( $FORM{'email'} eq "") {
# 差出人アドレスが入ってません。
open(OUT, "| $nkf");
print OUT "Content-type: text/html;charset=x-euc-jp\n\n";
print OUT "<TITLE>Request Not Accepted</TITLE>\n";
print OUT "<H1>貴方のメールアドレスが未記入です。</H1>\n";
print OUT "<HR>\n";
print OUT "<H3>貴方のメールアドレスは、必ず記入して下さい</H3>\n";
print OUT "<HR>\n";
print OUT "<A HREF=\"$ReturnPath\">戻る</A><BR>\n";
print OUT "<A HREF=\"https://www.Japan-Net.ne.jp/~iwata/postmail-caution.html\">Postmail.cgi: $version</A>\n";
print OUT "<HR>\n";
print OUT "Your Address: $host\n";
close(OUT);
exit(1);
}
if( $FORM{'name'} eq "") {
# 差出人名が入ってません。
open(OUT, "| $nkf");
print OUT "Content-type: text/html;charset=x-euc-jp\n\n";
print OUT "<TITLE>Request Not Accepted</TITLE>\n";
print OUT "<H1>貴方のお名前が未記入です。</H1>\n";
print OUT "<HR>\n";
print OUT "<H3>貴方のお名前は、必ず記入して下さい</H3>\n";
print OUT "<HR>\n";
print OUT "<A HREF=\"$ReturnPath\">戻る</A><BR>\n";
print OUT "<A HREF=\"https://www.Japan-Net.ne.jp/~iwata/postmail-caution.html\">Postmail.cgi: $version</A>\n";
print OUT "<HR>\n";
print OUT "Your Address: $host\n";
close(OUT);
exit(1);
}
foreach $adname(@aname){
@addr=split(/,/,$FORM{$adname});
foreach $adr(@addr){
$result = &CheckChar($adr);
if ( $result == 0 ) {
open(OUT, "| $nkf");
print OUT "Content-type: text/html;charset=x-euc-jp\n\n";
print OUT "<TITLE>Request Not Accepted</TITLE>\n";
print OUT "<H1>$bname{$adname}メールアドレスが正しくありません</H1>\n";
print OUT "<HR>\n";
print OUT "<H3>メールアドレスの記述が間違っていると思われます</H3>\n";
print OUT "メールアドレスとしては、ふさわしくない文字が使われています。\n";
print OUT "メールアドレスは、半角文字で正しく記述して下さい。\n";
print OUT "<HR>\n";
print OUT "<A HREF=\"$ReturnPath\">戻る</A><BR>\n";
print OUT "<A HREF=\"https://www.Japan-Net.ne.jp/~iwata/postmail-caution.html\">Postmail.cgi: $version</A>\n";
print OUT "<HR>\n";
print OUT "Your Address: $host\n";
close(OUT);
exit(1);
}
}
}
#
# メールのサブジェクトが入って無い場合には "(No title)" にします。
#
if ($FORM{'subject'} eq ""){
$subject = "(No title) message for " . $ENV{'HTTP_REFERER'};
} else {
$subject = $FORM{'subject'};
}
#
# メールを送る。
#
if (open(ML,"| $encode | $sendmail -t")) {
print ML "X-Received: from $ENV{'HTTP_REFERER'} by postmail.cgi $version\n";
print ML "X-Received: from ($remote_host) by $ENV{'HTTP_REFERER'}\n";
print ML "To: $FORM{'mailto'}\n";
print ML "From: $FORM{'name'} <$FORM{'email'}>\n";
print ML "Cc: $FORM{'cc'}\n" if ($FORM{'cc'});
print ML "Bcc: $FORM{'bcc'}\n" if ($FORM{'bcc'});
print ML "Subject: $subject\n";
print ML "Sender: web\@japan-net.ne.jp\n";
print ML "X-Mailer: postmail.cgi $version\n";
print ML "X-User-Agent: $ENV{'HTTP_USER_AGENT'}\n";
print ML "X-URL: $FORM{'url'}\n" if ($FORM{'url'});
print ML "\n";
#
# FORM からの順番にするにはこちら。
foreach $pair(@pairs) {
($name,$value) = split(/=/,$pair);
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
&jcode'convert(*name,$KCODE);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
&jcode'convert(*value,$KCODE);
$FORM{$name} = $value;
if ($name eq "mailto") {
} elsif ($name eq "cc") {
} elsif ($name eq "bcc") {
} elsif ($name eq "returnto") {
} elsif ($name eq "subject") {
} elsif ($name eq "message0") {
} elsif ($name eq "message1") {
} elsif ($name eq "message2") {
} elsif ($name eq "message3") {
} elsif ($name eq "returnurl") {
} else {
print ML "$name = $FORM{$name}\n";
}
}
#
# ソートするにはこちら
# foreach (sort keys %FORM){
# if ($_ eq "mailto") {
# } elsif ($_ eq "cc") {
# } elsif ($_ eq "bcc") {
# } elsif ($_ eq "returnto") {
# } elsif ($_ eq "subject") {
# } elsif ($_ eq "message0") {
# } elsif ($_ eq "message1") {
# } elsif ($_ eq "message2") {
# } elsif ($_ eq "message3") {
# } elsif ($_ eq "returnurl") {
# } else {
# print ML "$_ = $FORM{$_}\n";
# }
# }
print ML "\n------------------------------------------------------------\n";
# 送られたメールが信頼できるものかどうかを判断する材料として、サーバー環境変数をメールに添付します。
foreach (sort keys %ENV) {
printf ML "%24s = %s\n",$_,$ENV{$_};
}
close(ML);
#
#
# メールを送ったよというメッセージのページを表示させます。
open(OUT, "| $nkf");
print OUT "Content-type: text/html;charset=x-euc-jp\n\n";
print OUT "<TITLE>Request Accepted</TITLE>\n";
print OUT "<center>\n";
print OUT "<H1>$FORM{'message0'}</H1>\n";
print OUT "<HR>\n";
print OUT "$FORM{'message1'}<BR>\n";
print OUT "$FORM{'message2'}<BR>\n";
print OUT "$FORM{'message3'}<BR>\n";
print OUT "<HR><P>\n";
print OUT "</center>\n";
print OUT "以下の内容で送信されました。<br>\n";
print OUT "<PRE>\n";
foreach $pair(@pairs) {
($name,$value) = split(/=/,$pair);
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
&jcode'convert(*name,$KCODE);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
&jcode'convert(*value,$KCODE);
$FORM{$name} = $value;
if ($name eq "mailto") {
} elsif ($name eq "cc") {
} elsif ($name eq "bcc") {
} elsif ($name eq "returnto") {
} elsif ($name eq "subject") {
} elsif ($name eq "message0") {
} elsif ($name eq "message1") {
} elsif ($name eq "message2") {
} elsif ($name eq "message3") {
} elsif ($name eq "returnurl") {
} else {
print OUT "$name = $FORM{$name}\n";
}
}
# foreach (sort keys %FORM){
# if ($_ eq "mailto") {
# } elsif ($_ eq "cc") {
# } elsif ($_ eq "bcc") {
# } elsif ($_ eq "returnto") {
# } elsif ($_ eq "subject") {
# } elsif ($_ eq "message0") {
# } elsif ($_ eq "message1") {
# } elsif ($_ eq "message2") {
# } elsif ($_ eq "message3") {
# } elsif ($_ eq "returnurl") {
# } else {
# print OUT "$_ = $FORM{$_}\n";
# }
# }
print OUT "</PRE>\n";
print OUT "<HR>\n";
print OUT "<A HREF=\"$ReturnPath\">戻る</A><BR>\n";
print OUT "Postmail.cgi: $version\n";
print OUT "<HR>\n";
print OUT "Your Address: $host\n";
close(OUT);
} else {
#
#
# メールを送れなかったよというメッセージのページを表示させます。
open(OUT, "| $nkf");
print OUT "Content-type: text/html;charset=x-euc-jp\n\n";
print OUT "<TITLE>Request Not Accepted</TITLE>\n";
print OUT "<H1>メールは正常に送信されませんでした。</H1>\n";
print OUT "<HR>\n";
print OUT "<A HREF=\"$ReturnPath\">戻る</A><BR>\n";
print OUT "Postmail.cgi: $version\n";
print OUT "<HR>\n";
print OUT "Your Address: $host\n";
close(OUT);
}
exit (0);
#
#
#
sub CheckChar
{
my($str)=@_;
my $result = 1;
for $c(split(//,$str)){
if( $c =~ /[0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\-\_\@\.]/){
} else {
$result=0;
}
}
$result;
}

このページの上へ

カスタマーサポート

会員登録情報変更

契約内容変更

ディスク容量確認

オンラインマニュアル

よくある質問(FAQ)

アクセスポイント

ユーザー会


ご利用にあたって 個人情報取り扱いについて 株式会社インフォウェア Japan-Net ジャパンネット