web-dev-qa-db-fra.com

Envoi d’e-mails en masse avec PHP

Je suis en train d'écrire un blog de musique. L'administrateur publie un nouvel article tous les 2-3 jours. Dès que l'administrateur publie un article, un courrier électronique en masse sera immédiatement envoyé à environ 5 000 abonnés. 

Quel est le meilleur moyen d'implémenter la fonctionnalité de courrier de masse?

La fonction suivante fonctionne-t-elle?

function massmail() 
{
  $content = '...';
  foreach ($recipients as $r) {
    $_content = $content . '<img src="http://xxx/trackOpenRate.php?id='.$r.'">';
    mail($r, 'subject', $_content);
  }
}

Autre question: si les 5 000 abonnés utilisent Yahoo Mail, Yahoo le traitera-t-il comme une attaque DDOS et bloquera-t-il l'adresse IP de mon serveur SMTP?

47
Alan

Tout d’abord, utiliser la fonction mail () fournie avec PHP n’est pas une solution optimale. Il est facilement marqué comme spammé et vous devez configurer un en-tête pour vous assurer que vous envoyez correctement les emails HTML. Pour ce qui est de savoir si l'extrait de code fonctionnera, cela fonctionnerait, mais je doute que le code HTML soit correctement inséré sans en spécifiant des en-têtes supplémentaires

Je vous suggère de consulter SwiftMailer , qui prend en charge HTML, prend en charge différents types de mime et l'authentification SMTP (qui est moins susceptible de marquer votre courrier en tant que spam).

46
Extrakun

Je voudrais insérer tous les courriels dans une base de données (un peu comme une file d’attente), puis les traiter un par un comme vous l’avez fait dans votre code (si vous voulez utiliser swiftmailer ou phpmailer, vous pouvez le faire aussi.)

Après chaque mail envoyé, mettez à jour la base de données pour enregistrer la date/heure d'envoi.

En les mettant d'abord dans la base de données, vous avez 

  1. un enregistrement de qui vous l'avez envoyé à
  2. si votre script expire ou échoue et que vous devez l'exécuter à nouveau, vous ne recevrez pas le même courrier électronique deux fois.
  3. vous pouvez exécuter le processus d'envoi à partir d'un travail cron et effectuer un traitement à la fois, afin que votre serveur de messagerie ne soit pas surchargé et garder une trace de ce qui a été envoyé.

Rappelez-vous comment automatiser les courriels non valides ou invalides pour qu'ils soient automatiquement supprimés de votre liste.

Si vous envoyez autant de courriels, vous êtes tenu d'obtenir quelques rebonds.

30
bumperbox

Ceci est un conseil, pas une réponse: vous utilisez beaucoup mieux un logiciel de liste de diffusion dédié. mailman est un exemple souvent utilisé, mais quelque chose d'aussi simple que mlmmj peut suffire. Envoi de courrier en masse est en réalité une tâche plus difficile qu'il n'y parait. Non seulement vous devez envoyer les mails, vous devez également garder une trace des adresses "mortes" pour éviter que vos mails, ou pire, votre serveur de messagerie, soient marqués comme spam . Vous devez gérer des personnes qui se désabonner pour la même chose raison.

Vous pouvez implémenter ces choses vous-même, mais la gestion des rebonds est un travail difficile et peu gratifiant. L'utilisation d'un gestionnaire de liste de diffusion facilitera grandement les choses.

Pour ce qui est de rendre votre courrier acceptable pour yahoo, c’est tout autre chose. Malgré tous ses défauts, ils semblent mettre beaucoup en stock dans SPF et DomainKey. Vous devrez probablement les implémenter, ce qui nécessitera la coopération de votre administrateur de serveur de messagerie. 

17
Michiel Buddingh

Vous pouvez envisager d'utiliser CRON pour ce type d'opération. Envoyer du courrier en masse en une fois n’est certainement pas bon, il peut être détecté comme spam, ddos, crash de votre serveur, etc. 

CRON pourrait donc être une excellente solution: envoyez 100 mails à la fois, puis attendez quelques minutes, puis 100 prochains, etc.

12
usoban

Non envoyer un courrier électronique à 5 000 personnes à l'aide des outils PHP standard. Vous serez banni par la plupart des FAI en quelques secondes et vous ne le saurez même jamais. Vous devez utiliser un logiciel de listes de diffusion ou un fournisseur de services Email .

9
Nir Levy

Pourquoi n'utilisez-vous pas plutôt phplist ? Il s’appuie également sur PHP Mailer et est utilisé par de nombreux leaders du secteur. Je l'ai utilisé moi-même plusieurs fois pour envoyer des courriers en nombre à mes clients. La chose intéressante à propos de phplist est que vous pouvez limiter vos messages au niveau du domaine, plus un niveau de temps limite. 

Nous avons également utilisé quelques systèmes de capture internes: nous avons poussé notre base d'utilisateurs vers la liste de distribution, puis une entrée cron a déclenché l'envoi d'un courrier donné chaque jour. Les possibilités sont infinies, c'est ce qui est génial avec l'open source! 

8
Conrad

Aussi les paquets de poire:

http://pear.php.net/package/Mail_Mimehttp://pear.php.net/package/Mailhttp: //pear.php net/package/Mail_Queue

sanglot. 

PS: NE PAS utiliser mail () pour envoyer ces 5000 emails. En plus de ce que tout le monde a dit, cela est extrêmement inefficace puisque mail () crée un socket séparé par ensemble de messages, même sur le même MTA. 

4
bucabay

Jetez également un coup d'œil à la classe PHPmailer. PHPMailer

2
Roland

Vous pouvez utiliser swiftmailer pour cela. En utilisant le traitement par lots.

<?php
    $message = Swift_Message::newInstance()
      ->setSubject('Let\'s get together today.')
      ->setFrom(array('[email protected]' => 'From Me'))
      ->setBody('Here is the message itself')
      ->addPart('<b>Test message being sent!!</b>', 'text/html');

    $data = mysql_query('SELECT first, last, email FROM users WHERE is_active=1') or die(mysql_error());
    while($row = mysql_fetch_assoc($data))
    {
       $message->addTo($row['email'], $row['first'] . ' ' . $row['last']);
    }

    $message->batchSend();
?>
0
Krishna Ghodke

Je l'ai déjà fait en utilisant Lotus Notus et PHP. Cette solution fonctionne si vous avez accès au serveur de messagerie ou si vous pouvez demander quelque chose à l'administrateur mail server:

1) Créez un groupe dans le mail server: "Département commercial".
2) Attribuez à la group les comptes dont vous avez besoin pour faire partie du groupe.
3) Attribuez une adresse Internet au groupe: [email protected].
4) Créez votre script PHP en utilisant la fonction mail:
$ to = "[email protected]";
mail ($ to, $ subject, $ message, $ headers);

Cela a fonctionné pour moi et tous les comptes du groupe reçoivent le courrier .

Le meilleur des chances.

0
RGA