Отправка массовой электронной почты МЕДЛЕННО с помощью PHP PEAR Mail и ALT-N Mdaemon pro - PullRequest
1 голос
/ 14 декабря 2010

У нас есть растущий список рассылки, в который мы хотим отправить нашу новостную рассылку. На данный момент мы отправляем около 1200 в день, но это немного увеличится. Я написал PHP-скрипт, который запускается каждые полчаса для отправки электронной почты из очереди. Проблема в том, что это очень медленно (например, отправка 106 писем заняла в общей сложности 74,37 секунды). Мне пришлось увеличить максимальное время выполнения до 90 секунд, чтобы приспособиться к этому, поскольку оно постоянно истекало раньше. Я проверил, что запросы не являются ошибочными, и, похоже, это именно та часть отправки почты, которая занимает так много времени.

Как вы можете видеть ниже, я использую Mail :: factory ('mail', $ params) и почтовый сервер ALT-N Mdaemon pro для Windows, размещенный на другом сервере. Кроме того, во время выполнения тестов я обнаружил, что ни один из них не доставлялся на адреса горячей почты или Yahoo, даже не воспринимаясь как мусор.

У кого-нибудь есть идея, почему это может происходить?

    foreach($leads as $k=>$lead){

 $t1->start();

 $job_data = $jobObj->get(array('id'=>$lead['job_id'])); 

 $email = $emailObj->get($job_data['email_id']);


 $message = new Mail_mime();
 //$html = file_get_contents("1032.html");

 //$message->setTXTBody($text);

 $recipient_name = $lead['fname'] . ' ' . $lead['lname'];

 if ($debug){
  $email_address = DEBUG_EXPORT_EMAIL;
 } else {
  $email_address = $lead['email'];
 }
 // Get from job 
 $to   = "$recipient_name <$email_address>";
 //echo $to . " $email_address ".$lead['email']."<br>";

 $message->setHTMLBody($email['content']);

 $options = array();
 $options['head_encoding']  = 'quoted-printable'; 
 $options['text_encoding']  = 'quoted-printable'; 
 $options['html_encoding']  = 'base64'; 
 $options['html_charset']  = 'utf-8'; 
 $options['text_charset']  = 'utf-8'; 

 $body = $message->get($options);

 // Get from email table
 $extraheaders = array(
      "From"  => "Sender <sender@domain.com>", 
      "Subject" => $email['subject']
     );

 $headers = $message->headers($extraheaders);

 $params = array();
 $params["host"]  = "mail.domain.com";
 $params["port"]  = 25;
 $params["auth"]  = false;
 $params["timeout"]  = null;
 $params["debug"]  = true; 

 $smtp = Mail::factory('mail', $params);

 $mail = $smtp->send($to, $headers, $body);



 if (PEAR::isError($mail)) {

    $logObj->insert(array(
   'type'   => 'process_email',
   'message' => 'PEAR Error: '.$mail->getMessage()
   )); 
  $failed++;   
 } else {
  $successful++;
  if (DEBUG) echo("<!-- Message successfully sent! -->");

    // Delete from queue 
    $deleted = $queueObj->deleteById($lead['eq_id']);

    if ($deleted){
     // Add to history
     $history_res = $ehObj->create(array(
        'lead_id' => $lead['lead_id'],
          'job_id' => $lead['job_id']
          )
         );

     if (!$history_res){
    $logObj->insert(array(
     'type'   => 'process_email',
     'message' => 'Error: add to history failed'
     )); 
     }
    } else {
      $logObj->insert(array(
     'type'   => 'process_email',
     'message' => 'Delete from queue failed'
     ));      
    }
 }

 $t1->stop();

}

Ответы [ 2 ]

0 голосов
/ 14 декабря 2010

Вы столкнулись с парой разных проблем.

1.) Для отправки большого количества электронных писем вам действительно нужна очередь почтовой программы и несколько почтовых серверов, чтобы получать почту из этой очереди и обрабатывать почту по очереди (в циклическом режиме <-эта ссылка связана, но не совсем соответствует вашим потребностям. [Достаточно, чтобы начать]].</p>

2.) Ваша почта, вероятно, не попадает в Hotmail / Yahoo по одной из двух причин.

a.) У вас нет RDNS , правильно настроенного, и при поиске вашего IP (из хедера) он не сопоставляется обратно с вашим доменом в заголовке.или

b.), вы уже были помечены как спамер на SPAMHAUS или на любом другом сервисе для внесения в черный список.

0 голосов
/ 14 декабря 2010

сложно сказать.Вы должны профилировать свой код, используя xdebug , чтобы указать на низко висящие фрукты

Также я думаю, что вы могли бы рассмотреть возможность использования очереди сообщений для обработки вашей электронной почты (redis / beanstalkd / gearmand / kestrel) асинхронной или использования сторонней зависимости, как, например, движок приложения Google, который очень дешев (0,0001 доллара США).за получателя / первые 1000 писем в день бесплатно) / надежно.Это будет стоить вам около 10 центов в день при рассмотрении вашей нагрузки.

...