シンプルMail送信CGI

きわめて単純な、FormMail用のCGIです。注意事項をよく読んでからご利用下さい。
このプログラムは「とりあえずフォームメールってのを使ってみたい」「今作ってるんだけど、一時的にでいいから、すぐに設置したいものがある」などのシチュエーションで考えております。ので、プログラムを含め、きわめて簡素に出来ております。

目次

注意事項
使い方
運用方法
最後に
プログラム本体

注意事項

本プログラムは無料でお使いいただけます
特に料金を徴収することなどはありませんので、ご自由に、各自の責任の範囲内においてご利用下さい。なお、本製品を使用した、或いは使用しないことにおけるあらゆる責任は、弊社では負いかねますのでご了承下さい。

改変はご自由にどうぞ
基本的にうちで面倒を見るつもりはまったくないのですが、自分でどうにかできるようであれば、自由にプログラムを作り変えてください。多分、いい勉強になります。
ちなみに、プログラムに手を入れるのであれば、まずは「インデントをそろえて」「改行を入れなおして」「コメントを入れて」からにしたほうが、いろいろな意味で楽が出来ます。

細かい使い勝手は期待しないで下さい
基本的に「とりあえず」使いたい人用のものになります。ので「入力のチェックをしたい」とか、そういう使い勝手は期待しないで下さい。

使用できるサーバに限定があります
一言で片付けると「sendmailないしsendmailコマンドを持つSMTPサーバ(メール送信サーバ)があるところ、となります。UNIX系のサーバなら確実に大丈夫だと思うのですが、Windows系のサーバでどうなるかはわかりません(sendmailがインストールされていたとしても)。
SMTPを直接しゃべるようなコードは、このプログラムには期待しないで下さい。

こまかいセキュリティーホールは色々あります
詳しく書くつもりは毛頭ないのですが。厳密には、色々とバグだのセキュリティーホールだのが放置されています(もっとも、この発言のレベルで考えると、巷のCGIの大半には同様にセキュリティーホールが潜まれていることになるのですが)。手がかりのために、一つだけ書いてみましょう。CONTENT_LENGTHが、常に標準入力と等しい文字数を還してくるとは限りません。が、その辺には対応していません(世間のCGIのどの程度が対応しているか、という問題はさておき)。

使い方

ご用意いただくもの:料理番組的には"材料紹介"

受信用のメールアドレス
入力したデータを受け取るための、メールアドレスをご用意下さい。とりあえず、これがないとなにも始まりません。

入力用のHTML
ユーザが入力するためのPageが必要になります。とりあえず簡単に必要事項を。
メソッドはPOSTを指定してください。GETないし無指定の場合、きちんと動きません。
INPUTタグのname属性は、わかりやすい名前にしておいたほうが後々楽です。
で、上記の説明で作り方がわからない場合、Webとか本とかで各自お調べ下さい。

御礼Page
入力が終わって送信した後に出る画面が必要です。とりあえずどこかに「ありがとうございました」くらい書いておくとよいと思います。

エラーPage
もちろん何らかのエラーが起きることはありえます。そんなときのためのPageです。「エラーが起きました」「ブラウザの戻るボタンで戻ってください」「何回もエラーが出るときは管理者にメールしてください」などの文言があると親切ですね。

jcode.plのプログラム
んと。現在はネットのあちこちに転がっていますので、適当にダウンロードしてください。検索エンジンで「jocde.pl」とかやると、他のサイトで親切な「入手方法」が見つかるかと思います。ので、ここでは省略します。

本プログラム
まぁ、とりあえず「メインの食材」ですし。

プログラムの修正:作り方

修正をかける必要があるのは5箇所。

perlへのパス

先頭行はperlへのパスです。いまどき、Perlがインストールされていないサーバはないと思いますので、とりあえず「Perlへのパス」を、管理者にでもご確認下さい。
なお、perlの後ろについている-wは取り除いても問題ありません。が、あったほうが、特に自分で改造したときなど、デバッグしやすいときがあります。

sendmailへのパス

$SendMail='sendmailへのパス';
ここには、「sendmail」という、メール送信用のプログラムの場所を入れてください。
わかんない場合、サーバ管理者とかISPさんとかに「sendmailのパスどこですか?」とか聴くと、多分教えてくれます。なお、こーゆー仕様なので「Windows系サーバ」では動かないかと思いますのでご了承を。

メールの送り先

$To='メールアドレス';
ここには、データを受け取るメールアドレスを入れてください。なお、注意点を一つ。メールアドレスは、必ずシングルクォーテーションで囲んでください。ダブルクォーテーションだとエラーになります。

御礼Page

$FinUrl='http://から始まる御礼PageへのURL';
御礼PageへのURLです。不精せず、きちんとHTTPから書いてくださいね。

$ErrorUrl='http://から始まるエラーPageへのURL';
エラーが出てきた時用のURLです。やっぱり、HTTPから書いてください。

運用方法

さて。では実際に運用してみましょう。

準備

まずは準備です。入力、御礼、エラーの各HTMLはとっととUpしておきましょう。
プログラムは、必要な場所(サーバによって異なるので管理者にでもご確認下さいませ)にUpします。んで、jcode.plはファイルパーミッションを444ないし440、400に。プログラム本体は555、550、500のいずれかに(755とかにする意味はありませんので念のため。別にやってもいいのですが、私は勧めません)。

テスト

早速テストしてみましょう。
もし。もしあなたがtelnetを使える環境であるのなら。ぜひ、まずは「シェルでCGIを叩」いてみましょう。環境変数にCONTENT_LENGTHをセットして(文字数間違えないようにね)、実際の入力データは別のファイルにしておきます。そうすれば、簡単にテストが出来ます。
この、telnet方式ですと、色々とわかることも多いので、こーゆーことが出来る環境の人はぜひ試してみましょう。perlのパスの直後に-wを付けてるのも、こんな状況で役に立ちます(ワーニングやらエラーやらがいっぱい出るんだ、これが)。
で。
telnetが使えない場合、自分で、入力Webにアクセスして、普通に入力してみましょう。うまくいけば御の字なのですが、まぁ大抵エラーが出ます。エラー状況によっても異なるのですが、とりあえず以下のことを確認してみましょう。
どーしてもわからなければ、原則有料になりますが、サポートも致します。でも、こんなプログラム相手にサポート料を払うのも悲しいので、時間根性その他が許すのであれば、がんばって自分で悩んでみましょう。

仮運用

テストでちゃんと自分宛てにメールが届いたら、とりあえず仮運用してみましょう。
数十通ほど受け取って問題が出なければよし。問題が出たら、考えましょう。
サポートはしないと明記しましたが、バグレポートは歓迎致します。飽く迄「時間が許せば」の範疇ではありますが、もしかしたら、バグ修正をするかもしれません。
淡い、淡い期待を胸に、よろしければご連絡下さい。
なお、バグレポートには、少なくとも「バグの詳細な情報」「どんなデータを入力しているか」「どんなエラーになったか」「サーバの情報」などを記載してください。多分、折り返し「では**を調べてみてください」みたいなMailが届くのではないかと思います。でも、あんまり期待はしないで下さいね。

本番

特に問題が出なければ、そのまま本番運用に移りましょう。

その後

先に明言しておきます。ここから先は営業です(笑
運用してくれば、色々と要求も出てくるでしょう。曰く「データのチェックをしたい」「**の項目は絶対に入力しないとメールが送られてこないようにして欲しい」「データの集計をしたい」「お客さんにも確認Mailを出してあげたい」「入力後「このデータでよろしいですか?」みたいな確認画面を出したい」などなど。
さらに「複数のFormMailを扱う予定がある」場合。いちいち一個づつプログラム組んでると、管理が大変になります。断言してもよいですが。
こーゆー時は、自力で作るか、ないしは私どもまでぜひご相談下さい。見積もりなど、無料で承りますので。

最後に

このプログラムが、CGI運用のちょっとしたきっかけや、或いは皆様のお仕事の効率化への一助になれば幸いです。

index Pageに戻る 

プログラム本体

プログラム本体です。切りとってご利用下さい。ファイル名はご自由に。

#!/usr/bin/perl -w
# 
# シンプルフォームメール Vol 0.1
# make by Michiaki furusho(furu@m-fr.net)
#
# このCGIは、とってもシンプルなフォームメールを実現させます。
# 必要なものはほんの少しだけになりますので、お気軽にご設置ください。
# 
# 変更履歴
# 2002/04/17	とりあえず新規作成
# 

#-------------------------------------------------
#--- 以下、どーしても設定してもらわないと困る部分
#-------------------------------------------------

# sendmailの場所。わからなければ、これだけはプロパイダさんとかに聞いてください
$SendMail='/usr/sbin/sendmail';

# メールの送り先。あなたのメールアドレスを入れてください。
$To='furu@m-fr.net';

# メールの出力に成功したときのお礼のメッセージのURL
# httpから書き出してください(httpsでも大丈夫ですが)
$FinUrl='http://www.foo.com/sccess.html';

# なんかエラーになっちゃったときのエラー表示のURL
# httpから書き出してください(httpsでも大丈夫ですが)
$ErrorUrl='http://www.foo.com/error.html';

#-------------------------------------------------
#--- 以上で設定終わり。後は気にせずに。
#-------------------------------------------------

$From = 'furu@m-fr.net';
$Subject = 'Simple Form Mail Vol 0.1';
$Copylighte = 'Simple Form Mail by Michiaki Furusho(furu@m-fr.net)';

require 'jcode.pl';
#-----------------
sub errorPut{ print "Location:$ErrorUrl\n\n"; }
sub Decode{ local(*DecData) = @_; $DecData =~ s/\+/ /g; $DecData =~ s/%(..)/pack("c",hex($1))/ge; }
#-----------------

my ($Data); my (@CutData); my($Length);
$Length = $ENV{"CONTENT_LENGTH"}; $Length += 0;
if ($Length <= 0) { errorPut(); exit(1); }
if ($Length > 10000) { errorPut(); exit(1); }
read(STDIN,$Data,$Length); @CutData = split ('&' , $Data);

my($retString); my($work); local($name, $value);
$retString = "From: $From\n" . "To: $To\n" . "Subject: $Subject\n";
$retString .= "\n";
foreach $work (@CutData){
($name,$value) = split("=",$work);
Decode(*name); $retString .= "[$name]\n";
Decode(*value); $value = jcode::euc($value); $retString .= "$value\n\n";
} $retString .= $Copylighte;

if (open(SENDMAIL_FP, "| $SendMail -i -t")) {
print SENDMAIL_FP jcode::jis($retString); print "Location: $FinUrl\n\n";
} else { print "Location: $ErrorUrl\n\n"; }
exit(0);



戻る 
Copyright 2002 M-Fr Net All Right Reserved
E-Mail:info@m-fr.net