PHPMailer发送电子邮件的速度非常慢

PHPMailer发送电子邮件的速度非常慢,php,phpmailer,Php,Phpmailer,我有一个在PHP 7.2上用PHPMailer发送电子邮件的应用程序,我必须发送大约50封电子邮件,它需要大约40秒来完成,我认为这是很多的,因为根据文档,它可以在一秒钟内发送多达300封电子邮件。我尝试了本地电子邮件服务器和谷歌SMTP服务(这是我们需要的,因为它将使用GSuite电子邮件作为发件人)。函数接收一个包含每个客户所需数据的数组,但我在循环之外创建smtp对象及其配置,对于每个客户执行一次的唯一方法是send(),如果我对该行进行注释,则完成该行所需的时间不到1秒,因此连接不会延迟

我有一个在PHP 7.2上用PHPMailer发送电子邮件的应用程序,我必须发送大约50封电子邮件,它需要大约40秒来完成,我认为这是很多的,因为根据文档,它可以在一秒钟内发送多达300封电子邮件。我尝试了本地电子邮件服务器和谷歌SMTP服务(这是我们需要的,因为它将使用GSuite电子邮件作为发件人)。函数接收一个包含每个客户所需数据的数组,但我在循环之外创建smtp对象及其配置,对于每个客户执行一次的唯一方法是send(),如果我对该行进行注释,则完成该行所需的时间不到1秒,因此连接不会延迟执行,而是send()它本身有什么我做得不对的吗?我对这个库没有太多的经验,这是基于基本示例的,所以我不确定是否有任何配置可以添加或更改以加快速度

公共静态函数ejecutarEnvio($datosCorreo){
试一试{
$mail=新的PHPMailer(true);
//西翁将军
$mail->SMTPDebug=SMTP::调试服务器;
$mail->isSMTP();
$mail->CharSet='utf-8';
$mail->Host=$\u会话[“smtp\u主机”];
$mail->Username=$\u会话[“smtp\u用户”];
$mail->Password=$\u会话[“smtp\u传递”];
$mail->Port=$\u会话[“smtp\u端口];
如果($\会话[“smtp\U安全”]=“TLS”)
$mail->SMTPSecure=PHPMailer::ENCRYPTION\u STARTTLS;
elseif($\u会话[“smtp\u安全”]=“SSL”)
$mail->SMTPSecure=PHPMailer::ENCRYPTION\u SMTPS;
$mail->SMTPAuth=true;
$mail->SMTPKeepAlive=true;
$mail->isHTML(true);
$mail->setFrom($会话[“无回复”],$会话[“无回复名称”]);
//环境独立
对于($i=0;$iaddAddress(trim($datos['destinatario1']);
如果(过滤变量(trim($datos['Destination2']),过滤验证电子邮件))
$mail->addCC(trim($datos['destinatario2']);
如果(过滤变量(trim($datos['Destination3']),过滤验证电子邮件))
$mail->addCC(trim($datos['destinatario3']);
$mail->addReplyTo($datos['replyto']);
$mail->Subject=$datos['titulo'];
$mail->Body=$datos['mensaje'];
//这是柬埔寨的一个村庄
试一试{
//如果你想让科雷奥的环境变得更好,那么你就必须尝试独立,以实现真正的目标
如果($mail->send())
$datosCorreo[$i]['mensaje_correo']=”;
其他的
抛出新异常(“Error enviando el correo.”.$mail->ErrorInfo);
}捕获(例外$e){
$datosCorreo[$i]['mensaje_correo']=$e->getMessage();
}
$mail->clearAddresses();
}
$mail->SmtpClose();
}捕获(例外$e){
对于($i=0;$igetMessage();;
}
}
返回$datosCorreo;
} 

谢谢你的帮助

PHPMailer wiki具有广泛的功能,这里提供了一个示例来演示

最重要的不是每次都创建一个新实例,而是重新使用一个实例,这允许您启用SMTP keepalive

$mail->SMTPKeepAlive = true;
我可以看到你在这里这么做,但是你还可以做一些其他的事情。通过SMTP发送到localhost时,您不需要使用身份验证或加密,因此可以禁用这些功能:

$mail->SMTPAuth = false;
$mail->SMTPSecure = false;
$mail->SMTPAutoTLS = false;
这将消除几次往返

之所以要花时间发送
send
,是因为PHPMailer在这之前几乎什么都不做——其他一切都已经设置好了

您正在验证循环中的电子邮件地址-
addAddress()
addCC
已经这样做了,因此您正在重复工作;改为检查它们的返回值,并
继续
,或者如果地址不正确,则忽略

这种结构是多余的:

    try {
      // intento hacer el envio del correo, lo hago dentro de un try independiente para que solo afecte al objeto actual
      if ($mail->send())
        $datosCorreo[$i]['mensaje_correo'] = "";
      else 
        throw new Exception("Error enviando el correo. " . $mail->ErrorInfo);
    } catch (Exception $e) {
      $datosCorreo[$i]['mensaje_correo'] = $e->getMessage();
    }
您可以将其简化为这一点,因为您已经要求PHPMailer在出错时抛出异常(通过将
true
传递给构造函数),因此它永远不会达到您抛出自己异常的程度:

    try {
        $mail->send();
        // intento hacer el envio del correo, lo hago dentro de un try independiente para que solo afecte al objeto actual
        $datosCorreo[$i]['mensaje_correo'] = "";
    } catch (Exception $e) {
        $datosCorreo[$i]['mensaje_correo'] = $e->getMessage();
    }
像这样,我每秒发送数百封邮件没有问题,任何一个像样的本地邮件服务器都应该能够每秒处理数千封邮件,所以这不应该是原因——但你应该检查一下


为了找出任何代码中的瓶颈,我建议在IDE中使用探查器,而不是随机计时调用;它会立即告诉您问题所在。xdebug和qcachegrind或PHPStorm在这方面效果非常好。

我怀疑您是否能够改进这一点,因为您正在将邮件转储到谷歌的基础设施。尝试将SMTPDebug设置为3甚至4,然后看看是否有什么东西突然出现。我不得不在一个项目中注入我自己的时间安排声明,在这个项目中,我们通过第三方MTA发送邮件时遇到了无法解释的问题。谢谢,我会这样做的,我不明白的是,为什么本地邮件服务器的时间相同,甚至有点慢。如果无法解决,我认为最好的方法是通过Ajax运行电子邮件服务。。。