シンプル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にアクセスして、普通に入力してみましょう。うまくいけば御の字なのですが、まぁ大抵エラーが出ます。エラー状況によっても異なるのですが、とりあえず以下のことを確認してみましょう。
- perlのパスは正しいですか?
- ファイルのパーミッションは正しいですか?
- CGIへのパス(入力用HTMLの中に設定されています)は正しいですか?
- メソッドにちゃんとPOSTを指定していますか?
- 御礼Page、エラーPageはちゃんとアクセスできますか?
どーしてもわからなければ、原則有料になりますが、サポートも致します。でも、こんなプログラム相手にサポート料を払うのも悲しいので、時間根性その他が許すのであれば、がんばって自分で悩んでみましょう。
仮運用
テストでちゃんと自分宛てにメールが届いたら、とりあえず仮運用してみましょう。
数十通ほど受け取って問題が出なければよし。問題が出たら、考えましょう。
サポートはしないと明記しましたが、バグレポートは歓迎致します。飽く迄「時間が許せば」の範疇ではありますが、もしかしたら、バグ修正をするかもしれません。
淡い、淡い期待を胸に、よろしければご連絡下さい。
なお、バグレポートには、少なくとも「バグの詳細な情報」「どんなデータを入力しているか」「どんなエラーになったか」「サーバの情報」などを記載してください。多分、折り返し「では**を調べてみてください」みたいな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