2

我们有一个不断增长的邮件列表,我们希望将我们的时事通讯发送到该列表。目前我们每天发送大约 1200 个,但这会增加很多。我编写了一个 PHP 脚本,它每半小时运行一次以从队列中发送电子邮件。问题是它非常慢(例如发送 106 封电子邮件总共需要 74.37 秒)。我不得不将最大执行时间增加到 90 秒以适应这种情况,因为它之前经常超时。我已经检查过查询没有错误,而且似乎特别是发送邮件的部分花费了很长时间。

正如您在下面看到的,我正在使用 Mail::factory('mail', $params) 并且电子邮件服务器是托管在另一台服务器上的 ALT-N Mdaemon pro for Windows。此外,在进行测试时,我发现没有一个邮件被发送到 hotmail 或 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();

}
4

2 回答 2

0

很难说。您应该使用xdebug分析您的代码,以找出低悬的果实。

另外我认为您可能会考虑使用消息队列来异步处理您的电子邮件(redis/beanstalkd/gearmand/kestrel)或使用第三方依赖项,例如非常便宜的谷歌应用程序引擎(每个收件人 0.0001 美元/前 1000 封电子邮件一天免费)/可靠。考虑到您的负载,这将花费您每天大约 10 美分。

于 2010-12-13T21:58:55.813 回答
0

你面临着几个不同的问题。

1.)要发送大量电子邮件,您确实需要一个邮件队列和多个邮件服务器来从该队列获取邮件并依次处理邮件(循环样式<--此链接与您的需求相关但并不完全特定于您的需求。 [这足以让你开始])。

2.) 您的邮件可能无法到达 Hotmail/yahoo,原因有两个。

a.)您没有正确配置RDNS,并且当查找您的 IP(从 heder)时,它没有在标头中映射回您的域。或者

b.),您已经在SPAMHAUS或任何黑名单服务 du jour 上被标记为垃圾邮件发送者。

于 2010-12-13T22:09:07.043 回答