gpt4 book ai didi

php - SwiftMailer 库执行缓慢

转载 作者:可可西里 更新时间:2023-10-31 23:34:26 27 4
gpt4 key购买 nike

我正在尝试将 swiftmailer 实现到这个邮件系统中。我的客户有大约 30 万封事件电子邮件需要半定期发送。该系统最初是为 sendmail 和 php 的 mail() 函数配置的。我已经安装了最新版本的 postfix。

可能是我的期望太高了,但我的印象是这个东西可以快速将大量电子邮件放入队列,这正是我所需要的。所有速率处理和节流都是在后缀端完成的,因此能够以我的后缀设置可以处理的速度对它们进行排队会很棒。

虽然我可以实现将联系人直接插入队列的方法,但我宁愿根据各种选项(例如 smtp 服务器的全局发送速率)限制进入队列的电子邮件输入。

下面的代码只是一些基本的测试。它遍历 30 个独立的邮件 smtp 帐户,每个帐户都有自己的费率属性。我试图从每个 cron 的数据库中提取最大数量的电子邮件,然后使用 batchsend() 发送所有邮件,然后循环到下一个 smtp 帐户,发送最大数量,等等。

从技术上讲它确实有效,但它真的很慢。以每个 smtp 帐户 60/分钟的速度,每个 smtp 帐户大约需要 15-20 秒,这显然是行不通的,而且完全不是我所期望的。

为什么发送这么慢有什么明显的原因吗? smtp 服务器看起来很好,没有重载或类似的情况。没有后缀错误,没有什么明显的。

一旦电子邮件进入队列,我就让 postfix 工作,这很神奇。以合理的速度将其放入队列变得困难。我知道 swiftmailer 是解决我所有问题的神奇解决方案,但我确信它的发送速度应该比现在快。有什么想法或建议吗?

$query = "SELECT * FROM `smtp`";
$result = mysql_query($query) or die(mysql_error());
$num_rows1 = mysql_num_rows($result);
while($row = mysql_fetch_array($result)){
$smtp = $row['ip'];
$login = $row['user'];
$pass = $row['pass'];
$smtp_domain = $row['domain'];

$querya = "SELECT * FROM `mailer_lists` ml JOIN `mailer_controller` mc ON ml.project_name = mc.project_name LIMIT ".$global_limit."";
$resulta = mysql_query($querya) or die(mysql_error());
$num_rows2 = mysql_num_rows($resulta);

// quickly check if any mail returned query
if ($num_rows2 < 1){
mysql_close($connection);
echo "Nothing to mail... \n";
die();
}

while($rowa = mysql_fetch_array($resulta)){
$email[] = $rowa['email'];
$project_name = $rowa['project_name'];
$from_name = $rowa['from_name'];
$subject = $rowa['subject'];
$body = $rowa['body'];
$from = array($spun_from_email => $spun_from_name);
}

require_once 'swift/swift_required.php';
$transport = Swift_SmtpTransport::newInstance(''.$smtp.'', 25)
->setUsername($login)
->setPassword($pass)
;
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance()
->setSubject($subject)
->setFrom($from)
// ->addPart('add part message', 'text/html')
// ->attach(Swift_Attachment::fromPath(''))
->setTo($email)
->setBody($body)
;
$mailout = $mailer->batchSend($message);
// ->addPart('add part message', 'text/html')
// ->attach(Swift_Attachment::fromPath(''))
;


$queryb = "DELETE FROM `mailer_lists` WHERE `project_name` = '".$project_name."' AND `email` = '".implode('\' OR `email` = \'',$email)."'";
$resultb = mysql_query($queryb) or die(mysql_error());
$c++;
echo "sent $num_rows1 emails to smtp $c \n";
}

最佳答案

您的问题不是您正在使用的库。这很慢,因为您正在向电子邮件服务器发送大量数据……所以 postfix 会在回复您之前尝试处理所有数据。尝试在不关闭连接的情况下一次发送 ONE 封电子邮件,这样电子邮件服务器就可以更快地处理您发送给它的每封电子邮件,也可以更快地返回答复。

  • 将以下行移到脚本的顶部

require_once 'swift/swift_required.php';

  • 延迟连接到 smtp 服务器。 您不需要每次发送电子邮件时都连接。在顶部连接一次并检查连接是否有效(否则再次连接),发送电子邮件并清除字段等...

  • 从顶部的数据库中获取您的 smtp 设置,然后删除巨大的 while。这根本无法使代码可读

关于php - SwiftMailer 库执行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6102675/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com