为什么PHP Mailer并不总是发送电子邮件?

时间:2016-05-11 14:56:38

标签: php mysql email phpmailer

我们有一个网站,其表单在提交时会执行以下操作(通过以下代码);

  1. 在插入MYSQL之前向我自己发送一封测试邮件,这样我就知道php邮件正在运行,它在我的所有测试中都会这样做

  2. 然后将表单中的所有数据插入到MYSQL中(这总是有效)

  3. 通过PHP Mailer发送另一封电子邮件,其中包含他们提交的所有信息。我希望它以纯文本形式出现(这只占大约80%的时间)。

  4. 正在发生的事情是,有时候人们提交并且它会做所有事情,但有时它只会执行第1步和第2步。所以有时候,某些事情似乎在某个地方出现了问题。我觉得它可能是某些标点符号的问题,但不确定。就像$ copy字段一样,人们可以输入他们想要的任何内容。不确定是否存在某些可能会破坏第二封电子邮件流程的标点符号。

    注意:每次有人提交时,都会将它们带到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('myemail@myemail.com', 'my name');     // Add recipients
        $mail->addReplyTo('myemail@myemail.com', 'my name');
        /*$mail->addCC('cc@example.com');
        $mail->addBCC('bcc@example.com');
    
    
        $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('someone@someone.com', 'someone');     // Add recipients
        $mail->addReplyTo('myemail@myemail.com', 'my name');
        /*$mail->addCC('cc@example.com');
        $mail->addBCC('bcc@example.com');
    
    
        $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 个答案:

答案 0 :(得分:1)

如果您只想要纯文字,请致电isHTML(false)并仅设置Body - 请勿在{{1​​}}中添加任何内容。

无需每次都从头开始 - 您可以重新使用相同的PHPMailer实例,只需在第二次发送之前更改属性。

您使用提交者地址作为发件人地址 - 这是伪造的,并且会导致SPF失败的退款,因此请将您的地址放在From和他们的回复中。

正如Jon所说,验证,清理和转义任何进入SQL的内容 - 很可能你的失败来自包含AltBody的提交,这会破坏你的SQL。