PHPMailer响应时间慢

时间:2018-01-23 11:28:36

标签: php email phpmailer

我正在使用PHPMailer向用户发送忘记密码的电子邮件,当用户将电子邮件提交到页面下方的代码时,需要几分钟才能加载!我不希望电子邮件立即发送,但有没有办法让它在重定向用户的同时仍然发送电子邮件?

我对php很新,所以我可能会错过一些简单的东西。

这是我的代码:

<?php

define('DB_NAME', '#######');
define('DB_USER', '#######');
define('DB_PASSWORD', '#######');
define('DB_HOST', 'localhost');

$conn = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
if (!$conn) {
     die('Could not connect: ' . mysqli_connect_error());
     }

$recovery = $_POST['recovery'];     

$sql = "SELECT forgotpass FROM members WHERE username = '$recovery'"; 
$result=mysqli_query($conn, $sql);

while($row = mysqli_fetch_array($result, MYSQLI_ASSOC))
{

  echo "Please wait... ";  


    $mailto = $recovery;
    $mailSub = "Here's your password!";
    $mailMsg = $row['forgotpass'];
   require 'PHPMailer-master/PHPMailerAutoload.php';
   $mail = new PHPMailer();
   $mail ->IsSmtp();
   $mail ->SMTPDebug = 0;
   $mail ->SMTPAuth = true;
   $mail ->SMTPSecure = 'ssl';
   $mail ->Host = "bemoresocial.co.uk";
   $mail ->Port = 465; // or 587
   $mail ->IsHTML(true);
   $mail ->Username = "info@bemoresocial.co.uk";
   $mail ->Password = "#########";
   $mail ->SetFrom("info@bemoresocial.co.uk");
   $mail ->Subject = $mailSub;
   $mail ->Body = $mailMsg;
   $mail ->AddAddress($mailto);

   if(!$mail->Send())
   {
       echo "Something went wrong :(";
   }
   else
   {
       header('Location: ./success.php');
   }
}
mysqli_close($conn);

2 个答案:

答案 0 :(得分:1)

SMTP可能很慢,通常是故意的;它实际上不适合在页面提交处理期间向远程服务器发送电子邮件,因为PHP通常用于。

解决此问题的最佳方法是安装Postfix等本地邮件服务器。向其提交邮件(使用SMTP到localhost)将非常快,然后邮件服务器可以处理较慢的向前传递。这实际上是一个排队系统,但比使用beanstalkd,redis或rabbitmq之类的东西更容易构建自己的队列。

在你的代码中,while循环中的require如果多次循环会导致致命错误,因为你将需要重复使用相同的类文件。要有效地发送给多个收件人,请重用PHPMailer实例 - 您不需要每次在循环中从头开始 - 如果您可以使用keepalive,这也会更快 - 请参阅the mailing list example provided with PHPMailer了解如何这样做。

虽然它不是您所看到的问题的一部分,但我可以看到您的代码基于一个过时的示例,并且您使用旧版本的PHPMailer - 升级到6.0。

答案 1 :(得分:0)

我在运行PHP Mailer时非常慢,遇到了同样的问题,例如3分钟使用网站托管SMTP服务器发送15封电子邮件。
我要做的是在几秒钟内完成切换到gmail smtp。执行此操作时,您需要转到Google并生成应用密码Sign In Using App Password。因此,请在代码中使用普通电子邮件地址和生成的密码(请注意,普通密码仍可用于普通电子邮件访问),并使用tls安全性。 当我将程序从测试转移到生产时,电子邮件失败。我发现我必须去Google并登录,一切都可以再次使用。
还请注意,如果您打开SMTPDebug = 2;它将向您显示每个步骤及其完成时间。

include ('class.PHPMailer.php');
$mail = new PHPMailer(true);                              // Passing `true` enables exceptions
try {
    //Server settings
    $mail->SMTPDebug = 0;    // 0=no output, 1=Commands, 2=Data & Commands, 3=2+connection status 4=Low-Level data 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 = 'mickeymouse@gmail.com'; // SMTP username
    $mail->Password = 'aaaabbbbccccdddd';      // SMTP password (used google Generated app password) 
    $mail->SMTPSecure = 'tls';                 // Enable TLS encryption, `ssl` also accepted
    $mail->Port = 587;                         // TCP port to connect to
//  Recipients
    $i = 0; $address="";

    foreach($recipients as $i => $address)
        {
        $mail->addAddress($address);
        }    
    $mail->addReplyTo('mickeymouse@gmail.com', 'Mickey');
    $mail->isHTML(true);   
    $mail->setFrom('mickeymouse@gmail.com', 'Mickey');// Set email format to HTML
    $mail->Subject = $subject;
    $mail->Body    = $body;
    $mail->send();
    $message = 'Message has been sent';
    } 
    catch (Exception $e) {
        $message = 'Message could not be sent.'."<br>".
         'Mailer Error: ' . $mail->ErrorInfo;
    }