2010-12-13 48 views
1

Nous avons une liste de diffusion en pleine expansion à laquelle nous voulons envoyer notre newsletter. En ce moment nous envoyons environ 1200 par jour, mais cela va augmenter un peu. J'ai écrit un script PHP qui s'exécute toutes les demi-heures pour envoyer des emails depuis une file d'attente. Le problème est qu'il est très lent (par exemple pour envoyer 106 emails a pris un total de 74,37 secondes). J'ai dû augmenter le temps d'exécution maximum à 90 secondes pour accommoder cela car il arrivait constamment avant. J'ai vérifié que les requêtes ne sont pas en faute et il semble que ce soit spécifiquement la partie de l'envoi de courrier qui prend tant de temps.Envoi en masse d'e-mails SLOW avec PHP PEAR Mail et ALT-N Mdaemon pro

Comme vous pouvez le voir ci-dessous, j'utilise Mail :: factory ('mail', $ params) et le serveur de messagerie est ALT-N Mdaemon pro pour Windows hébergé sur un autre serveur. En outre, tout en faisant des tests, j'ai constaté qu'aucun d'entre eux n'étaient livrés à des adresses hotmail ou yahoo, même pas considérés comme indésirables.

Est-ce que quelqu'un a une idée de pourquoi cela pourrait se produire?

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

Cela ne résoudra pas votre problème, mais je considérerais l'embauche d'une société de liste de diffusion pour gérer vos emails. Une fois que vous commencez à envoyer des messages de masse vous-même, vous êtes obligé de faire des erreurs. Dans le meilleur des cas, vos utilisateurs obtiennent un mauvais service, dans le pire des cas, votre adresse IP est mise sur liste noire par les fournisseurs de messagerie. – Stephen

+0

Pour réitérer, une entreprise qui se spécialise dans le publipostage sera beaucoup plus efficace et efficace qu'une solution maison. Cela vous libèrera du temps pour travailler sur votre produit ou vos actifs de base. – Stephen

+0

Peut être une option. Comme nous avons déjà un système pour gérer et mettre en file d'attente des courriels, nous chercherions simplement à envoyer des courriels à l'externe. Tout service que vous recommanderiez? J'ai jeté un coup d'oeil à envoyer blaster mais il semble être un remplacement pour le système que nous avons déjà. – Greg

Répondre

0

difficile à dire. Vous devez profiler votre code en utilisant xdebug pour pintpoint fruits suspendus.

Aussi je pense que vous pourriez envisager d'utiliser une file d'attente de messages pour traiter votre email (redis/beanstalkd/gearmand/kestrel) asynchrone ou en utilisant une dépendance tierce comme google app engine qui est très bon marché (0,0001 $ par destinataire/1000 premiers emails par jour gratuit)/fiable. Cela vous coûtera environ 10 cents par jour en considérant votre charge.

+0

Parlez-vous de quelque chose comme ça? http://code.google.com/appengine/docs/python/mail/sendingmail.html. J'utilise déjà une file d'attente de messages personnalisée construite en PHP, la file d'attente elle-même semble bien c'est juste la partie d'envoi. – Greg

+0

C'était exactement ce dont je parlais aussi. Peut-être que le profilage vous donnera un peu plus de perspicacité? – Alfred

0

vous rencontrez un couple de problèmes différents. 1. Pour envoyer beaucoup de courriels, vous avez vraiment besoin d'une file d'attente et de plusieurs serveurs de courrier pour recevoir le courrier de cette file et traiter le courrier à son tour. (round robin style < - ce lien est lié mais pas parfaitement adapté à vos besoins . [C'est assez pour vous aider à démarrer]). 2.) votre courrier ne va probablement pas à Hotmail/Yahoo pour l'une des 2 raisons suivantes. A.) Vous n'avez pas RDNS correctement configuré et lorsque le look de votre IP (du heder) n'est pas mappé directement à votre domaine dans l'en-tête. ou

b.), vous avez déjà été marqué comme un spammeur sur SPAMHAUS ou quel que soit le service de liste noire du jour.