2

ニュースレターを送信したいメーリング リストが増えています。現在、1日あたり約1200件を送信していますが、これはかなり増加します。キューから電子メールを送信するために 30 分ごとに実行される PHP スクリプトを作成しました。問題は、非常に遅いことです (たとえば、106 通の電子メールを送信するのに合計 74.37 秒かかりました)。以前は常にタイムアウトしていたため、これに対応するために最大実行時間を 90 秒に増やす必要がありました。クエリに問題がないことを確認しましたが、特にメールの送信部分に時間がかかっているようです。

以下に示すように、私は Mail::factory('mail', $params) を使用しており、メール サーバーは別のサーバーでホストされている Windows 用の ALT-N Mdaemon pro です。また、テストを行っているうちに、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

あなたはいくつかの異なる問題に直面しています。

1.) 大量のメールを送信するには、実際にはメーラー キューと、そのキューからメールを取得してメールを順番に処理するための複数のメール サーバーが必要です(ラウンド ロビン スタイル<-- このリンクは関連していますが、ニーズに完全に固有のものではありません。 [始めるには十分です])。

2.) 2 つの理由のいずれかにより、メールが Hotmail/yahoo に届かない可能性があります。

a.) RDNSが適切に構成されておらず、(ヘッダーから) IP を探すときに、ヘッダー内のドメインに正しくマッピングされていません。また

b.)、あなたはすでにSPAMHAUSやブラックリスト サービスでスパマーとしてフラグを立てられています。

于 2010-12-13T22:09:07.043 に答える
0

わかりにくい。xdebugを使用してコードをプロファイリングし、容易に達成できる成果を特定する必要があります。

また、メッセージ キューを使用して電子メール (redis/beanstalkd/gearmand/kestrel) を非同期に処理するか、非常に安価な google app エンジンなどのサードパーティの依存関係を使用することを検討してください (受信者あたり $0.0001/最初の 1000 メール) 1日無料)/安心。負荷を考慮すると、1 日あたり約 10 セントの費用がかかります。

于 2010-12-13T21:58:55.813 に答える