0

私は、開発環境と1つの例外を除いて、両方で期待どおりに機能するメール送信スクリプトを持っています。ライブ環境と開発環境を条件とするmail()テストから矛盾する結果が得られます。

私の開発環境では、成功すると$ThanksURLにリダイレクトされます。ライブサーバーでは、メールを介しても正常にスクリプトがelseステートメントに進み、フォームページにリダイレクトされます。

これは私を夢中にさせているので、理由についてのアイデアは大歓迎です。

問題の抜粋:

$ok = @mail($to, $subject, $message, $headers, $returnpath);
            if($ok){ header("Location: $ThanksURL");
        exit;
}else{ $_SESSION['error'] .= " There has been a problems submitting your details. <br />";
                header("Location: $form");
                exit;   
        }// end if ok

完全なスクリプト:

<?php 
session_start();
$form = 'index.php';
$_SESSION['error'] = "The following errors have occured: ";

if(isset($_POST['submitted'])) {

    // email fields: to, from, subject, and so on
    // Here 
$from = "Form Feedback <******@gmail.com>";
    $to = "******@gmail.com";
    $subject = "Competition";
    $ThanksURL =  "thankyou.html"; 
    $headers = "From: $from";
    $returnpath = "-f" . $from;
    $attachment = 0; // is there an attachement
    //form fields
    $emailAddress = stripslashes($_POST['email']);
    $phone = stripslashes($_POST['phone']);
    $comments = stripslashes($_POST['comments']);
    //basic message info        
    $message = "Info submitted:\n\nEmail address: " .$emailAddress ."\n\nPhone number: " .$phone."\n\nComments:\n ".$comments. "\n\n";

    if($_FILES['attachment']['error'] == 4) {
         $message .="No attachement included";
        }else{
    // test file type and size for submission
    $allowedExts = array("doc", "docx", "pdf", "txt");
    $extension = end(explode(".", $_FILES['attachment']["name"]));

    if ((($_FILES['attachment']["type"] == "application/msword")
    || ($_FILES['attachment']["type"] == "application/vnd.openxmlformats-officedocument.wordprocessingml.document")//docx mime
    || ($_FILES['attachment']["type"] == "application/pdf")
    || ($_FILES['attachment']["type"] == "application/plain")
    || ($_FILES['attachment']["type"] == "text/plain"))
    && ($_FILES['attachment']["size"] < 2097152 )
    && in_array($extension, $allowedExts)){
        // boundary
            $semi_rand = md5(time());
            $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";

            // headers for attachment
            $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\"";

            // multipart boundary
            $message = "--{$mime_boundary}\n" . "Content-Type: text/plain; charset=\"iso-8859-1\"\n"."Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n";

                    // prepare the files uplaod
              $message .= "--{$mime_boundary}\n";
              $fp     = @fopen($_FILES['attachment']['tmp_name'],"rb");
              $data   = @fread($fp,filesize($_FILES['attachment']['tmp_name']));
              @fclose($fp);
              $data = chunk_split(base64_encode($data));

             $message .= "Content-Type: application/octet-stream; name=\"".$_FILES['attachment']['name']."\"\n"."Content-Description: ".$_FILES['attachment']['name']."\n" ."Content-Disposition: attachment;\n" . " filename=\"".$_FILES['attachment']['name']."\";size=".$_FILES['attachment']['size'].";\n"."Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";

$message .= "--{$mime_boundary}--";
        }else{
            $_SESSION['error'] .= "Error: " . $_FILES["attachment"]["name"] . " is not a doc, docx, pdf or txt file or is larger than 2mb. Please resubmit <br />";
            header("Location: $form");
             exit;
             }
        }//file conditional 
     //prepare mail
    $ok = @mail($to, $subject, $message, $headers, $returnpath);
            if($ok){
                 header("Location: $ThanksURL");
                exit;
             }else{
                 $_SESSION['error'] .= " There has been a problems submitting your details. <br />";
                header("Location: $form");
                exit;   
        }// end if ok
    }// end sub

?>
4

1 に答える 1

1

申し訳ありませんが、phpメールは、 phpマニュアルのコメントに記載されているように、成功するとtrueまたはfalse以外の何かを返す可能性があります。また、状況によっては成功するとfalseを返すことも知られています。

PHP mail()は、さまざまな角度から見た厄介な関数です。個人的には、本番システムで使用しないことをお勧めします。迅速なメーラーPHPメーラーZend_Mailなど、かなりの数の選択肢があります。

ただし、これを使用する場合は、アクションを必ずログに記録する必要があります。この場合は、戻り値をログに記録し、戻り値を非表示にする@を指定しないでください。


要約すると、この場合、mail()は空の文字列を返し、trueまたはfalseではありません。

于 2012-10-08T19:23:02.233 に答える