2016-05-11 14 views
0

私たちは、提出されたときに以下のコードを実行するフォームのサイトを持っています。PHPメーラーが電子メールを送信しないのはなぜですか?

  1. (、ちょうどので、私はPHPのメーラーが動作している知っているMYSQLに挿入する前に自分自身にテストメールを送信し、それは常にすべての私のテスト

  2. にした後MYSQLにフォームからすべてのデータを挿入これはいつも動作します)

  3. 提出されたすべての情報をPHPメールで送信します。私はプレーンテキストでこれを望みます(これは時間の約80%でしか動作しません)。

何が起こっているのは、送信してすべてを行うことがありますが、時にはステップ1と2だけです。時には、どこかで何かが壊れているようです。私はそれが特定の句読点で問題になるかもしれないように感じますが、わかりません。 $ copyフィールドのように、人々は自分が望むものを入力することができます。 2番目の電子メールプロセスを壊す可能性のある句読点があるかどうかは不明です。

注:誰かが送信するたびに、request-success.phpページに移動します。しかし、必ずしもステップ3からの電子メールを送信するとは限りません。

誰かが改善の領域や間違っていることが分かっている場合は、共有してください。これは私を狂ってしまう。

<?php 
    session_start(); 
    include_once("config.php"); 
    include_once("includes/functions.php"); 
    require 'phpmailer/PHPMailerAutoload.php'; 
    //database configuration & connection (hiding for privacy purposes, but the database connections work fine so not relevant 

    if ($_POST['submit']) { 

     $type=$_POST['type']; 

     $category= substr($type, 0, strpos($type, ' -')); 
     $category= strtolower($category); 
     $category= ucfirst($category); 
     $need = substr($type, strpos($type, "-") + 1);  

     $subject="REQUEST for " . $type; 
     $fullname= $_SESSION['google_data']['name']; 
     $fromemail=$_SESSION['google_data']['email']; 

     $brands=$_POST['brand']; 

     $size=$_POST['size']; 
     if ($size == "") { 
      $size="n/a"; 
     } 
     $bleed=$_POST['bleed']; 
     if ($bleed =="no") { 
      $bleedsize="n/a"; 
     } else { 
      $bleedsize=$_POST['bleedsize']; 
     } 
     $filetype=$_POST['filetype']; 
     if ($filetype=="") { 
      $filetype="n/a"; 
     } 
     $footerurl=$_POST['footer-url']; 
     if ($footerurl=="") { 
      $footerurl="n/a"; 
     } 
     $footerphone=$_POST['footer-phone']; 
     if ($footerphone=="") { 
      $footerphone="n/a"; 
     } 
     $copy=mysqli_real_escape_string($con,$_POST['copy']); 
     $copyforemail=$_POST['copy']; 

     $approved=$_POST['approved']; 
     $seo=$_POST['seo']; 
     $proofread=$_POST['proofread']; 
     $info=mysqli_real_escape_string($con,$_POST['info']); 
     $infoforemail=$_POST['info']; 

     $priority=$_POST['priority']; 
     $requestdate= date('Y-m-d'); 
     $duedate = date('Y-m-d', strtotime(str_replace('-', '/', $_POST['duedate']))); 
     if ($duedate =="1969-12-31") { 
     $duedate="0000-00-00"; 
     } 
     $timinginfo=mysqli_real_escape_string($con,$_POST['timinginfo']); 
     $timinginfoforemail=$_POST['timinginfo']; 

     $communication=mysqli_real_escape_string($con,$_POST['communication']); 
     $communicationforemail=$_POST['communication']; 

    //TEST EMAIL BEFORE INSERTING 
    $mail = new PHPMailer; 
    //$mail->SMTPDebug = 3;        // Enable verbose debug output 
    /* 
    $mail->isSMTP();          // Set mailer to use SMTP 
    $mail->Host = 'smtp.gmail.com'; // Specify main and backup SMTP servers 
    $mail->SMTPAuth = true;        // Enable SMTP authentication 
    $mail->Username = '';    // SMTP username 
    $mail->Password = '';       // SMTP password 
    $mail->SMTPSecure = 'tls';       // Enable TLS encryption, `ssl` also accepted 
    $mail->Port = 587;         // TCP port to connect to 
    */ 
    $mail->setFrom($fromemail, $fullname); 
    $mail->addAddress('[email protected]', 'my name');  // Add recipients 
    $mail->addReplyTo('[email protected]', 'my name'); 
    /*$mail->addCC('[email protected]'); 
    $mail->addBCC('[email protected]'); 


    $mail->addAttachment('/var/tmp/file.tar.gz');   // Add attachments 
    $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name*/ 
    $mail->isHTML(true);         // Set email format to HTML 

    $mail->Subject = "Request coming for Creative Team"; 
    $mail->Body = "Request coming"; 
    $mail->AltBody = "Request coming"; 

    if(!$mail->send()) { 
     echo 'Message could not be sent.'; 
     echo 'Mailer Error: ' . $mail->ErrorInfo; 
    } else { 
     //continue to insert 
    } 

    $sql = "INSERT INTO requests (firstname, lastname, email, picture, category, type, brand, size, bleed, bleedsize, filetype, footerurl, footerphone, copy, approved, proofread, seo, info, priority, requestdate, duedate, timinginfo, communication) VALUES ('" . $_SESSION['google_data']['given_name'] . "', '" . $_SESSION['google_data']['family_name'] . "','" . $_SESSION['google_data']['email'] . "', '" . $_SESSION['google_data']['picture'] . "', '$category', '$need', '$brands', '$size', '$bleed', '$bleedsize', '$filetype', '$footerurl', '$footerphone', '$copy', '$approved', '$proofread', '$seo', '$info', '$priority', '$requestdate', '$duedate', '$timinginfo', '$communication')"; 

     $insertinfo = mysqli_query($con, $sql); 
     if (!$insertinfo) { 
     die("Database query failed: " . mysqli_error($con)); 
     } else {  
     //Success, continue to email... 
     } 


    $plaintextversion= " 
    $type 

    BRAND: $brands 


    SPECS 

    SIZE: $size 

    BLEED: $bleed 

    BLEED SIZE: $bleedsize 

    FILE TYPE: $filetype 

    FOOTER URL: $footerurl 

    FOOTER PHONE: $footerphone 

    COPY: $copyforemail 

    COPY APPROVED? $approved 

    PROOFREAD? $proofread 

    ADDITIONAL INFO: $infoforemail 


    TIMING 

    PRIORITY: $priority 

    REQUEST DATE: $requestdate 

    DESIRED DUE DATE: $duedate 

    TIMING INFO: $timinginfoforemail 


    COMMUNICATION 

    ADDITIONAL PEOPLE TO INCLUDE: $communicationforemail"; 


    } else { 
     header("Location:index.php"); 
    } 

    $mail = new PHPMailer; 
    //$mail->SMTPDebug = 3;        // Enable verbose debug output 
    /* 
    $mail->isSMTP();          // Set mailer to use SMTP 
    $mail->Host = 'smtp.gmail.com'; // Specify main and backup SMTP servers 
    $mail->SMTPAuth = true;        // Enable SMTP authentication 
    $mail->Username = '';    // SMTP username 
    $mail->Password = '';       // SMTP password 
    $mail->SMTPSecure = 'tls';       // Enable TLS encryption, `ssl` also accepted 
    $mail->Port = 587;         // TCP port to connect to 
    */ 
    $mail->setFrom($fromemail, $fullname); 
    $mail->addAddress('[email protected]', 'someone');  // Add recipients 
    $mail->addReplyTo('[email protected]', 'my name'); 
    /*$mail->addCC('[email protected]'); 
    $mail->addBCC('[email protected]'); 


    $mail->addAttachment('/var/tmp/file.tar.gz');   // Add attachments 
    $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name*/ 
    $mail->isHTML(false);         // Set email format to plain text since that is what Salesforce needs 

    $mail->Subject = $subject; 
    $mail->Body = $plaintextversion; 
    $mail->AltBody = $plaintextversion; 

    if(!$mail->send()) { 
     echo 'Message could not be sent.'; 
     echo 'Mailer Error: ' . $mail->ErrorInfo; 
    } else { 
     header("Location:request-success.php"); 
    } 
    ?> 
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <html> 
    <head> 
    <meta charset="utf-8"> 
    <meta name="robots" content="noindex, nofollow"> 
    <title>Untitled Document</title> 
    </head> 

    <body> 
    </body> 
    </html> 
+1

あなたのクエリはSQLインジェクション攻撃に対して広く開かれており、あなたのコンテンツに引用符がある場合、あなたの問題の原因となる可能性があります。既にmysqliを使用しているので、準備文機能を使用できるようにする必要があります。 –

答えて

1

あなたはプレーンテキストが必要な場合にのみ、isHTML(false)だけBody設定を呼び出す - AltBodyには何も入れないでください。

いつでも最初から起動する必要はありません。同じPHPMailerインスタンスを再利用し、2回目に送信する前にプロパティを変更することができます。

送信者アドレスを送信元アドレスとして使用しています。これは偽造されているため、SPF障害からの復帰が発生するため、FromアドレスとFromアドレスに返信先アドレスを入力します。

Jonによれば、SQLに入るものを検証し、浄化し、エスケープします。あなたの失敗は、'を含む投稿からのもので、SQLを壊す可能性があります。

+0

徹底的な答えをありがとう。あなたの意見では、衛生化して脱出する最良の方法は何ですか(私はそこにたくさんの意見があります)。 mysqli_real_escape_stringは十分ですか?私はテキストエリアのためにそれを使用しますが、病気はあなたの提案ごとにすべてのフィールドにそれを適用します。 – user3304303

+1

エスケープ処理は大部分を解決しますが、最初は不正なデータが許可されていない方がずっと良いです。 HTMLを含んではいけない入力に 'strip_tags'を適用し、電話番号フィールド、ストリップ番号、名前フィールドの電話番号に許可されていないものを削除してください。 HTMLの選択)、それが等であることをチェックしてください。クライアントの側でもこれを簡単に行うことができます(!ではなく!)。 jQuery-validateはそれに適しています。 – Synchro

関連する問題