前回の質問(1276788484)の続きです。

cgiのメールフォームについて質問です。
「WwwMail」というフリーのcgiを使用しています。

入力エリアが空欄でも、送信ボタンを押すと、
エラーメッセージは出さずに、指定のメールアドレスに送信される設定にしてるんですが、
空欄の時だけ、メールが送られてこないようにしたいんですが、どうしたらいいでしょうか?
メール送信の設定は、文字数がオーバーするので、
コメント欄に書きます。

うまく説明できなくて、申し訳ないです。
よろしくお願いします。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:
  • 終了:2010/06/28 00:50:06
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:rouge_2008 No.1

回答回数595ベストアンサー獲得回数351

ポイント60pt

入力エリアとは、メッセージ入力欄の事でしょうか?

この場合は、133行目付近にあるメールアドレスチェックの前の部分に、次のように数行追加してみてください。

#次から4行追加
# メッセージ本文が入力されているかチェックする
if ($FORM{'MESSAGE'} eq "") {
    &errexit("メッセージが入力されていません。");
}
#この上までが追加する部分です。(※以降は変更ありません。)
#
# EMAILが正常なメールあどれすかどうか判断する
#


メールアドレスが入力されていない場合に送信しない場合は、次のようにしてみてください。

#
# EMAILが正常なメールあどれすかどうか判断する
#
#次の行から3行追加
if ($FORM{'EMAIL'} eq "") {
    &errexit("メールアドレスが入力されていません。");
}
#この上までが追加する部分です。(※以降の行はそのまま)
if ($FORM{'EMAIL'} =~ /^[-_\.a-zA-Z0-9]+\@[-_\.a-zA-Z0-9]+$/) {
	$mailfrom = $FORM{'EMAIL'};
}


※URLはダミーです。

http://q.hatena.ne.jp/

id:helpme1111

回答ありがとうございます。

# メッセージ本文が入力されているかチェックする
if ($FORM{'MESSAGE'} eq "") {
    &errexit("メッセージが入力されていません。");
}

#
# EMAILが正常なメールあどれすかどうか判断する
#
if ($FORM{'EMAIL'} eq "") {
    &errexit("メールアドレスが入力されていません。");
}
if ($FORM{'EMAIL'} =~ /^[-_¥.a-zA-Z0-9]+¥@[-_¥.a-zA-Z0-9]+$/) {
	$mailfrom = $FORM{'EMAIL'};
}

上記を入れてみたのですが、

送信結果というページに飛んでしまうんです。

元のデザインの中に「メールアドレスが入力されていません。」だけ表示させることは可能でしょうか?

あと、空欄ではなく、正常なメールアドレスを入力して送信ボタンを押しても、

「メッセージが入力されていません。」と出てしまうようになっちゃいました。

2010/06/21 03:01:37

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 ko8820 1221 1068 69 2010-06-27 21:18:19
  • id:helpme1111
    現在のメール送信設定です。

    >||
    if ($mailcmd =~ /sendmail/) {
    if ($usefoption == 0) {
    $cmd = "$mailcmd -t";
    } else {
    $cmd = "$mailcmd -f $mailto -t";
    }
    unless (open(OUT, "| $cmd")) {
    &errexit("メールの送信に失敗しました。(1)");
    }
    unless (print OUT &mimeencode($mailhead)) {
    &errexit("メールの送信に失敗しました。(2)");
    }
    unless (print OUT $mailbody) {
    &errexit("メールの送信に失敗しました。(3)");
    }
    close(OUT);
    } elsif ($mailcmd =~ /BLAT/i) {
    &jcode'convert(*subject, "sjis");
    $cmd = "$mailcmd";
    $cmd .= " -";
    $cmd .= " -t $mailto";
    $cmd .= " -s ¥"$subject¥"";
    if ($mailfrom) {
    $cmd .= " -c $mailfrom";
    $cmd .= " -f $mailfrom";
    }
    unless (open(OUT, "| $cmd > NUL:")) {
    &errexit("メールの送信に失敗しました。(4)");
    }
    &jcode'convert(*mailbody, "sjis");
    unless (print OUT $mailbody) {
    &errexit("メールの送信に失敗しました。(5)");
    }
    &jcode'convert(*mailbody, "jis");
    close(OUT);
    } else {
    &errexit("メール送信コマンド $mailcmd が存在しません。");
    }
    ||<

    よろしくお願いします。
  • id:rouge_2008
    > 元のデザインの中に「メールアドレスが入力されていません。」だけ表示させることは可能でしょうか?

    CGIファイルの最後の方に、「# エラーメッセージを出力して終了」という部分があります。
    そこのHTML出力部分を書き直せば可能です。
    元のデザインというのがフォームを含むのでしたら、フォームごと書き足す必要があります。
    「$msg .= "<p>$err</p>\n";」というのがエラーメッセージの出力ですので、ここは変更しないでください。

    CGIに移動させずにエラーチェックをしたい場合は、JavaScriptによる入力チェックはいかがでしょうか?
    どれがいいかちょっと分かりませんが、例えば次のようなライブラリが公開されています。
    (※ブラウザの設定で、JavaScriptをオフにしている場合は動作しません。)

    http://studynet.blog54.fc2.com/blog-entry-92.html

    http://phpspot.org/blog/archives/2007/09/prototypejsjsjs.html



    > あと、空欄ではなく、正常なメールアドレスを入力して送信ボタンを押しても、
    「メッセージが入力されていません。」と出てしまうようになっちゃいました。

    こちらでは正しく動作します。
    修正ミスがないか、もう一度確認してみてください。
  • id:rouge_2008
    > あと、空欄ではなく、正常なメールアドレスを入力して送信ボタンを押しても、
    「メッセージが入力されていません。」と出てしまうようになっちゃいました。

    今気がつきましたが、「メッセージが入力されていません。」と出るのですか?
    メッセージ欄には何か入力しましたか?
    メッセージ欄のチェックが不要なのでしたら、最初に紹介した次の記述を削除してください。

    #次から4行追加
    # メッセージ本文が入力されているかチェックする
    if ($FORM{'MESSAGE'} eq "") {
    &errexit("メッセージが入力されていません。");
    }
    #この上までが追加する部分です。(※以降は変更ありません。)
  • id:helpme1111
    >rouge_2008 さん

    ご回答ありがとうございます。

    取り急ぎ、指定の記述を削除してみましたが、
    メッセージ欄に入力していても、「メッセージが入力されていません。」と出てしまいます。

    今回、やりたいことを整理しますと、

    ・入力欄が空欄のまま送信ボタンを押した際は、エラーメッセージを出して、メール送信しない。
    (現状は、空欄のままボタンを押すと、入力時の動作と同様に、「ありがとうございました」と出て、メール送信されています)

    うまく説明できなくて、すみません。
    きっと、わたしが間違っていると思うので、よく見直してみます。。。
  • id:rouge_2008
    返信内容からそのままコピー&ペーストしてみましたが、こちらではやはり問題なく動作します。
    現状は空欄でも送信されるという事は、記述を元に戻してあるのでしょうか?
    メールアドレスかメッセージ欄のどちらか一つをチェックする事から試してみてください。

    ※記述する場所に間違いがないかも確認してみてください。
    (109行目付近)
    #
    # 入力値を読み取る
    #
    if ($ENV{'REQUEST_METHOD'} eq "POST") {
    read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
    (~ 略 ~)
    } else {
    $FORM{$name} .= (" " . $value);
    }
    }
    }

    #ここに追加します。(メッセージとメールアドレスの両方をここに記述しても大丈夫です。)

    (133行目付近)
    #
    # EMAILが正常なメールあどれすかどうか判断する
    #
    if ($FORM{'EMAIL'} =~ /^[-_\.a-zA-Z0-9]+\@[-_\.a-zA-Z0-9]+$/) {
    $mailfrom = $FORM{'EMAIL'};
    }

    ところで、チェックしたい入力欄は、メールアドレスとメッセージ欄の両方ですか?
    それとも、メッセージだけ入力されていれば、メールアドレスは未入力でもいいのですか?
  • id:rouge_2008
    まだ入力チェックの問題が解決していないようですが、エラーメッセージ表示について追記します。
    ※以下は「WwwMail」デフォルトのフォームデザインです。
    カスタマイズしている場合は、適宜変更してください。(分からなければ聞いてください。)

    wwwmail.cgiの最後
    #
    # エラーメッセージを出力して終了
    #
    (~ 略 ~)
    $msg .= "<title>メール送信フォーム(ここを書き直し)</title>\n";
    $msg .= "</head>\n";
    $msg .= "<body>\n";
    $msg .= "<h1>メール送信フォーム(ここを書き直し)</h1>\n";
    $msg .= "<hr>\n";
    $msg .= "<p>$err</p>\n";
    #以降にメールフォームのHTMLタグを追加
    $msg .= "<form method=\"POST\" action=\"wwwmail.cgi\">\n";
    $msg .= "お名前:<br>\n";
    $msg .= "<input type=\"text\" size=50 name=\"NAME\" value=\"$FORM{'NAME'}\"><br><br>\n";
    $msg .= "メールアドレス:<br>\n";
    $msg .= "<input type=\"text\" size=50 name=\"EMAIL\" value=\"$FORM{'EMAIL'}\"><br><br>\n";
    $msg .= "ホームページ:(お持ちであれば)<br>\n";
    $msg .= "<input type=\"text\" size=50 name=\"HPAGE\" value=\"$FORM{'HPAGE'}\"><br><br>\n";
    $msg .= "メッセージ:<br>\n";
    $msg .= "<textarea cols=50 rows=3 name=\"MESSAGE\">$FORM{'MESSAGE'}</textarea><br><br>\n";
    $msg .= "<input type=\"submit\" value=\" 送信 \">\n";
    $msg .= "<input type=\"reset\" value=\" 取消 \">\n";
    $msg .= "</form>\n";
    # 次を「#」でコメントアウトします。(※表示しても良い場合は行頭の「#」は必要ありません。)
    # $msg .= "<p>ブラウザの [戻る] ボタンで戻ってください。</p>\n";
    # 以降は変更ありません。



    ※HTMLタグの記述時に、『シングルクォートの中でシングルクォート文字を使用する場合、または、ダブルクォートの中でダブルクォート文字を使う場合には、エスケープ記号 ( \ ) でエスケープしなければなりません。』 という点に気をつけてください。
    http://www.kent-web.com/perl/chap2.html
  • id:helpme1111
    >rouge_2008 さん

    コメントありがとうございます!
    まだ苦戦しているので、もう一度やり直してみて、
    今夜またここに結果を書きたいと思います。
  • id:rouge_2008
    2~3回試してみて駄目だったらすぐ報告してください。
    それから、前回と今回の質問で変更している箇所以外にもどこか修正していますか?
  • id:helpme1111
    >rouge_2008 さん

    お返事が遅くなって、本当にごめんなさい。
    自分で適当に色々変更していたので、
    どこがどうなってるのか苦戦していました。

    結局、やりたいことは出来たのですが、
    完了画面にmailtoでメールアドレスを入れているんですが、
    なぜかabc@aaa.jpだとすると、abc.jpと文字化け?してしまい、
    そこでまたつまづいてるといった状況です。
  • id:rouge_2008
    次のように送信先メールアドレスに設定したアドレスを表示しているのですか?

    $mailto = 'abc@aaa.jp';

    完了画面とは、メールの送信完了後に表示される画面ですか?
    こちらでは、次のように$headerに記述した場合も問題なく表示されました。
    $header = <<END_OF_DATA;
    (~ 略 ~)
    <p>下記のメールを送信しました。ありがとうございました。<br>
    2~3日経っても返信のメールが届かない場合は、お手数ですが$mailtoへ再度お問い合わせメールを送信してください。</p>
    <hr>
    END_OF_DATA


    また、以下の場所に記述した場合も問題ありませんでした。

    #
    # ブラウザ画面に送信結果を書き出す
    #
    (~ 略 ~)
    print "$header\n";
    print "一両日中に返信がない場合は、お手数ですが$mailtoにお問い合わせメールを送信してください。\n";
    # print "$mail\n";
    print "$footer\n";
    }


    スクリプト前半部分の$mailtoの設定の他に、別の箇所で別の変数にメールアドレスを設定しているのでしょうか?
    「$mailto = "abc@aaa.jp";」のようにメールアドレスをダブルクォート「"」で囲んでいる場合は、「$mailto = 'abc@aaa.jp';」のようにシングルクォート「'」に変更して試してみてください。
    ※あるいは、メールアドレスの「@」の前に「\」をつけて、「$mailto = "abc\@aaa.jp";」のようにしても大丈夫です。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません