サーバエラー500発生時でも200で返却したい

このQ&Aのポイント
  • mb_send_mailの戻り値がtrueまたはfalseかを判定している以外は、エラー処理は実装していません。
  • mb_send_mail=false後、エラー画面出力処理が最後まで実行されていることは、処理の途中に埋め込んだデバッグ用のログで確認済みなのだが、
  • クライアント側にはInternal Server Errorのステータスと、PHPスクリプトで出力しようとした画面ではなく、内部エラーが発生した旨の簡易な情報が出力された画面が出力されます。
回答を見る
  • ベストアンサー

サーバエラー500発生時でも200で返却したい

mb_send_mailで不正な送信先メールアドレスを設定して実行すると、戻り値はfalseとなり、 falseの場合には後続のPHPスクリプトにてメール送信が失敗したエラー画面を出力する 処理を実装している。 mb_send_mailの戻り値がtrueまたはfalseかを判定している以外は、エラー処理は実装していません。 【問題点】 mb_send_mail=false後、エラー画面出力処理が最後まで実行されていることは、 処理の途中に埋め込んだデバッグ用のログで確認済みなのだが、 クライアント側にはInternal Server Errorのステータスと、PHPスクリプトで 出力しようとした画面ではなく、内部エラーが発生した旨の簡易な情報が出力された 画面が出力されます。 [Mon Sep 09 11:43:57 2013] [error] [client ****] malformed header from script. Bad header=test@set@ting_error... ↑不正なメールアドレスを設定したのでエラーになることは構わないのだが、 後続の処理で作成したエラー画面をHttpStatus200で返却したい。 【質問】 mb_send_mail=falseが発生したとしても、HTTPステータスは500ではなく200で レスポンスを返却し、PHPスクリプトで作成したエラー画面をクライアントに表示させる方法を ご教授ください。 【試したこと】 ・mb_send_mail=falseとなった場合に、http_response_code(200);としてみたが効果なし。 ご教授よろしくお願いいたします。

  • PHP
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
noname#244856
noname#244856
回答No.2

mb_send_mail関数の頭に「@」をつけるのも一つの手ですが、更にそれより前に if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) { // エラー処理 } として不正なメールアドレスを弾いておくといいかもしれません。 IPv6を直接指定するアドレスには対応していませんが、大半のアドレスはこの関数で正しくチェック出来ます。

freshjive
質問者

お礼

おっしゃる通り、そもそも不正なアドレスは弾いてしまえば mb_send_mail前にエラールーチンに流せますね。 エラーハンドラなどを使わなければならないのかと考えておりましたが、 とりあえずこのチェック処理を事前にかませて処理させようと思います。 ありがとうございました。

その他の回答 (1)

  • t_ohta
  • ベストアンサー率38% (5083/13283)
回答No.1

mb_send_mail 関数の前に @ を付ける。

freshjive
質問者

お礼

なるほど、@をつけることによりエラーが出力されなくなるわけですね。 とても参考になりました。ありがとうございました。

関連するQ&A

  • PHPのメール送信でエラーが発生します。

    PHPでメール送信プログラムを組んだのですが、 エラーが発生してメールが送信できません。 いろいろ試したのですが、解決方法が見いだせなかったため、 書き込みをいたしました。 以前、XPで開発をしていたときは、メール送信ができたと思ったのですが。。 環境は以下の通りです。 WindowsVista PHP5.2.5 Apache2.2.6 melon1.62 実行したプログラムは以下の通りです。 $to = "abc@yahoo.co.jp"; $from = "abc@yahoo.co.jp"; $subject = "タイトル"; $message = "メッセージ"; $header = "From: $from"; mb_send_mail($to, $subject, $message, $header); abc@yahoo.co.jpは、実際には自分のヤフーアドレスで入力しました。 エラーは、melonのコンソールに、 421 temporary sender lookup fail と表示されます。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • sendmailでエラーがでます

    PHPを勉強しはじめ、まず今までVBS(IIS)で書いていたメール送信プログラムを PHPで書き始めました。 環境:XP-SP2、PHP5.0.4、Apache2.0.53 mail_input.phpから、名前、メールアドレス、自由記入欄 を作り、その内容を 自分のメールアドレスに送るプログラム(sendmail.php)をPHPで作っています。 sendmail.php のサビの部分は以下です。 mb_send_mail($_POST['_email'],$_POST['_email],$body,$header_info); エラーメッセージは Fatal error: Call to undefined function mb_send_mail() in C:\Program Files\Apache Group\Apache2\htdocs\sendmail.php on line 9 です。 mb_send_mail()の設定が間違っているように思われます。 この為のphp.ini のマルチバイト関数修正点は 修正前: SMTP = localhost ;sendmail_from = me@example.com 修正後: SMTP = rapid.ocn.ne.jp sendmail_from = *****@rapid.ocn.ne.jp 上記2点以外はいじっておりません。 なおIISの時は、上記のような処理が出来ていたので、プロバイダ(ocn)のせいではないと思われます。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • javascript関数の戻り値でphpの条件分岐

    こんばんは。 またまたプログラミングで詰まってしまいました・・・。 <?php    echo "<script> funcJS(); </script>"; //javascriptの関数。戻り値true/false    if(funcJS()の戻り値がtrueかどうか){       <~phpの処理~>     } ?> のようなプログラムがあったとして、funcJS()の戻り値の値によって、『phpの処理』を行うかどうかを決定したいのですがそのアルゴリズムが思いつきません。 色々と試行錯誤はやってみて、 (1)phpの変数にfuncJS()の戻り値を格納して、if文で条件分岐  $value = "<script> funcJS(); </script>";   しかし、これは$valueに戻り値を入れることができませんでした。 (2)javascript変数に戻り値を格納して、javascript内のif文で条件分岐 <?php    echo "<script> var value=funcJS(); </script>"; //javascriptの関数。戻り値true/false    echo "<script> if(value == 'true'){ </script>";       <~phpの処理~>    echo "<script> } </script>"; ?>  これも"}"がないと怒られてしまいました。 自分で思いつく限りは試してみたのですが、他に方法が思い浮かばず頭を抱えている状態です。 何か良い方法を知っている方、思いついた方、よろしくお願いします。

  • phpで404エラーページが表示されません

    現在利用中のサーバ上で存在しないファイルをブラウザからアクセスすると、 「Not Found The requested URL was not found on this server.」 とエラーページが表示されます。 上記と同様のエラーページをアクセスの条件によって出力するためにphpスクリプトで header('HTTP/1.0 404 Not Found'); と記述していますが、空白のページしか表示されません。 header~の前に何かを出力している等などのエラーや警告が発生していないことは 確認してあります。 また、404ステータスが正常に返却されていることもheader情報のキャプチャで確認しています。 (ファイルが存在しない場合と同じ内容が返っています。) カスタムエラーの設定も特にしていません。 どのようなことが考えられるかお教え頂きたくお願い致します。

    • ベストアンサー
    • PHP
  • http500サーバーエラー

    cgiを作成してテストをしていたのですが、http500サーバーエラーとなってしまいました。 内容は、1つのcgiで処理区分を設けて複数のHTMLを作成したり、メール送信をさせています。 初めに処理区分なしで実行させ、入力フォームのHTMLを出力させます。 次に、前に入力した項目を出力して確認してもらいます。 次に、sendmailでメール送信して送信完了画面を出力したいのですが、ココでhttp500のエラーメッセージが出ます。 当然ココまで同じcgiを使用しているのですが、何故この時だけエラーになってしまうのか分かりません。localでテストしている時には動いているのですが? 誰か、知恵を貸してください。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • メール送信

    現在独学でPHPの勉強をしており、行き詰まってしまいここで質問をさせて頂きました。 行き詰まった内容ですがphpでメール送信のスクリプトを書いたのですが エラーが出てしまい送れません。 こちらが私が書いたスクリプトになります。 <html> <head><title>mail.php</title></head> <body> <?php $address = $_POST["address"]; $subject = $_POST["subject"]; $message = $_POST["message"]; $header = "Content-Type: text/plain;charset=iso-2022-jp"; mb_language("Japanese"); if(mb_send_mail($address, $subject, mb_convert_encoding($message, "JIS", "EUC-JP"), $header)){ print("送信完了しました。"); }else{ print("エラー:送信に失敗しました"); } ?> </body> </html> エラーの内容ですが、 Fatal error: Call to undefined function mb_language() in C:~となっております。mb_languageが使えないとの表示が出てくるのですが、 色々な本などを調べてもこれを使ってる所もありなにが問題なのか分かりません。 php.iniでの設定(mbstring.internal_encoding = EUC-JP、extension=php_mbstring.dll)の ; などは外してみたりしてるのですが どうにも分かりません。 どなたかお分かりになるかたがいましたら是非教えて頂けないでしょうか。宜しくお願い致します。

    • ベストアンサー
    • PHP
  • メール送信先が実在するか確かめたい

    $send = mail($e_mail, "kenmei", $MSG, $header) ; if ($send) { } else { $ERRMSG = "以下のメールが " . $e_mail . " 宛てに送信できませんでした\n\n" ; mail("自分のアドレス", "can't send", $ERRMSG, $header) ; } というコーディングをしたのですが、実在しないアドレスが$e_mailに入っていても、この処理自体はエラーが 起きないのか、エラーメッセージは出力されません。 宛て先が実在する・しないを確める方法を教えてください。お願いします。

    • 締切済み
    • PHP
  • メール送信について

    こんばんは。PHPでmb_send_mailを使ってメールを送信したいのですが、「Warning: mb_send_mail() [function.mb-send-mail]: SMTP server response: 521 mail not accepted from this domain in C:\Program Files\Apache Group\Apache2\htdocs\samples\chap2\sendmail.php on line 5メール送信に失敗しました。」とエラーが出てしまい上手くできません。 ■PHPスクリプト 1:<?php 2:$to='○○○○○@yahoo.co.jp'; 3:$subject='テストメール'; 4:$body='ようこそ!'; 5:if(mb_send_mail($to,$subject,$body)){ 6: print('メール送信に成功しました。'); 7:} 8:else{ 9: print('メール送信に失敗しました。'); 10:} 11:?> PHP.iniファイルはSMTP=smtp.mail.yahoo.co.jp、sendmail_from=CQW15204nifty.comと設定しております。 参考書通りにやっているのですが、メーラーに送られません。この状態で他に考えられる原因とかありますか?わかる方ぜひ教えてください。

    • 締切済み
    • PHP
  • headerでエラー

    お世話になります。 行き詰まってしまいどうにもならないので質問させて下さい。 フォームのテキストボックスが未入力状態で「更新」ボタンを押したとき 更新処理を行わずエラーメッセージの表示等を行うだけで同一画面に留まりたいプログラム「input.php」があります。 <?php require_once("mysql.php"); GET処理 POST処理(※入力チェック OK:更新処理、NG:header使用し別モードで再読込) ?> <html> <head> (中略) フォーム(action="<?=$_SERVER["PHP_SELF"]?>") </html> エラーチェックを<html>より前の部分で行い、不正なら「input.php?err=1」という形でheaderを使った再読込で項目の上にエラーメッセージを表示させたいのですが、うまくいきません。 (※やり方に関してどうしてもこうする必要があるのでご理解下さい) 試しに以下のように書き換えて実行するとこのように表示されます。 「..xxx/mysql.php の 1 行目でヘッダがすでに送信されています。リダイレクトできません。 」 if (!headers_sent($filename, $linenum)) { header("Location: http://$host/input.php?err=1"); exit; } else { echo "$filename の $linenum 行目でヘッダがすでに送信されています。"; exit; } メッセージにある「mysql.php」の1行目は「<?php」だけなので何がいけないのか見当がつきません。 「header」の使用については  ・すべての出力の前でなければならない  ・読み込みファイルや空白行などにも注意 ということまでは知っているので注意しているつもりなのですが... 何かお気づきの点でもあればご指摘下さい。 よろしくお願いします。

    • 締切済み
    • PHP
  • Apacheで404エラーが発生した時、メールを送信したい

    ハッスルサーバをレンタルしてphpでサイトを作っている者です。 404エラーが発生した際に、err.phpというページに飛び、さらにerr.php内で404エラーを起こしたアドレスを書いたメールを自分のアドレスに送りたいと思っています。 .htaccessを設定してerr.phpを表示させるところまではうまくいきましたが、エラーを起こしたアドレスをどうやって取得すればいいかがわかりません。 例えば変数 $_SERVER['REQUEST_URI'] だとerr.phpが返されるので意味がありません。 よろしくお願いします。 (※この質問はyahoo知恵袋にもしたのですが、レスポンスがないのでこちらにも投稿しました)

    • ベストアンサー
    • PHP

専門家に質問してみよう