• ベストアンサー

複数のアドレスを設定できるメールフォーム

上記メールフォームCGIを探しています。 企業内で使用するため各店舗用メールアドレスがあり、それぞれの店舗に直接メールを送れるような仕組みが必要です。 複数アドレスに送信可能なものとして http://www.psl.ne.jp/perl/form_mailer.html を見つけましたが、この方法だと店舗数分のフォームHTMLと設定ファイルが必要なようです。 ファイル数を増やすことはあまりしたくないので、これはちょっと不向きです。 たとえば… 各ページに送信ボタンを配置し、「./*.cgi?tenpo=**」という感じで書き込み、CGIのほうで店舗名とメールアドレスが書かれたリストを照合してそのメールアドレス宛に送る、といった感じのCGIはないでしょうか? 単に直接アドレスを載せればいいだけかもしれませんが、スパムの攻撃を出来るだけ避けたいのでフォームを使用したいと思っています。 また、金銭的余裕もないのでフリーの物を探しています。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.9

さらにミス? 何度もすみませんね。 すでにお気づきでしょうが、サブルーチンにしたら localじゃまずかったですね。 ($id,$ps,$URL,$mail)= split(/,/,$_); としてください。

master-3rd
質問者

お礼

返答遅れてすみません。 他の作業が混んでて修正する暇がなかったです。 とりあえず、CGIは動きました。 後は、言われるとおり2重投稿防止などを実装できるかやってみたいと思います。 ただ、時間がなければ今のまま行くかも… とりあえず、今までお付き合いいただきありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (8)

回答No.8

open(EMAIL,"|$sendmail $mail") || &error("Can\'t sendmail: $!"); でした。

すると、全ての回答が全文表示されます。
回答No.7

整理して書くと下のようになります。分かりやすくするため送信部はサブルーチンです。 foreach (@file) {  local($id,$ps,$URL,$mail)= split(/,/,$_);  chomp($mail);  if ($in{'id'} eq $id) {   &SendTheMail;   exit  }  &error;  exit } 見れば分かると思いますが、必ず &errorが実行されます。 idが一発目で一致したら送信後にエラー、そうでなければエラー出力しておしまいです。 このように送信部分をサブルーチンにしたほうが分かりやすくスッキリします。 ついでにいうとデコード部分、終了メッセージも別サブルーチンにすればもっと見通しがよくなります。 私の好みというところも大いにありますが。 foreach (@file) {  local($id,$ps,$URL,$mail)= split(/,/,$_);  chomp($mail);  if ($in{'id'} eq $id) {   &SendTheMail;   &DispMassage;  } } Sub SendTheMail {   &Decording;   &jcode'convert(*message,'jis');   open(EMAIL,"|$sendmail $mail || &error("Can\'t sendmail: $!");"); : : } Sub Decoring {  $message = <<_MESSAGE_; Subject: $in{'subject'} : : } Sub DispMassage {  print <<_END_; Content-type: text/html <html> : : } open(EMAIL,"|$sendmail $mail || &error("Can\'t sendmail: $!");"); に少し追加されてますが、これは sendmailプロセスがオープンできなかった場合に &errorを実行します。 単純に「die...」とやってもいいと思います。 見やすくするため全角スペースを使ってますので注意してください。 それともう少しいろいろと配慮したスクリプトを採用した方がよいと思います。 例えばメールヘッダの「Content-Type:」指定や、二重送信防止など。

すると、全ての回答が全文表示されます。
回答No.6

>「入力エラー。送信アドレスが正しくありません。」 この「入力」という言葉が気になりますが、「送信アドレス」なんだから問い合わせを して来たのアドレスとこんがらがっているってことはないのでしょうね。 馬鹿なことを確認しました。すみませんです。 細かいことも確認しないと気が済まない質なものですから。

master-3rd
質問者

補足

>「入力エラー。送信アドレスが正しくありません。」 下の全文を読んでいただければわかるかと思いますが、単にコピーしただけなので文章に意味はありません。(どこでストップしているのかを知るため後を少し変えただけ) 出来上がったときには「不正な使用・直接このCGIを指定することはできません。各ページよりメール内容を記入してください。」等に変更しようかと考えています。 では、お忙しいかもしれませんが、よろしくお願いします。

すると、全ての回答が全文表示されます。
回答No.5

大きく勘違いしていたようですみませんです。 てっきり管理部署から、各店舗あてに共通の連絡メールを出すものと早合点してしまいました(自分がそういう要求で作ったもので)。 それで、肝心のメールアドレス判定部がないので何ともいえませんが、気づいた点を二つだけ。 # エラーチェックはメールアドレスだけでしょうか。 # 送信者 -問い合わせをした人- のアドレス形式の正当性チェックや入力項目の # 抜けなどは確認表示部にあるのでしょうか? 本題とは無関係でしょうが、フォームの「Content-type」と「<HTML>」のあいだに改行のみの行が必要です。 > foreach (@file) { > local($id,$ps,$URL,$mail)= split(/,/,$_); > if ($in{'id'} eq $id){ よくあるミスですが、このあと何もしていなければ「$mail」には、改行コードが含まれていると思います。 比較対象には含まれていないのではありませんか? chomp($mail); で改行コードを取り去って確認してみてください。 間違ったアドバイスかもしれませんが、その際はご容赦ください。 ------------------------------------------------ > html→htmlにデータを送ることは出来ないと考え、「index.html」をCGI内部に格納しました。 もちろんそうです、独立したままCGIかしたらより簡単だけどと思っただけです。 規模が小さくて把握できるなら、取り込んで一つのCGIにしても全然かまいません。

master-3rd
質問者

補足

すばやい返答ありがとうございます。 なんとなくですが、丸々載せたほうが早そうですね。この状態で、送信しようとすると、「送信アドレスが正しくない」のエラーが出ます。 多分ですが、ちゃんとリスト分割・チェックが出来てないためエラーになるのではないかと… --------------------------------------------- #!/usr/bin/perl require 'cgi-lib.pl'; require 'jcode.pl'; $sendmail = '/usr/sbin/sendmail'; $admin_name = '社名'; $gdata = "../sellguide/passsave.dat"; &ReadParse; if ($in{'mode'} eq "form"){ &form;} if ($in{'name'} eq ''){ &error('入力エラー','名前が入力されていません');} if ($in{'email'} eq ''){ &error('入力エラー','メールアドレスが入力されていません');} if ($in{'subject'} eq ''){ &error('入力エラー','件名が入力されていません');} if ($in{'text'} eq ''){ &error('入力エラー','メッセージが入力されていません');} unless($in{'email'} =~/^[\w\-+\.]+\@[\w\-+\.]+$/i){ &error('入力エラー','メールアドレスを正しく入力してください');} open (FILE,"$gdata"); @file = <FILE>; close FILE; foreach (@file) { local($id,$ps,$URL,$mail)= split(/,/,$_); chomp($mail); if ($in{'id'} eq $id){ $message = <<_MESSAGE_; Subject: $in{'subject'} From: $in{'email'} To: $mail Name $in{'name'} Address $in{'email'} Url $in{'url'} Message $in{'text'} _MESSAGE_ &jcode'convert(*message,'jis'); open(EMAIL,"|$sendmail $mail"); print EMAIL $message; close(EMAIL); print <<_END_; Content-type: text/html <html> <head> <title>送信完了</title> </head> <body> <table border=0 align=center> <tr><td align=center>送信完了</td></tr> <tr><td>御意見・御感想ありがとうございました。<br> 皆さんの御意見などを反映させて、運営していきたいと思います。<p> 送信内容をご確認ください。<p align=right>$admin_name</p></td></tr> </table><p> <table border=1 align=center> <tr><td align=center>お名前</td><td>$in{'name'}</td></tr> <tr><td align=center>メールアドレス</td><td>$in{'email'}</td></tr> <tr><td align=center>件 名</td><td>$in{'subject'}</td></tr> <tr><td align=center>ホームページ</td><td>$in{'url'}</td></tr> <tr><td align=center>メッセージ</td><td width=400>$in{'text'}</td></tr> </td></tr> </table> </body> </html> _END_ exit; }&error('入力エラー','送信アドレスが正しくありません。'); exit; } sub error { print <<_ERROR_; Content-type: text/html <html><head><title>送信エラー</title></head><body> <p align=center><font size=5 color=#ff0000>送信エラー</font></p> 以下のエラーが原因でメールを送信できませんでした。<p><font color=#ff0000> $_[0]</font><br>$_[1]<p>$admin_name</body></html> _ERROR_ exit; } sub form { print <<_html_; Content-type: text/html <HTML> <HEAD> <TITLE>メールフォーム</TITLE> </HEAD> <BODY> <P align="center"><FONT size="5">メールフォーム</FONT></P> <FORM method="POST" action="mail.cgi"> <INPUT type="hidden" name="id" value="$in{'id'}"> <CENTER> ----------$in{'id'}へのメール送信----------<BR><BR> <TABLE border="0" align="center"> <TBODY> <TR> <TD align="center">お名前</TD> <TD><INPUT type="text" name="name" size="40"></TD> </TR> <TR> <TD align="center">メールアドレス</TD> <TD><INPUT type="text" name="email" size="40"></TD> </TR> <TR> <TD align="center">件 名</TD> <TD><INPUT type="text" name="subject" size="40"></TD> </TR> <TR> <TD align="center">メッセージ</TD> <TD><TEXTAREA name="text" cols="50" rows="8" wrap="hard"></TEXTAREA></TD> </TR> <TR> <TD></TD> <TD><INPUT type="submit" value=" 送 信 ">&nbsp;&nbsp;<INPUT type="reset" value=" 取 消 "></TD> </TR> </TBODY> </TABLE> </CENTER> </FORM> </BODY> </HTML> _html_ exit; }

すると、全ての回答が全文表示されます。
回答No.4

訂正します。 >要するに「フォームもリストを読み込んで作成し、送信用 >CGIの呼び出し元をフォームにすれば」ということです。 ↓ 「送信先一覧をリストを読み込んで作成し、送信用フォームに渡してやれば、、、」です。 print "<INPUT type=\"submit\" value=\"送信\">\n"; ↓ print "<INPUT type=\"submit\" value=\"送信フォーム\">\n";

master-3rd
質問者

補足

改造を試みたのは http://kan.hmc6.net/cgilib/ のkan MAILFORMです。 まずは、下にも書きましたが、htmlをサブルーチンとして入れ込みます。そのまま取り込むためヒアドキュメントにしました。 //////// sub form { print <<_html_; Content-type: text/html <HTML>~~ ----------$in{'id'}へのメール送信---------- _html_ exit; } ////////////// 次に、ボタン→フォーム、とフォーム→送信作業を分けるためif文で振り分けます。 ////////////// &ReadParse;のすぐ下に if ($in{'mode'} eq "form"){ &form;} を書き込み、各ページのボタンに <INPUT type="hidden" name="mode" value="form"> <INPUT type="hidden" name="id" value="○○店"> を埋め込みます。 ////////////// この状態では正常動作します。 フォームページにIDをちゃんと表示します。 もちろんですが、メールアドレスはまだ単一のものです。 ここからが問題です。まずは、店舗名とメールアドレスのリストですが、他のCGIでも利用しているリストがあるのでそれをまるまる利用しようと考えました。 リストは、ID(店舗名)・他のCGIで使用中のPASS・他のファイルで使用中のURL・このCGIで利用を考えているメールアドレスの組み合わせです。 リストのほうに不備はないと思われます。他のCGIでは正常に動作しているからです。 ///////////// # パスワードファイル読み込み $gdata = "../sellguide/passsave.dat"; ///////////// $mailを使用するため$admin_mailを$mailに変更 ///////////// ###送信内容を設定 部分の「To」を書き換え ###メールの送信作業 部分の「open」を書き換え さらにパスワードファイルを読み込み分割します。 ///////////// open (FILE,"$gdata"); @file = <FILE>; close FILE; foreach (@file) { local($id,$ps,$URL,$mail)= split(/,/,$_); if ($in{'id'} eq $id){ ///////////// これをどこに組み込んでいいのやら… とりあえずエラーチェックの次に組み込み、exitしている送信結果表示の後に ////////////// }&error('入力エラー','送信アドレスが正しくありません。'); exit; } ////////////// を入れました。 さらにフォーム部分にIDを渡すための <INPUT type="hidden" name="id" value="$in{'id'}"> も入れました。 構文チェックソフトを使用して確認しても構文自体にはエラーは無いと出ます。 しかし、 「入力エラー。送信アドレスが正しくありません。」 が出てしまいます。 何かが基本的に間違っているとは思うのですが、それがわかりません。自分でも試行錯誤しているのですが、私の知識ではこれが精一杯です。 何を修正したらいいのでしょうか? もし足りない情報があればすぐ書き込みします。 よろしくお願いします。

すると、全ての回答が全文表示されます。
回答No.3

いまさらですが、送信する内容は店舗ごとに違う内容なんでしょうか? もしそうなら、私が書いたことはてんでピント外れですね。 ところで、送信FORM用のHTMLが別だと何か不都合でもあるのですか? もちろんcgiにしないといけませんが、別のままの方が極わずかな修正ですみます。 要するに「フォームもリストを読み込んで作成し、送信用CGIの呼び出し元をフォームにすれば」ということです。 ↓ポイントだけ書くとこんな感じでしょうか? #/usr/bin/perl print << EOD1; Content-type: text/html <HTML> # ここが元々のHTMLの開始点 <HEAD> : : EOD1 &Read_List; # 送信先リスト読み込み foreach (@file) { : : print "<form action="\mail_send.cgi\" method=\"post\">\n"; print "<INPUT type=\"hidden\" name=\"id\" value=\"$id\">\n"; print "<INPUT type=\"submit\" value=\"送信\">\n"; print "</form>\n"; : : } print << EOD2; : : </BODY> </HTML> EOD2 リストを読み込む部分はの共通の設定用スクリプトにでも追加してやればOKでしょう。 全然動かずだけでは分かりません。 どんな症状なのか、エラーログには何も残っていないのか。コンソールでコマンドを実行したらどうなのか等々。 漢字コードの問題で表示されないだけということもあり得ます。

master-3rd
質問者

お礼

返答ありがとうございます。 >送信する内容は店舗ごとに違う内容なんでしょうか? その通りです。 お客様が各店舗に対して直接メールを出すシステムが必要です。 ホームページには各店舗のページがあり、「この店舗にメールを送る」というボタンをクリックすることで、その店舗に直接メールが届くようにしたいと考えています(簡単に言うと、古本屋チェーン店でおたくの店舗にこの本ありますか?が聞けるCGIといえばいいでしょうか?)。 よって、CGIも入力フォームも1つでかまわないのですが、ページタイトル(○○店へのメール、と表示)・送信先メールアドレスだけが押すボタンによって変化するというものが必要です。 >送信FORM用のHTMLが別だと何か不都合 単に私の知識が足りないだけかと思いますが… 改造しようとしたCGIは「index.html」とCGIで成り立っています。 まず、フォームである「index.html」にデータを書き込みそこからCGIへデータを送るというタイプです。 上でも述べましたが、その1つ前のページから"どこへ"というデータを送る必要がありますよね。 html→htmlにデータを送ることは出来ないと考え、「index.html」をCGI内部に格納しました。 >全然動かずだけでは分かりません。 確かに言われるとおりです。ただ、ここまで回答していただけるとは思っていなかったため詳細は省きました。 長文になりそうなので、続きは上の回答にResします。

すると、全ての回答が全文表示されます。
回答No.2

あんまり見たことないですね。出来合いのものを改造したらどうですか。 私がやった方法は、送信先編集用のCGIでアドレス帳(テキストデータ)を作り、 送信用のCGIはアドレス帳に従って送信するというものです。 下のようなデータで、フォームで内容区分を選択して○の所だけに送信するようになってます。        送信先 メールアドレス  内容区分1  2  3 -----------------------------------------------  A  aaa@****.***.jp    ○  ×  ○  B  bbb@****.**.jp     ○  ○  ×  C  cccc@***.****.jp    ×  ○  ×  :  : あとはそうですね、フォームで入力した送信データに ----------------------------- From: xxx@xxx.xxxx.xxx To: [Send_To] [送信先] 様 自動送信メールの断り書き ------------------------------ こんな形でメールヘッダと本文を追加して[Send_To]と [送信先]を実際のものに変換するようにしております。 それでは頑張ってください。

master-3rd
質問者

お礼

返答ありがとうございます。 自分でやってみて挫折してしまったのですでにあるものを探してしまいました。 とりあえず簡単なメールフォームCGIをダウンロードして、改造を試みてみました。 まず、フォームHTMLがCGIと別物だったのでフォームHTMLをサブルーチン<sub form{~~}>として取り込みました。 さらに、各ページ用送信ボタンをformで作成、 <INPUT type="hidden" name="mode" value="form"> <INPUT type="hidden" name="id" value="店舗名"> を入れ、CGIには if ($in{'mode'} eq "form"){ &form;} で、各ページボタン→CGIは「formを経由」、CGI内フォーム→CGI送信はそのまま実行するというようにしました。 さらに、リストのIDとメールアドレスをあわせるため open (FILE,"$passdata"); @file = <FILE>; close FILE; foreach (@file) { local($id,$ps,$URL,$mail)= split(/,/,$_); if ($in{'id'} eq $id){ ~~ というように作ってみましたが、何が悪いのか全然動かずあきらめてしまいました。 構文が悪いわけではなく(構文チェッカーではエラーはないと出る。)やっていることが間違っていると思うのですが、所詮素人な私には解決策を見つけることが出来ませんでした。 とりあえず、書いてみたのですが、解決策があるでしょうか? もっと詳しく書く必要があるようでしたら元CGIや変更部分を書き込みします。 よろしくお願いします。

すると、全ての回答が全文表示されます。
noname#222916
noname#222916
回答No.1

参考URLの Yomi-Mailer などはいかがでしょうか。 こいつはCGIで複数のフォームを設定出来るので、各アドレスごとにフォーム用のhtmlを作ったりしなくてもいいです。 CGI1つで複数のフォームを作れるので、各店舗ごとにアカウントを作って、メアド等の設定をしさえすれば、ご希望のような感じでタグを書けば良いだけです。 私も会社のHPを作るとき色々探していて、これに辿り着きました。

参考URL:
http://yomi.pekori.to/
master-3rd
質問者

お礼

返答ありがとうございます。 確かにこれなら私望んだことが簡単に出来ますね。 ただ、いろいろと設定をしてみたのですが、機能が多すぎてカスタマイズしにくいというちょっと不利な点が出てきました。 もうちょっとスマートなものがあればそちらに乗り換えたい気分ですが、現状はこれで我慢するしかなさそうですね。

すると、全ての回答が全文表示されます。

関連するQ&A