Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[mail] envoi en masse incomplet

15 réponses
Avatar
Pascal PONCET
Bonjour,

Je suis confronté à un problème de gestion des envois en masse d'e-mail,
à savoir que le serveur est dans les choux aux alentours du 2500e e-mail
(pas de message d'erreur, pas de retour HTTP, page blanche et script
arrêté).

J'utilise la classe PHPMailer, avec la méthode d'envoi par défaut
"mail". Les e-mails sont rédigés en HTML. Le site est hébergé en
mutualisé chez OVH.

Ceci étant posé, j'ai pensé à plusieurs solutions mais j'aimerais un
partage d'expérience là-dessus :

1. Augmenter le timeout sur le serveur. Ça parait la solution simple et
idéale, vu que le serveur actuel permet de passer par "set_time_limit".
Le problème, c'est qu'il faut tester cette solution et que c'est très
gênant de balancer 10000 e-mails dans la nature sans savoir ce qu'ils
deviennent (au cas où ça ne fonctionne toujours pas). Et puis je reste
tributaire du paramétrage serveur (un safe-mode et c'est foutu).

2. Créer un fichier d'envoi, comprenant les coordonnées des
destinataires, et découper ce fichier par tranche (de 2000 contacts par
exemple). Puis lancer autant de fois le script qu'il y a de tranches.

3. Créer un fichier d'envoi unique, et gérer un point d'arrêt tous les
2000 contacts. Ça peut se faire simplement en marquant les coordonnées
servies, ou en les effaçant successivement du fichier pour traiter ceux
qui restent.

4. Faire un script qui, après avoir enregistré les coordonnées des
contacts (dans un fichier ou une table BDD), affichera une page WEB qui
va gérer les envois un par un.
Cette page appellera pour chaque contact, en AJAX récursif, un autre
script chargé d'envoyer l'e-mail et de retourner l'identifiant du
contact suivant. Cette page pourrait aussi afficher successivement les
coordonnées des contacts servis, pour suivre les envois en temps réel.

La dernière solution, un peu plus complexe à mettre en œuvre, a
l'avantage de fonctionner à tous les coups et quelque soient les
limitations du serveur.
Elle est aussi très visuelle, car on a jamais d'informations sur ce que
fait le serveur quand on utilise les techniques habituelles.
Par contre, le temps global de traitement risque d'être beaucoup plus
long (jusqu'à 10 fois plus à mon avis). Mais ce n'est pas dramatique
dans mon cas, car sur un maximum de 10000 envois on passerait de 1 à 10
mn de traitement par jour.

Qu'en pensez-vous ?

Cordialement,
Pascal

5 réponses

1 2
Avatar
Pascal PONCET
Anthony a écrit :
êtes vous au courant que le mutualisé, chez OVH, est très restrictif
concernant les mails ? en gros, mauvais hébergeur pour ce type de mailling.



Bonjour,

Oui, il y a certaines restrictions, bien naturelles du reste
(essentiellement anti-spam).
Mais tant que je suis en-dessous des 2500 mails par envoi, je n'ai pas
de problème (et ce depuis plus de 2 ans).
Sauf quand-même le fait que je ne dispose pas des notifications d'erreur
en retour des serveurs destinataires (pas de suivi d'adresses mortes par
ce canal).

Je reste ouvert à d'autres suggestions.
Un hébergeur plus performant, ou spécialisé, pour l'e-mailing ?

Cordialement,
Pascal
Avatar
Thibault
On 12 Feb 2009 11:16:29 GMT, Pascal PONCET wrote:
Thibault a écrit :
La seule partie que je peux diffuser est une version du mailer :

http://pastie.org/386474



Merci, très intéressant (même si je ne maîtrise pas Ruby).

Connais-tu l'équivalent PHP de "dns.getresources" ? (ligne 140)



Visiblement c'est checkdnsrr() mais ça fait longtemps que je ne l'ai
pas utilisée, tu auras aussi besoin en premier de getmxrr() pour obtenir
les MX, checkdnsrr() devrait servir pour les A.

Parce qu'à un moment, j'ai cru que tu avais une liste de paramétrage des
principaux domaines (genre FAI).



Pas sûr d'avoir compris, mais cette « liste » c'est le DNS et c'est
accessible publiquement pour tout le monde (sinon on aurait du mal à
s'échanger du mail ;-). Grosso modo tu fais une requête DNS pour
connaître les MX d'un domaine donné, puis tu les essaye dans l'ordre un
par un.

Un petit exemple en PHP :

--------8<--------
#!/usr/bin/env php
<?php

array_shift($argv);

foreach ($argv as $domain) {
$t_mx = null;
$t_mx_w = null;

if (! getmxrr($domain, $t_mx, $t_mx_w)) {
print "unable to resolve $domain MXnn";
continue;
}

print "$domain MX answer :n";
var_export($t_mx);
print "n";
var_export($t_mx_w);
print "nn";
}

?>
-------->8--------

ce que ça donne :

$ ./get_mx.php free.fr google.com test
free.fr MX answer :
array (
0 => 'mx1.free.fr',
1 => 'mx2.free.fr',
)
array (
0 => 10,
1 => 20,
)

google.com MX answer :
array (
0 => 'smtp1.google.com',
1 => 'smtp2.google.com',
2 => 'smtp3.google.com',
3 => 'smtp4.google.com',
)
array (
0 => 10,
1 => 10,
2 => 10,
3 => 10,
)

unable to resolve test MX


C'est effectivement le dernier point qui me reste, envoyer les mails par
une socket SMTP, donc directement à chaque domaine.

Une précision pour être sûr que j'ai bien compris : tu n'as aucun moyen
de savoir si l'e-mail a été effectivement distribué, ni d'obtenir et de
gérer une notification d'erreur du serveur destinataire ?



Si tu as moyen, mais seulement si c'est toi qui te charges de
délivrer directement le mail au MX, qui te dira de suite s'il le prend,
s'il ne le prend pas, ou s'il faut revenir plus tard et pourquoi (enfin
là faut pas trop rêver les codes et messages d'erreurs sont parfois
cocasses).

Dans le cas où tu utilise mail(), tu peux uniquement savoir si le mail
a bien été ajouté à la queue du MTA local, mais ça ne dit pas ce qu'il
deviendra plus tard (il n'a pas encore été délivré et tu ne sais pas
quand il le sera). Accessoirement je suppose que ça augmentera aussi le
nombre de bounces générés.
Avatar
Patrick Mevzek
Le Thu, 12 Feb 2009 13:58:04 +0000, Thibault a écrit:
Pas sûr d'avoir compris, mais cette « liste » c'est le DNS et c'est
accessible publiquement pour tout le monde (sinon on aurait du mal à
s'échanger du mail ;-). Grosso modo tu fais une requête DNS pour
connaître les MX d'un domaine donné, puis tu les essaye dans l'ordre un
par un.



Sauf que cela ne suffit pas. On peut très bien envoyer un email sur un
domaine n'ayant pas de MX.
C'est le fallback vers les enregistrements A ...

if (! getmxrr($domain, $t_mx, $t_mx_w)) {
print "unable to resolve $domain MXnn";
continue;
}



Cf première note de la documentation de getmxrr :
« Note: Cette fonction ne doit pas être utilisée à des fin de vérification
d'adresses. »

--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co
<http://www.dotandco.net/> <http://www.dotandco.com/>
<http://www.dotandco.net/ressources/icann_registrars/prices>
<http://icann-registrars-life.dotandco.net/>
Avatar
Thibault
On 12 Feb 2009 18:41:11 GMT, Patrick Mevzek wrote:
Le Thu, 12 Feb 2009 13:58:04 +0000, Thibault a écrit:
Pas sûr d'avoir compris, mais cette « liste » c'est le DNS et c'est
accessible publiquement pour tout le monde (sinon on aurait du mal à
s'échanger du mail ;-). Grosso modo tu fais une requête DNS pour
connaître les MX d'un domaine donné, puis tu les essaye dans l'ordre un
par un.



Sauf que cela ne suffit pas. On peut très bien envoyer un email sur un
domaine n'ayant pas de MX.
C'est le fallback vers les enregistrements A ...



Tout à fait, c'est d'ailleurs pour cela que j'ai précisé que la
procédure évoquée (dans le script cité) était très loin d'être en accord
avec les standards couverts. Il y avait aussi les différents timeout pas
du tout respectés, les codes d'erreurs pas forcément bien traités et
plein d'autres choses.

Bref il vaut mieux lire http://tools.ietf.org/html/rfc5321 et non mes
exemples, mais c'est plus long :-)

if (! getmxrr($domain, $t_mx, $t_mx_w)) {
print "unable to resolve $domain MXnn";
continue;
}



Cf première note de la documentation de getmxrr :
« Note: Cette fonction ne doit pas être utilisée à des fin de vérification
d'adresses. »



Ce n'est donc pas en désaccord, car la finalité n'était pas de
vérifier une adresse mail, mais de délivrer un mail :-) Mais on est
d'accord que cela ne fait pas tout comme tu l'as dit (A implicite).
Avatar
Julien Arlandis
Pascal PONCET a écrit :

Qu'en pensez-vous ?

Cordialement,
Pascal



J'en pense que tu gagnerais à passer par un logiciel de mailing, il en
existe de très bons reliés à ODBC pour l'interfaçage avec la base de
données. Vu que tu es sur du mutualisé et que le port mysql est surement
fermé, tu vas importer ta base de données et il te suffira d'importer ta
base dans un fichier csv juste avant l'envoi.
1 2