2010-12-13 10 views
1

Wir haben eine wachsende Mailingliste, an die wir unseren Newsletter senden möchten. Im Moment senden wir ungefähr 1200 pro Tag, aber das wird sich ziemlich erhöhen. Ich habe ein PHP-Skript geschrieben, das jede halbe Stunde läuft, um E-Mails aus einer Warteschlange zu senden. Das Problem ist, dass es sehr langsam ist (zum Beispiel, um 106 E-Mails zu senden dauerte insgesamt 74,37 Sekunden). Ich musste die maximale Ausführungszeit auf 90 Sekunden erhöhen, um dem entgegenzukommen, da es sich zuvor ständig abgeschaltet hatte. Ich habe überprüft, dass die Abfragen nicht fehlerhaft sind und es scheint speziell der sendende Mail-Teil zu sein, der so lange dauert.Senden von Massen-E-Mails SLOW mit PHP PEAR Mail und ALT-N Mdaemon pro

Wie Sie unten sehen können, verwende ich Mail :: factory ('mail', $ params) und der E-Mail-Server ist ALT-N Mdaemon pro für Windows gehostet auf einem anderen Server. Während ich Tests durchführte, stellte ich fest, dass niemand an Hotmail- oder Yahoo-Adressen geliefert wurde und nicht einmal als Müll aufgenommen wurde.

Hat jemand eine Idee, warum das passieren könnte?

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 <[email protected]>", 
     "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(); 

} 
+0

Dies löst Ihr Problem nicht, aber ich würde erwägen, eine Mailingliste Firma zu mieten, um Ihre E-Mails zu verwalten. Sobald Sie selbst Massenmails verschicken, sind Sie verpflichtet, Fehler zu machen. Im besten Fall erhalten Ihre Nutzer einen schlechten Service, schlimmstenfalls wird Ihre IP von den Mail-Anbietern auf die schwarze Liste gesetzt. – Stephen

+0

Um noch einmal zu betonen, ein Unternehmen, das auf Massenversand spezialisiert ist, wird weitaus effizienter und effektiver sein als eine selbst gezüchtete Lösung. Dadurch haben Sie mehr Zeit für die Arbeit an Ihrem Kernprodukt oder Ihren Kernprodukten. – Stephen

+0

Könnte eine Option sein. Da wir bereits ein System zum Verwalten und Einreihen von E-Mails haben, würden wir nur versuchen, E-Mails extern zu versenden. Jeder Service, den Sie empfehlen würden? Ich habe Send blaster gesehen, aber es scheint ein Ersatz für das System zu sein, das wir bereits haben. – Greg

Antwort

0

schwer zu sagen. Sie sollten Ihren Code profilieren, indem Sie xdebug verwenden, um niedrig hängende Früchte zu pintpoint.

Auch ich denke, dass Sie möglicherweise eine Nachrichtenwarteschlange verwenden, um Ihre E-Mail (redis/beanstalkd/gearmand/Turmfalke) asynchron oder mit Abhängigkeit von Drittanbietern wie zum Beispiel google app engine, die sehr billig ist (0,0001 $ pro Empfänger/erste 1000 E-Mails pro Tag frei)/zuverlässig. Das kostet Sie ungefähr 10 Cent pro Tag, wenn Sie Ihre Ladung betrachten.

+0

Beziehen Sie sich auf so etwas? http://code.google.com/appengine/docs/python/mail/sendingmail.html. Ich benutze bereits eine benutzerdefinierte Nachrichtenwarteschlange in PHP, die Warteschlange selbst scheint in Ordnung, es ist nur der sendende Teil. – Greg

+0

Genau das meinte ich auch. Vielleicht gibt Ihnen das Profiling ein bisschen mehr Einblick? – Alfred

0

Sie stehen vor ein paar verschiedenen Problemen.

1.) Um viele E-Mails zu versenden, benötigen Sie eine Mailer-Warteschlange und mehrere Mailserver, um E-Mails aus dieser Warteschlange zu erhalten und die E-Mails zu verarbeiten (round robin style < - dieser Link ist verwandt, aber nicht perfekt auf Ihre Bedürfnisse zugeschnitten . [Es ist genug, um dich zu beginnen]).

2.) Ihre E-Mail wird aus einem von zwei Gründen wahrscheinlich nicht zu Hotmail/yahoo gelangen.

a.) Sie haben RDNS nicht ordnungsgemäß konfiguriert und wenn die Suche nach Ihrer IP (von der Heder) es nicht zurück zu Ihrer Domäne in der Kopfzeile Zuordnung zugeordnet ist. oder

b.), Sie wurden bereits als Spammer auf SPAMHAUS oder was auch immer der Blacklisting-Dienst du jour ist gekennzeichnet.