• ベストアンサー

「フォームメールの値の引渡しの失敗の回避」について

cgiで (A)注文画面 → (B)確認画面 → (C)終了画面 というのを作っています。 (A)で商品の内容、氏名、届け先、メールアドレス などの入力 ↓ perlプログラム 1.pl で ↓ 入力内容のチェック・確認画面への値の受け渡し (B)で入力した商品、氏名、届け先、メールアドレスの表示・確認 ↓ perlプログラム 2.pl で ↓ 送信者が入力されたメールアドレスのメールをsendmailで送信 (C)終了画面(注文のお礼の表示) この流れでメールで注文を受けているのですが (B)から(C)へ値を受け渡す時に失敗しているようで、ごく稀にエラーメールが届きます。 サーバの管理会社へ問い合わせるとsendmailの使用時にFROMがないメールだとそのエラーメールが届きますとの事。 殆どの場合うまくいくのですが、 100件に1件程度でしょうか、エラーメールが届きます。 この値の引渡しの失敗を減らす、又はなくすような対策をご存知ではないでしょうか? 文字数の制限の為、perlプログラムの内容は載せられませんでしたが 必要でしたら補足を頂いた時に載せますので そのときに補足要求をお願いします。 宜しくお願いします。

  • Perl
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • wolfwood
  • ベストアンサー率50% (199/398)
回答No.3

受取りの処理自体は問題は無いようです。 #2の方の回答のようにメールアドレスの@の扱いは気を付けてください。 恐らく、チェックの段階で解決していると思いますが・・・。 jcode.plの問題となると文字コードの問題となるので全体とデータのコードの違いに気を付けていれば大丈夫です。 ただ、(B)の受取りで &jcode'convert(*name, "jis"); となっているのはどうしてですか? ファイル全体はEUCで記述して送信直前にデータをJISに変換しておけば良いと思います。 http://www.presso.jp/text/perl/mail.html やはり、エラーが起こる状況の情報が少ないので原因の特定は難しいですね。 あとはエラー時にログを取って引き渡されなかったデータなどを取得して 同じ現象が起こるか検証して見なければならないでしょう。 あまり、お役に立てなくて申し訳ありません。

eim-yuuma
質問者

お礼

再び回答ありがとうございます。 >&jcode'convert(*name, "jis"); となっているのはどうしてですか? ・・・本当ですね・・(汗)これが原因だったかもしれません。 (B)から(C)に引渡しすとき(B)に作成したhiddenの項目名を使って メールのFROM欄を作成していました。    (C)内メールヘッダ作成部分     $from = $FORM{'e_mail'};      ・      ・     $mailmain .= "From: $from \n"; jisと変換していたのは↑でいう'e-mail'の部分です。 もしここで、変換がうまくいかなかったとなると引渡しに失敗してもおかしくないですよね。。。? とりあえず、"euc"に変更してその後の動きを監視してみます。 >あまり、お役に立てなくて申し訳ありません。 いえいえ!こちらこそお時間を割いて回答いただきましてありがとうございます。 またどこかでコミュニケーションできることを。ありがとうございました。(^-^)

その他の回答 (2)

  • mahou
  • ベストアンサー率0% (0/1)
回答No.2

自分もその問題で困ったことがありました。 原因を突き止めて見ると、「入力したメールアドレスが変な形」の場合にエラーが返ってきてました。例えば、アドレスに@マークが入っていないとサーバーがエラーを返すんです。 これはサーバーの設定でそうなっているのでしょうが、レンタルサーバーな為、回避の使用が無かったです。javascriptで@マークを必須にすると制御するとかなりエラーは減りました。 検討違いかもしれませんが、参考になれば。

eim-yuuma
質問者

お礼

回答有難うございます。 メールアドレスのチェックは結構厳しく(?)していると思います。  メールアドレスのチェック↓   $FORM{'e_mail'} =~ /^[-_\.a-zA-Z0-9]+\@[-_\.a-zA-Z0-9]+$/ (A)から(B)への値の引渡しは上手くいっていると思うのですが (確認はできませんが・・) (C)の時点でメールアドレスが入るべきところに、何も入ってないためのエラーのようです。 ありがとうございました。m(_ _)m

  • wolfwood
  • ベストアンサー率50% (199/398)
回答No.1

>サーバの管理会社へ問い合わせるとsendmailの使用時にFROMがないメールだとそのエラーメールが届きますとの事。 FROMに入るのは入力したメールアドレスですよね。 入力チェックは前の処理で行っているようなので未入力ということはないですね。 それが正確に渡らないと言うのはそのスクリプトかWebサーバ側のバグではないのでしょうか。 100件に1件だとちょっと頻度が高めですので、そのスクリプト自体の見直しが必要です。 引渡し、受取りの方法はどのようなものでしょうか? 緊急回避的な方法ですと送信処理の直前でFROMの値をチェックしてエラーとして送信自体をやり直してもらうという方法があります。

eim-yuuma
質問者

補足

回答ありがとうございます。 >FROMに入るのは入力したメールアドレスですよね。 はい、(A)で入力して引き継いできたメールアドレスです。 >引渡し、受取りの方法はどのようなものでしょうか? (A)から(B)へ (B)のデータの受取 if ($ENV{'REQUEST_METHOD'} eq "POST") {   read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});   @a = split(/&/, $query_string);   foreach $x (@a) {      ($name, $value) = split(/=/, $x);      $name =~ tr/+/ /;      $name =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;      &jcode'convert(*name, "jis");      $value =~ tr/+/ /;      $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;      $value =~ s/[\r\n]+/\n/g;      &jcode'convert(*value, "euc");      $FORM{$name} = $value;   } } で(B)のhtmlに hidden で項目をもち (B)から(C)へ (C)のデータの受取 if ($ENV{'REQUEST_METHOD'} eq "POST") {    read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});    @a = split(/&/, $query_string);    foreach $x (@a) {      ($name, $value) = split(/=/, $x);      $name =~ tr/+/ /;      $name =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;      &jcode'convert(*name, "euc");      $value =~ tr/+/ /;      $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;      $value =~ s/[\r\n]+/\n/g;      &jcode'convert(*value, "euc");      $FORM{$name} = $value;    } } となっています。 (こんな書き方でいいでしょうか?わかりにくかったら補足要求おねがいします(^_^;) ) >緊急回避的な方法ですと送信処理の直前でFROMの値をチェックしてエラーとして送信自体をやり直してもらうという方法があります。 この方法も検討してみます。 ちょっとjcodeの変換を疑っているのですが、 もし、お手数でなければjcodeの変換についてもみてみていただけませんでしょうか? (お時間がないなど不都合がありましたら無視して下さい(^_^;))

関連するQ&A

  • Perl メールフォーム複数のアドレスに。

    メールを複数のアドレスに配置したいのですがPGをどう変更すれば よろしいでしょうか? 参考ソース #!/usr/bin/perl # フォームメール #jcode.plの場所を設定 require "./jcode.pl"; # sendmailの場所を設定 $sendmail = '/usr/lib/sendmail'; # サンプルのタイトル $mail_title = "メール送信サンプル"; # ページの背景色 $bgcolor = "#FFFFFF"; # ページの文字色 $text = "#000000"; # 戻り先のURL $back_url = '***@aaa.co.jp'; # CGIプログラムの設置場所 $cgi_url = "./mail.cgi"; # 受信メールアドレス(送信先) $mailto = '***@aaa.jp';

    • ベストアンサー
    • Perl
  • sendmailを利用したメールフォームの作成

    swfファイルから送信できるメールフォームを作成したいと考えています。 それで、とりあえず、perlのsendmailを利用しようと思い立ちました。 自分には、sendmailを使用した経験がないので、とりあえずサーバに お試しスクリプトをアップして動作を確認することにしたのですが、うまく反映されません。 お試しスクリプトは以下のようなものです。 #!/usr/local/bin/perl print "content-type: text/html\n\n"; if(open (SENDMAIL,"|usr/local/sbin/sindmail-t")){   $A="a@b.co.jp";   $B="c@d.ne.jp";   print SENDMAIL <<"EOM";   From:$A   TO:$B   test   EOM   close(SENDMAIL); }else {   print "open_error"; } _end_ このスクリプトのFromとToの部分を除くと、一応呼び出した時にただしく出力されます。 自分の考えでは、こんなスクリプトでも、呼び出しときに宛先のアドレ スにメールが送信されると思っていたのですが、何か考え違いをしてるのでしょうか? とりあえず、日本語文字変換やデータの受け取りなどは、後でjcode.pl やcgi-lib.plを使用してなんとか付け焼刃でやってみようと思ってます。 よろしく、おねがいします。

    • ベストアンサー
    • Perl
  • Jcode CP932 のエラーを回避したい。

    プログラム初心者です。 form Mailを設置し、フォーム入力→確認画面までは動くのですが、 最後に、送信ボタンを押すと、500エラーになります。 お手上げです。詳しい方お教えください。 サーバーのエラーログをみたところ、 Can't locate object method "CP932" via package "Jcode" at form_mail.cgi となっていました。 ━━ #!/usr/bin/perl require 'jcode.pl'; $sendmail = '/usr/sbin/sendmail'; use Jcode; ━━ エラーと思われる箇所 sub jis { $msg = $_[0]; # Jcode::convert(*msg,'jis'); $msg = Jcode->new($msg, "UTF8")->CP932; &jcode'convert(*msg,'jis'); } ━━

  • フォームメールつくりましたけど、、。>_<

    下記のページで、フォームメールダウンロード つくったのですが、 [public_html] └[cgi-bin] ├[tmp] ├formmail.cgi ├jcode.pl └perl-lib.pl あげてフォームを入れて送ったのですが、 エラーになります。Internal Server Errorじゃなくて 「E-Mailを記入してください」下にもどるボタンが でます。ってことはパーミッションはあってるとおもうのですが 空白全部記入していて、メールもちゃんとしたアドレス 入れたのにエラーがでる原因は何が考えられますか? ダウンロードしたのは下記です。 http://www.tryhp.net/formmail.htm

    • ベストアンサー
    • CGI
  • フォームメールでsendmailの使えない場合の代替え

    これからCGIでフォームメールを作成しようとしていますが、アップしようと思っているサーバがsendmailが使えないそうです。 やりたいことは、応募フォームにて氏名、住所などを入力してもらい、送信ボタンを押した後、確認画面を表示させ内容確認、OKボタンでこちらにメール送信されるということをやりたいのですが。 sendmailが使えない場合、どのようにしたらいいのでしょうか。他に方法があるようですが、どなたか教えて下さい。

    • ベストアンサー
    • CGI
  • フォームメールスクリプト

    既に、ISPの方にフォームメールページを有料で作成して頂いています。 入力項目チェック及び確認機能つきの高度な内容であり、ホスト側のCGIフォルダには、次の主要なファイルが、あります。 (1)Formmail.pl Matt Wrigh氏のスクリプトです。(http://www.scriptarchive.com/formmail.htmlご参照) 書き換えされているのは、冒頭の 1.# Send E-Mail &send_mail; 2.# Return HTML Page or Redirect User &return_html; の部分のみです。 (2)sendmail.asp(以下のような内容で、一切書き換えられた部分は、ありません。) <% dim mailFrom '送信元アドレス dim mailTo '送信先アドレス dim mailCc '送信先Cc dim mailBcc '送信先Bcc dim mailSubject 'メール件名 dim mailBody 'メール本文 (略) (3)cgi-lib_pl.txt(書き換えられた箇所はないと思われます。どのような機能を有するのかさえわかりません。) # Perl Routines to Manipulate CGI input # cgi-lib@pobox.com # $Id: cgi-lib.pl,v 2.17 1998/05/14 22:39:23 brenner Exp $ (4)xxx.asp(xxxが、既にフォームメール設置のウェブページです。) <!--#include file="sendmail.asp"--> <!--#include file="function.asp"--> <% '#################################################### '# システム用変数 '#################################################### dim PostState (略) 今回、自分で別のフォームメールページ(別のメールアドレスで)を作成しようとしましたが、うまくいきません。 ISPの方に聞こうかとも思いましたが、当然ですが、あまり教えてはくれないと考え、ここに投稿しました。 上記のように既にフォームメールページ設置に必要なファイルは、あるので、簡単にできるように思えるのですが?。 どのようにすれば、いいのか御教授下さい。なお、当方、perl,ASPの知識は、ありません。

  • メールフォームを作成したい

    お世話になります。 今、とあるイントラネット上で、問い合わせフォームを作成し、メールで内容を送信するページを作成して欲しい、といわれました。 早速フリーのCGIを編集しなおしてテストしてみたのですが、肝心なことにsendmailがないことに気づきました。 ただ、ユーザーが使用するメーラーはoutlookとは限らず、<form>の中で"mailto:..."を宣言するだけではダメなのです。 サーバはOSwin2000、SSIです。perlは以前から必要だったのでインストール済み、後はおそらくsendmailの処理だけなのですが、sendmailをイントラネットサーバに入れることは簡単なのでしょうか。入れるとしたら考慮する点はどんな事でしょうか。もしくは、sendmailを使用しない方法等ご存知の方、教えてください。 現在の仕様はいわゆる一般的なメール送信フォーム、htmlとplで動かすものです。 どうぞよろしくお願いします。 説明が上手く出来なかったので補足が必要であればご指摘お願いいたします。

    • ベストアンサー
    • CGI
  • フォームメールプログラムの改造について教えて下さい

    フリーのcgiのを使って改造をしております。 2つのCGIの機能を1つにしたいのです。 フォームに入力されたデータをCSVのデータファイルに保存する機能に、sendmailを使って入力された情報を入力者本人に確認メールを送りたいのですが、ふつうに2つのプログラムを貼り合わせただけではうまくいきません エラーは出ないのですがメールは届きません・・・ どなたか,ソースを見ていただける方いませんでしょうか? 宜しくお願いします。

    • 締切済み
    • CGI
  • 【CGI】メールフォームが動作しない

    http://apps.cside.com/ こちらの「基礎メール2nd」というものをさくらサーバーで運用しようと考えています。 下記の階層にし、パーミッションも括弧の様に設定しました。 form/ (755) │ ├ input.html (644) ├ finish.html (644) ├ sendmail.cgi (755) │ ├ data/ (777) │ └ lastmail.cgi (666) │ ├ lock/ (777) │ └ flock.cgi (666) │ └ lib/ (755) ├ ap_mimeenc.pl (644) └ jcode.pl (644) そのほか変更したのは 「sendmail.cgi」というファイルを変更しました。 1行目に #!/usr/bin/perl と変更。 $sendmail = '/usr/sbin/sendmail'; ここはさくらサーバー指定のパスに $mail_to_addr = '*****.sakura.ne.jp'; 実際に届いてほしいアドレスに。 という具合に変更しました。 そのほかはとりあえず動くことを確認したかったので、編集しておりません。 この状態で送信ボタンを押したところ。 ■■■■■■■■■■■■■■ Internal Server Error The server encountered an internal error or misconfiguration and was unable to complete your request. Please contact the server administrator, support@sakura.ad.jp and inform them of the time the error occurred, and anything you might have done that may have caused the error. More information about this error may be available in the server error log. Apache/1.3.39 Server at *****.sakura.ne.jp Port 80 ■■■■■■■■■■■■■■ と表示されました。 原因が分からず困っています。 他に必要な情報がありましたらいってください。 宜しくお願いいたしますm(__)m

    • ベストアンサー
    • CGI
  • ★簡単なメール送信フォーム教えて!(cgi)

    レンタルサーバを借りました。 ホームページも独自ドメインで作成して、 独自のメールアドレスで送受信できました。 そこでホームページ上にメール送信フォーム作成したい。 つまりよくある、 1)メールアドレス 2)氏名(ハンドル可) などを入れて「送信ボタン」を押したら、 私宛にメールが送られてくるやつです。 そしたらある人が下記のURLに雛型があるので、 無料ダウンロードすれば作れるよと教えてくれました。 https://www.synck.com/contents/download/cgi-perl/mailform_jcode.html そこでダウンロードして勉強したら、 cgi & Perl で書かれていて、レンタルサーバ屋に 聞いたら、うちは cgi 使えますよ、ということ。 しかし上記URL の内容が意外と難しくて脱帽状態(^^; そこで上記1)と2)だけのような簡単なフォーム、 教えてもらえないものでしょうか? ちなみに、C言語やVBなどのプログラムは解ります。

    • ベストアンサー
    • CGI

専門家に質問してみよう