Pourquoi PHP mail retourne false ?

Résolu/Fermé
Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 - 1 avril 2022 à 16:15
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 - 8 avril 2022 à 17:04
Bonjour,

J'envoie un mail aux membres d'une communauté en utilisant php Mail.
Dans la majorité des cas tout fonctionne bien mais parfois la fonction Mail retourne False, je ne parviens pas à savoir pourquoi.
J'ai essayé
$Return = "error_get_last = ".error_get_last();
	var_dump($Return);
mais le résultat est vide, une idée ?

Configuration: Windows / Chrome 99.0.4844.84
A voir également:

28 réponses

yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 Ambassadeur 1 557
1 avril 2022 à 16:49
bonjour,
et, dans ces cas, le mail part bien?
0
Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 9
Modifié le 1 avril 2022 à 17:30
Je ne pense pas, parce que je m'envoie une copie mais ne la reçois pas.
Par contre quand mail() retourne false je m'envoie un mail signalant l'erreur et je le reçois bien.
Sur un total de 1.000 mails j'en ai 50 false.
Voici le code
if (not mail($Mail, $Subject, $Message, $headers))
 {
 $Return = error_get_last();
 $headers = "MIME-Version: 1.0\r\nContent-type:text/html;charset=utf-8\r\nFrom: MailFrom\r\n";
 $Subject=$Subject." Erreur";
 ob_start();
 var_dump($Return);
 $Return=ob_get_clean();
 $Message="<html><body>"error_get_last = ".$Return."</body></html>";

 mail("monadressemail", $Subject, $Message, $headers);
 }
Quand il y a une erreur je reçois
string(17) "error_get_last = "
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
1 avril 2022 à 17:55
N'est-ce pas dommage de ne pas inclure l'adresse email du destinataire dans l'email que tu t'envoies?
0
Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 9
1 avril 2022 à 18:10
Je l'ai dans $Subject
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
1 avril 2022 à 18:22
Et, à partir de là, ne peux-tu pas déterminer d'où vient l'erreur?
S'il s'agit d'une erreur intermittente, peut-être réessayer?
0
Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 9
Modifié le 1 avril 2022 à 18:43
Je pars d'un fichier contenant toutes les adresses mail, le script php envoie le même mail à chaque destinataire, un à la fois, j'en suis à 1.268 pour lesquels mail() a retourné True + 184 pour lesquels il a retourné False.
J'ai essayé d'envoyer le même mail "à la main" (avec Outlook) à un des destinataires qui était en erreur, ça fonctionne.

D'autre part un utilisateur se trouvait 2 fois dans le fichier, php lui a donc envoyé le mail 2 fois (adresse @yahoo.fr) et chaque fois mail() a retourné False, ce n'est donc pas aléatoire, certaines adresses semblent être refusées.

Je ne comprends donc pas pourquoi mail() retourne parfois False, mon code avec error_get_last() n'est-il pas correct ?
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
1 avril 2022 à 19:22
Si j'ai bien lu, error_get_last() n'obtient l'erreur de mail() que sous Windows.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 9
2 avril 2022 à 09:29
error_get_last() et mail() sont des instructions php dont le script tourne sur le serveur; j'ignore si le mien (one.com) tourne sous Windows.
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
2 avril 2022 à 09:39
Bonjour,

La fonction mail est parfois limité chez certains hébergeurs... (nom de mails par heure / par jour .. )
Je pense d'ailleurs que tu ne dois pas être sous windows.. il serait étonnant qu'un hébergeur web n'utilise pas des serveurs linux.

Quoi qu'il en soit, pour éviter ce genre d'aléas (surtout si tu dois envoyer plusieurs centaines/miliers de mails par jour et/ou en même temps) il est préférable de passer par des services tel que mailjet ou sendinblue.
Regarde si leur offre gratuite est suffisante pour ta quantité de mails.

Sinon, tu peux toujours t'orienter vers l'utilisation de la class PHPMailer qui te permettra d'utililiser une boite mail externe (genre gmail ) pour faire tes envois de mail.
Cette class dispose également d'un mode debug pour comprendre les éventuelles erreurs.




0
Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 9
2 avril 2022 à 10:14
Bonjour,
Mon hébergeur limite en effet le débit des mails, je ne me souviens plus de la limite, c'est la raison pour laquelle mon script envoie un mail toutes les 15 secondes soit près de 12 heures pour 2.800 mails ce qui ne me pose pas de problème.
mail() renvoie False de temps en temps, je ne comprends pas pourquoi certains mails sont refusés et pas d'autres.
N'existe-t-il aucun moyen de savoir pourquoi mail() retourne False ?
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
2 avril 2022 à 10:25
Non.
Attention, bien souvent les limites s'appliquent également sur l'ensemble des utilisateurs du serveur
0
Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 9
2 avril 2022 à 10:37
Mon script utilise un fichier input qui contient les adresses mails à envoyer.
Il produit 2 fichiers Output : les adresses pour lesquelles mail() a répondu True et celles pour lesquelles il a répondu False.
Si je copie ce dernier dans le fichier Input, relance la procédure et qu'elles sont toutes refusées je pourrai en conclure que ce sont les adresses mail qui posent problème.
0
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024
2 avril 2022 à 11:48
Bonjour.
Il faudrait demander auprès d'un technicien de ton serveur quelles sont les limites d'envois d'e-mails?
Car pour de grosses quantités d'envois il serait préférable d'utiliser des serveurs dédiés pour cela.
0
Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 9
Modifié le 2 avril 2022 à 12:54
Je ne crois pas trop à cette histoire de limite parce que logiquement il accepterait un certain nombre de mails puis refuserait tous les suivants.
Par contre j'ai regardé les adresses pour lesquelles mail() retourne False.
Hier j'ai envoyé 2.831 mails; 357 (13%) ont été refusés, je les ai envoyés à nouveau : 147 (41%) ont été refusés.
D'une part tous les mails refusés hier ne le sont plus aujourd'hui mais surtout sur 147 refusés 120 (82%) sont pour Yahoo (ou Ymail ou Rocketmail) et 27 pour AOL.
Tous les Yahoo ne sont pas refusés mais sur 210 acceptés seulement 4 sont pour Yahoo, aucun pour AOL.

J'ai donc regardé mon mailing d'hier : sur 2.831 mails tous les AOL ont été refusés et seuls 27 Yahoo sur 124 ont été acceptés.

Mon serveur refuse donc tous les mail de AOL ainsi que la plupart de ceux pour Yahoo.
Que peut-on en déduire ?
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
2 avril 2022 à 16:57
on peut en déduire qu'il faut passer par un service tel que mailjet au Sendinblu pour éviter la ces problèmes ..
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
2 avril 2022 à 17:38
Je ne sais pas trop précisément comment fonctionne mail().
Je peux imaginer que, pour chaque envoi de message, il transfère directement le message au serveur de messagerie destinataire.
Donc, pour un mail destiné à une adresse AOL, il contacte le serveur de messagerie de AOL. Si le serveur de AOL est en panne, ou ne fait pas confiance à ton hébergeur, cela coince.

D'où les deux solutions suggérées par Jordane en #9.
Elles évitent aussi bien les soucis de disponibilité du serveur de messagerie du destinataire que les soucis de confiance.
0
Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 9
2 avril 2022 à 17:04
Bof, la dernière fois que j'ai fait ça c'était en 2019, je n'ai pas trop envie de m'investir pour si peu.
Cette fois sur 2.831 mails 147 n'ont pas été envoyés ce qui fait 95% de réussite, ça me suffit.
J'aurais seulement voulu comprendre pourquoi parfois mail() retourne False.
0
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024
2 avril 2022 à 17:16
"Mon hébergeur limite en effet le débit des mails, je ne me souviens plus de la limite, c'est la raison pour laquelle mon script envoie un mail toutes les 15 secondes soit près de 12 heures pour 2.800 mails ce qui ne me pose pas de problème. "
Cette phrase démontre qu'il y a un problème avec ton serveur distant.
0
Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 9
2 avril 2022 à 18:03
La prochaine fois, dans quelques années ;-) j'essaierai peut-être PHPMailer.
J'ai trouvé plusieurs tuto, ça n'a pas l'air bien compliqué, par exemple
https://help.adk-media.com/utiliser-classe-php-mailer-pour-envoi-emails-smtp.html
Ce que je n'ai pas compris dans l'exemple donné : faut-il utiliser tout le code pour chaque destinataire ?
Ou comme le laisserait penser ces 2 instructions
$mail->addAddress('To1@example.net', 'Karim User'); // Ajouter le destinataire
$mail->addAddress('To2@example.com'); 
ajouter une ligne par destinataire ?

Est-il possible de donner un fichier des adresses des destinataires et, si oui, comment ?
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
2 avril 2022 à 18:18
L'exemple montre l'envoi d'un message à deux destinataires. Dans ce cas-là, cela n'a pas de sens d'utiliser tout le code pour chaque destinataire.

Si tu veux utiliser un fichier, à toi de le lire dans ton code PHP.

Si tu veux envoyer le même message à un groupe de destinataires, tu pourrais envoyer un message par 50 destinataires, en les mettant en bcc, afin d'éviter que les adresses soient visibles par tous.
0
Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 9
2 avril 2022 à 18:32
En effet, je pourrais lire le fichier et faire
$mail->addBCC('bcc@example.com');
pour chaque adresse.
Y a-t-il une limite au nombre de destinataires ?

Cependant je veux personnaliser les mails en commençant le texte par par "Bonjour prénom,"
Dans ce cas je pense que je dois faire une boucle sur tout ce code
lire une ligne du fichier
$mail = new PHPMailer(True);
$mail->isSMTP(); // Paramétrer le Mailer pour utiliser SMTP 
$mail->Host = 'mail.votredomaine.com'; // Spécifier le serveur SMTP
$mail->SMTPAuth = true; // Activer authentication SMTP
$mail->Username = 'user@votredomaine.com'; // Votre adresse email d'envoi
$mail->Password = 'secret'; // Le mot de passe de cette adresse email
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; // Accepter SSL
$mail->Port = 465;

$mail->setFrom('from@example.com', 'Mailer'); // Personnaliser l'envoyeur
$mail->addAddress('To1@example.net', 'Karim User'); // Ajouter le destinataire
$mail->addAddress('To2@example.com'); 
$mail->addReplyTo('info@example.com', 'Information'); // L'adresse de réponse
$mail->addCC('cc@example.com');
$mail->addBCC('bcc@example.com');

$mail->addAttachment('/var/tmp/file.tar.gz'); // Ajouter un attachement
$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); 
$mail->isHTML(true); // Paramétrer le format des emails en HTML ou non

$mail->Subject = 'Here is the subject';
$mail->Body = 'This is the HTML message body';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
if($mail->send()) {
   écrire dans le fichier des mails OK
} else {
   écrire dans le fichier des mails en erreur : comment savoir quelle erreur ?
}
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
2 avril 2022 à 18:40
Il faut choisir, en effet, envoyer un mail commun à tous ou envoyer un mail personnalisé à chacun.
0
Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 9
2 avril 2022 à 18:45
Oui, OK, mais sir $mail->send() ne fonctionne pas comment savoir pourquoi ?
C'est la même question qu'avec php mail().
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
2 avril 2022 à 19:29
D'une part, phpmailer, en fonction d'options que tu peux ajuster, peut afficher les erreurs qu'il rencontre.
D'autre part, tu peux utiliser try/catch, la méthode classique en PHP pour intercepter et analyser les erreurs.
0
Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 9
5 avril 2022 à 10:46
try/catch sert à intercepter les erreurs php : il n'y a pas d'erreur.
L'appel à mail() peur retourner True ou False auquel cas il ne s'agit pas d'une erreur php.
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
5 avril 2022 à 14:23
Il s'agit de phpmailer, pas de mail().
0
Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 9
Modifié le 6 avril 2022 à 13:52
Bonjour,
J'ai essayé avec PHPmailer comme ceci
try {
// remplir les paramètres
    $mail->send();
    echo 'Sent';
} catch (Exception $e) {
    echo "Mailer Error: {$mail->ErrorInfo}";
}


Sur 129 adresses qui ont été refusées hier 55 sont bien envoyés, toutes les autres donnent ceci

Mailer Error: SMTP Error: data not accepted.SMTP server error: DATA END command failed Detail: Message rejected due to content policy (b46c9336-b596-11ec-a9ea-d0431ea8a29d) YRPD
SMTP code: 550 Additional SMTP info: 5.7.1

550 = Spam !
Bizarrement quelques uns sont acceptés puis quelques uns sont refusés, quelques uns acceptés et ainsi de suite.
"Quelques uns" semble être un nombre aléatoire.
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
6 avril 2022 à 15:18
Eh bien, tu as maintenant la réponse à ta question.
0
Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 9
Modifié le 6 avril 2022 à 15:21
Pas vraiment : pourquoi Yahoo retourne parfois Spam parfois pas ?
Que puis-je faire pour que mes mails ne soient pas parfois considérés comme spam ?
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
Modifié le 6 avril 2022 à 15:53
Yahoo se méfie, comment obtenir sa confiance sans passer par des services tel que mailjet ou sendinblue?

Peux-tu confirmer que tu as appliqué la suggestion que nous t'avons faite et répétée:
l'utilisation de la class PHPMailer qui te permettra d'utililiser une boite mail externe (genre gmail ) pour faire tes envois de mail?

Sois conscient que ton mail, bien qu'accepté, peut ensuite être présenté comme spam au destinataire.
0
Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 9
Modifié le 6 avril 2022 à 16:11
J'ai utilisé PHPMailer avec comme expéditeur mon adresse mail sur mon serveur.
J'envoie un mail toutes les 15 secondes.
Ce que je ne comprends pas c'est pourquoi parfois il répond OK parfois pas de façon a priori aléatoire
yahoo.com OK
yahoo.fr OK
yahoo.com Nok
yahoo.fr OK
yahoo.fr OK
yahoo.fr OK
yahoo.fr OK
ymail.com OK
yahoo.fr OK
yahoo.fr OK
yahoo.fr Nok
yahoo.fr Nok
yahoo.fr Nok

yahoo.fr OK
yahoo.com OK
yahoo.fr Nok
yahoo.fr OK
yahoo.fr OK
yahoo.Fr Nok
yahoo.fr Nok
yahoo.fr Nok

yahoo.com OK
ymail.com Nok
aol.com OK
aol.com Nok
yahoo.com Nok

yahoo.fr OK
yahoo.fr OK
yahoo.fr Nok
yahoo.fr Nok

...
Je serais curieux de voir ce qu'il se passe si je renvoie les NOK.
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
6 avril 2022 à 16:20
Tu n'as donc pas appliqué la suggestion. As-tu essayé de la comprendre?
0
Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 9
Modifié le 6 avril 2022 à 16:31
Je ne comprends pas pourquoi une adresse MailFrom Gmail serait toujours acceptée et pas toujours celle associée à mon hébergeur : explique.

Je viens d'essayer d'envoyer les 74 derniers messages refusés : ils ont tous été refusés !
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
6 avril 2022 à 19:28
Peut-être que Yahoo fait plus confiance à Google qu'à ton hébergeur.
Tu nous demandes de l'aide et tu ne fais pas confiance en nos conseils: explique.
0