Библиотека SwiftMailer работает медленно - PullRequest
4 голосов
/ 24 мая 2011

Я пытаюсь внедрить swiftmailer в эту почтовую систему.у моего клиента около 300 тыс. активных писем, которые нужно отправлять на регулярной основе.изначально система была настроена на функцию sendmail и php mail ().С тех пор я установил последнюю версию postfix.

, возможно, мои ожидания были слишком высоки, но у меня сложилось впечатление, что эта вещь может поставить много писем в очередь FAST, что и является тем, что янеобходимость.вся обработка и регулирование скорости выполняется на стороне постфикса, поэтому было бы здорово поставить их в очередь так быстро, как мои настройки постфикса.

, хотя я мог бы реализовать методы для вставки контакта непосредственно в очередьЯ бы предпочел ограничить ввод сообщений электронной почты, поступающих в очередь, на основе различных параметров, таких как глобальные скорости отправки для сервера smtp.

приведенный ниже код является просто базовым для тестирования.он просматривает 30 отдельных почтовых учетных записей SMTP, каждая со своими собственными тарифными свойствами.я пытаюсь вытащить максимальное количество писем из дБ на крону, затем отправить все, используя batchsend(), затем перейти к следующей учетной записи 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";
        }

1 Ответ

2 голосов
/ 26 мая 2011

Ваша проблема не в используемой вами библиотеке. Это происходит медленно, потому что вы отправляете большой объем данных на сервер электронной почты ... поэтому postfix пытается обработать все, прежде чем ответить вам. Попробуйте отправить ONE электронное письмо одновременно, не закрывая соединение, чтобы почтовый сервер мог быстрее обрабатывать каждое отправленное вами электронное письмо и быстрее возвращать ответ.

  • переместить следующую строку в начало скрипта

require_once 'swift/swift_required.php';

  • Сделать подключение к серверу smtp ленивым. Вам не нужно подключаться каждый раз, когда вы хотите отправить электронное письмо. Подключитесь один раз вверху и проверьте, живо ли соединение (в противном случае подключитесь снова), отправьте электронное письмо и очистите поля to from и т. Д.

  • возьмите ваши smtp настройки из базы данных вверху, затем удалите гигантский while. Это вовсе не делает код читабельным

...