SwiftMailer库表现缓慢

时间:2011-05-23 20:30:47

标签: php email postfix-mta swiftmailer

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

这可能是我的期望太高了,但我的印象是这件事可以把很多电子邮件放入队列FAST,这正是我需要的。所有的速率处理和限制都是在后缀端完成的,因此能够像我的后缀设置一样快速排队它们会很棒。

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

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

从技术上讲它确实有效,但它确实很慢。以每个smtp帐户60 /分钟的速度,每个大约需要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";
        }

1 个答案:

答案 0 :(得分:2)

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

  • 将以下行移至脚本顶部

require_once 'swift/swift_required.php';

  • 使与smtp服务器的连接变得懒惰。 每次要发送电子邮件时都不需要连接。在顶部连接一次并检查连接是否处于活动状态(否则再次连接),发送电子邮件并清除字段{{ 1}},to等...

  • 从顶部的数据库中抓取 smtp 设置,然后移除巨型from。这并不能使代码可读