2017-08-01 11 views
0

PHPメールフォームを設定しようとしています。私はthis guideで始まり、私が行くにつれて少し修正しています。現在、私は送信するフォームを取得していますが、私は電子メールを受信して​​いますが、テキストエリアに書かれたコメントだけが電子メールの本文を入力しています。 PHPメールフォーム - 1つの変数だけが投稿されています

私のPHPコード:}他の私は、主に画像添付せずにそれをテストしてきたので、コードは にジャンプしなければならない

<?php 
 
$recipient_email = "[email protected]"; //recepient 
 
$from_email   = "[email protected]"; //from email using site domain. 
 

 

 
if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']) AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest') { 
 
\t die('Sorry, request must be Ajax POST'); //exit script 
 
} 
 

 
if($_POST){ 
 
    
 
    $sender_name \t = filter_var($_POST["name"], FILTER_SANITIZE_STRING); //capture sender name 
 
    $sender_email \t = filter_var($_POST["email"], FILTER_SANITIZE_STRING); //capture sender email 
 
    $phone_number = filter_var($_POST["telephone"], FILTER_SANITIZE_NUMBER_INT); 
 
    $subject  = "Contact Form Entry"; 
 
    $message \t \t = filter_var($_POST["comments"], FILTER_SANITIZE_STRING); //capture message 
 

 
    $attachments = $_FILES['file_attach']; 
 
\t 
 
    //php validation 
 
    if(strlen($sender_name)<4){ // If length is less than 4 it will output JSON error. 
 
     print json_encode(array('type'=>'error', 'text' => 'Name is too short or empty!')); 
 
     exit; 
 
    } 
 
    if(!filter_var($sender_email, FILTER_VALIDATE_EMAIL)){ //email validation 
 
     print json_encode(array('type'=>'error', 'text' => 'Please enter a valid email!')); 
 
     exit; 
 
    } 
 
    if(!filter_var($phone_number, FILTER_SANITIZE_NUMBER_FLOAT)){ //check for valid numbers in phone number field 
 
     print json_encode(array('type'=>'error', 'text' => 'Enter only digits in phone number')); 
 
     exit; 
 
    } 
 
    if(strlen($message)<3){ //check emtpy message 
 
     print json_encode(array('type'=>'error', 'text' => 'Too short message! Please enter something.')); 
 
     exit; 
 
    } 
 

 
    
 
    $file_count = count($attachments['name']); //count total files attached 
 
    $boundary = md5("whatever"); 
 
      
 
    if($file_count > 0){ //if attachment exists 
 
     //header 
 
     $headers = "MIME-Version: 1.0\r\n"; 
 
     $headers .= "From:".$from_email."\r\n"; 
 
     $headers .= "Reply-To: ".$sender_email."" . "\r\n"; 
 
     $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n"; 
 
     
 
     //message text 
 
     $body = "--$boundary\r\n"; 
 
     $body .= "Content-Type: text/plain; charset=ISO-8859-1\r\n"; 
 
     $body .= "Content-Transfer-Encoding: base64\r\n\r\n"; 
 
     $body .= chunk_split(base64_encode($message)); 
 

 
     //attachments 
 
     for ($x = 0; $x < $file_count; $x++){  
 
      if(!empty($attachments['name'][$x])){ 
 
       
 
       if($attachments['error'][$x]>0) //exit script and output error if we encounter any 
 
       { 
 
        $mymsg = array( 
 
        1=>"The uploaded file exceeds the upload_max_filesize directive in php.ini", 
 
        2=>"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form", 
 
        3=>"The uploaded file was only partially uploaded", 
 
        4=>"No file was uploaded", 
 
        6=>"Missing a temporary folder"); 
 
        print json_encode(array('type'=>'error',$mymsg[$attachments['error'][$x]])); 
 
\t \t \t \t \t exit; 
 
       } 
 
       
 
       //get file info 
 
       $file_name = $attachments['name'][$x]; 
 
       $file_size = $attachments['size'][$x]; 
 
       $file_type = $attachments['type'][$x]; 
 
       
 
       //read file 
 
       $handle = fopen($attachments['tmp_name'][$x], "r"); 
 
       $content = fread($handle, $file_size); 
 
       fclose($handle); 
 
       $encoded_content = chunk_split(base64_encode($content)); //split into smaller chunks (RFC 2045) 
 
       
 
       $body .= "--$boundary\r\n"; 
 
       $body .="Content-Type: $file_type; name=".$file_name."\r\n"; 
 
       $body .="Content-Disposition: attachment; filename=".$file_name."\r\n"; 
 
       $body .="Content-Transfer-Encoding: base64\r\n"; 
 
       $body .="X-Attachment-Id: ".rand(1000,99999)."\r\n\r\n"; 
 
       $body .= $encoded_content; 
 
      } 
 
     } 
 

 
    }else{ //send plain email otherwise 
 
     $headers = "From:".$from_email."\r\n". 
 
     "Reply-To: ".$sender_email. "\n" . 
 
     "X-Mailer: PHP/" . phpversion(); 
 

 
     $body = "Name: " . $sender_name . "\r\n"; 
 
     $body .= "Email: " . $sender_email . "\r\n"; 
 
     $body .= "Comments: " . $message . "\r\n"; 
 
     $body .= "Telephone: ".$phone_number . "\r\n"; 
 
    } 
 
     
 
    $sentMail = mail($recipient_email, $subject, $body, $headers); 
 
    if($sentMail) //output success or failure messages 
 
    {  
 
     print json_encode(array('type'=>'done', 'text' => 'Thank you for your email')); 
 
\t \t exit; 
 
    }else{ 
 
     print json_encode(array('type'=>'error', 'text' => 'Could not send mail! Please check your PHP mail configuration.')); 
 
\t \t exit; 
 
    } 
 
} 
 
?>

{//そうでない場合は、プレーンメールを送りますセクション。このコードでは

$body = "Name: " . $sender_name . "\r\n"; 
$body .= "Email: " . $sender_email . "\r\n"; 
$body .= "Comments: " . $message . "\r\n"; 
$body .= "Telephone: ".$phone_number . "\r\n"; 

これらの行のすべてが体変数に連結し、そしてmail()機能が発射されるときに、この情報のすべてを送信しない理由を私は思ったんだけど、含まれています。私が受け取る電子メールは、フォーム上のtextareaで書かれたものだけで構成されています。どんな洞察?

+0

'コード_should_ジャンプ' ... '$ file_count'は' 0'と同じですか? 'var_dump($ file_count);'を実行してください。 –

+0

あなたのヘッダは '\ r \ n 'で区切られていなければなりません。私の推測では、他の行は電子メールヘッダに詰め込まれています。 – Progrock

+0

@PetervanderWal PHPがどのように動作するのか全く知らないので、var_dumpを実行する方法が分からないので、あなたのコメントはif/else文を完全に削除し、elseブロックにあったコードを残してしまいました。これは実際に送信すべきすべてを送信してしまいました!だから私はこの問題がifブロック内にあることを確認しています。さて、どのようにファイルを添付してすべての作業を行う... – user8345012

答えて

0

ループ内の「添付ファイル」コードが空のファイル名をチェックしているので、$file_countステートメント内でもこれを行うのが安全です。

$file_count = count(array_filter($attachments['name'])); 

変更

$file_count = count($attachments['name']); 

したがってのみ非空のファイル名を数えます。

+0

恐ろしい、これは予想される/他のロジックが動作する。ありがとう!添付ファイルが存在するときに表示されるすべての情報を得るために、$ bodyへの "電子メール、コメント、電話など"の連結をどこに貼り付けるべきかに関するアイデアはありますか?添付ファイル付きフォーム送信電子メールの本文には、コメントボックスに書かれた内容のみが現在のコードとともに表示されます。 '// message text'で始まるコードブロックの最後にさらに情報を追加することはできません。 – user8345012

+0

新しい変数(例えば '$ mailText'と呼ばれる)にメールテキストを格納し、' $ message'を '$ mailText'に置き換えます。余分なヒント(もしそれが働いていれば): '$ mailText = ...'を 'if'の直上に置き、他の部分(' $ body = $ mailText; ')に同じ変数を使うことができます –

+0

これはすべてのユーザー情報を保持し、添付ファイルがないときに送信するように機能しましたが、添付ファイル付きのフォーム送信はまだコメントボックステキスト(+添付ファイル)だけで送信されます。私は '$ body。= chunk_split(base64_encode($ mailText));'(これはコメントボックステキストのみを送信しました)を行い、変数を '$ body = $ mailText'にリセットしました。 。 – user8345012

関連する問題