Pourquoi PHP mail retourne false ?
RésoluJ'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 ?
28 réponses
La problématique centrale est que la fonction mail() en PHP retourne parfois false lors de l’envoi de mails à une communauté, alors que le reste des envois fonctionne. Des réponses suggèrent d’utiliser PHPMailer pour diagnostiquer et contourner les limitations, et d’opter pour un service externe (MailJet ou SendinBlue) lorsque l’hébergeur bloque l’envoi via une adresse mail interne. La meilleure réponse préconise PHPMailer pour obtenir des indications lorsque l’envoi échoue et signale que l’hébergeur peut bloquer l’utilisation d’adresses externes comme Gmail, limitant ainsi les tests. En cas de besoin, des limites techniques côté serveur ou des filtres anti-spam peuvent expliquer des échecs sporadiques et nécessiter une solution externalisée ou une configuration SMTP adaptée.
-
Merci à vous deux.
-
Merci mais c'est la syntaxe que je ne comprends pas.
Que représentent les 3 PHPMailer dansuse PHPMailer\PHPMailer\PHPMailer;
-
-
Le 3e PHPMailer correspond à la classe du même nom.
Cette classe est définie dans l'espace de nom PHPMailer\PHPMailer, voir au début de la classe :namespace PHPMailer\PHPMailer;
https://github.com/PHPMailer/PHPMailer/blob/master/src/PHPMailer.php
Le fait que l'espace de nom soit PHPMailer\PHPMailer est un choix arbitraire du développeur, on pourrais utiliser un autre nom. Par convention, le premier fragment correspond à l'auteur (qui se nomme PHPMailer), le second fragment correspond au nom du projet (même nom).
Pour utiliser cette classe, il faut donc faire un "use" en indiquant l'espace de nom puis le nom de la classe.
Autre exemple, si on veux utiliser la classe DKIM proposé sur un autre projet du même auteur :
https://github.com/PHPMailer/DKIMValidator/blob/main/src/DKIM.php
Puisque l'espace de nom de cette classe est PHPMailer\DKIMValidator, afin d'utiliser cette classe il faudra donc faire un use PHPMailer\DKIMValidator\DKIM; -
Contributeur@PitetJe pense qu'on peut se passer du use, et faire
$mail = new PHPMailer\PHPMailer\PHPMailer(true);
ou bien, avec un use:use PHPMailer\PHPMailer\PHPMailer as zorglub; $mail = new zorglub(true);
use PHPMailer\PHPMailer\PHPMailer;
est équivalent à:use PHPMailer\PHPMailer\PHPMailer as PHPMailer;
-
-
Puisque j'ai eu réponse à ma question (dans le titre), c'est fait.
Question hors sujet à propos de PHPMaileruse PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; include 'PHPMailer/src/PHPMailer.php'; include 'PHPMailer/src/SMTP.php'; include 'PHPMailer/src/Exception.php';
J'ai un répertoire 'PHPMailer' qui contient un sous-répertoire 'src' qui contient les 3 fichiers .php, je comprends bien les 'include'.
Par contre je ne comprends pas les instructions 'use' : si quelqu'un pouvait m'expliquer la syntaxe, je ne trouve pas sur Internet.
Merci-
Bonjour,
Cette syntaxe fait partie des espaces de nom (namespaces) :
https://www.php.net/manual/fr/language.namespaces.php
-
-
Avec mail() de temps en temps ça ne fonctionnait pas, je ne savais pas pourquoi; j'ai passé pas mal de temps à convertir le processus avec PHPMailer : c'est la même chose sauf que, quand ça ne fonctionne pas, je sais pourquoi; mon hébergeur ne me permet pas d'utiliser une adresse mail externe comme Gmail; j'ai essayé de m'inscrire sur MailJet (max 200 mails par jour en version gratuite) mais je ne reçois pas le mail de confirmation; je ne vais pas recommencer en VBA, j'arrête les frais.
Si dans quelques mois il me prends l'envie d'envoyer un paquet de mails je le ferai avec PHPMailer et l'adresse mail associée à mon espace web.
Encore merci à tous. -
Je vais donc continuer avec l'adresse mail associée à mon espace web, merci pour votre aide concernant l'utilisation de PHPMail.
Par définition Spam = email indésirable non sollicité.
Je propose un logiciel gratuit, les utilisateurs qui me communiquent leur adresse mail acceptent de recevoir des infos concernant ce logiciel, ces envois sont rares : la dernière fois fin 2019.
Ils peuvent d'ailleurs se désinscrire : ci-dessous exemple de mail
A mon sens il ne s'agit donc pas de Spam et il n'y a que Yahoo qui bloque : comment le lui faire comprendre ?
Objet : RV Reef Tools pour Hervé
Bonjour Hervé,
Vous recevez ce mail parce que vous utilisez les logiciels RV Reef Tools
Si ce n'est déjà fait ne manquez pas de rejoindre notre communauté de récifalistes sur Le Forum Récifal .
Ce forum vous permettra de poser des questions et/ou de répondre à d'autres amateurs d'aquariums récifaux.
Bienvenue sur Le Forum Récifal
Si vous ne souhaitez plus recevoir de mail concernant RVRT répondez-y par 'Désinscrire' sans modifier le titre !-
ContributeurJe ne doute pas de tes bonnes intentions.
Vu de Yahoo, il est difficile de deviner tes intentions, ton comportement ressemble probablement à celui d'un spammeur.
C'est le métier de services tel que mailjet ou sendinblue, de faire ce genre d'envois sans être suspecté.
Tu avais mentionné Outlook. Si tu utilises le logiciel Outlook de Microsoft, je pense que tu peux, via VBA, automatiser l'envoi de mails.
-
-
6 avril 2022 à 19:33
Peut-être ton hébergeur bloque-t-il cette communication 'smtp.gmail.com:465).
Que fait-on alors ?
Y a-t-il un intérêt à persister avec gmail puisqu'avec l'adresse mail associée à mon espace web ça fonctionne ? -
J'ai essayé d'appeler mon script ci-dessus (Debug activé) à partir d'un navigateur.
J'obtiens
2022-04-07 08:15:31 SMTP ERROR: Failed to connect to server: Network is unreachable (101)
SMTP Error: Could not connect to SMTP host.
Fatal error: Uncaught PHPMailer\PHPMailer\Exception: SMTP Error: Could not connect to SMTP host. in /customers/e/a/4/XXXXX.XX/httpd.www/PHPMailer/src/PHPMailer.php:2198 Stack trace: #0 /customers/e/a/4/XXXXX.XX/httpd.www/PHPMailer/src/PHPMailer.php(1988): PHPMailer\PHPMailer\PHPMailer->smtpConnect(Array) #1 /customers/e/a/4/XXXXX.XX/httpd.www/PHPMailer/src/PHPMailer.php(1654): PHPMailer\PHPMailer\PHPMailer->smtpSend('Date: Thu, 7 Ap...', 'Bod...') #2 /customers/e/a/4/XXXXX.XX/httpd.www/PHPMailer/src/PHPMailer.php(1492): PHPMailer\PHPMailer\PHPMailer->postSend() #3 /customers/e/a/4/XXXXX.XX/httpd.www/Mailer.php(59): PHPMailer\PHPMailer\PHPMailer->send() #4 {main} thrown in /customers/e/a/4/XXXXX.XX/httpd.www/PHPMailer/src/PHPMailer.php on line 2198 -
Je viens d'essayer avec Gmail comme ceci
$mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->SMTPAuth = true; $mail->Username = 'MonAdresseGmail@gmail.com'; $mail->Password = 'MonMdpGmail'; $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; $mail->Port = 465;
j'obtiens 80072EE2 Le délai imparti à l’opération est dépassé-
-
ModérateurBonjour,
Comme on te l'a déjà dit .... active le debug et regarde ce que ça t'affiche.
=> Pour le debug, il faut ajouter//Enable SMTP debugging //SMTP::DEBUG_OFF = off (for production use) //SMTP::DEBUG_CLIENT = client messages //SMTP::DEBUG_SERVER = client and server messages $mail->SMTPDebug = SMTP::DEBUG_SERVER;
et bien sûr, lors de l'envoi (que tu ne montres pas dans ton code )//Send the message, check for errors if (!$mail->send()) { echo 'Mailer Error: ' . $mail->ErrorInfo; } else { echo 'Message sent!'; }
Il serait bien également de nous montrer le reste du code ... le FROM, le TO .. bref, tout le code en rapport avec ton appel à phpmailer. -
@yg_beC'est plutôt à moi que je ne fais pas confiance, je ne veux pas tout modifier en même temps.
Avec mail() et l'adresse mail associée à mon serveur ça fonctionne mais la fonction retourne parfois False et je ne sais pas pourquoi.
Avec PHPMailer et l'adresse mail associée à mon serveur ça fonctionne et j'ai l'explication des mails non envoyés : considéré comme spam par Yahoo.
Avec mail() et une adresse Gmail j'ai un Time Out.
Je n'ai toujours pas compris quel intérêt j'aurais à utiliser une adresse Gmail; j'ai d'ailleurs vu qu'on ne peut pas envoyer plus de 500 messages par jour. -
@jordane45Avec Debug je n'ai rien d'autre que
80072EE2 Le délai imparti à l’opération est dépassé
voici mon code complet<?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; include 'PHPMailer/src/PHPMailer.php'; include 'PHPMailer/src/SMTP.php'; include 'PHPMailer/src/Exception.php'; $mail = new PHPMailer(true); $Mail = $_GET["MailTo"]; $Subject = $_GET["Subject"]; $Body = $_GET["Body"]; try { $mail->SMTPDebug = SMTP::DEBUG_SERVER; //Enable verbose debug output // Gmail Server settings $mail->isSMTP(); //Send using SMTP $mail->Host = 'smtp.gmail.com'; //Set the SMTP server to send through $mail->SMTPAuth = true; //Enable SMTP authentication $mail->Username = 'Mon adresse@gmail.com'; //SMTP username $mail->Password = 'Mon Mdp gmail'; //SMTP password $mail->setFrom('Mon adresse@gmail.com', 'RVReefTools'); $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; //Enable implicit TLS encryption $mail->Port = 465; //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS` $mail->addAddress($Mail); //Add a recipient $mail->isHTML(true); //Set email format to HTML $mail->Subject = $Subject; $mail->Body = "<HTML><BODY>".$Body."</body></html>"; $mail->send(); echo 'Sent'; } catch (Exception $e) { echo "Mailer Error : {$mail->ErrorInfo}"; } -
Contributeur@Herve_beLe 7 avril 2022 à 09:33, tu écris "Je n'ai toujours pas compris quel intérêt j'aurais à utiliser une adresse Gmail".
Il ne s'agit pas d'utiliser une adresse Gmail, il s'agit de profiter de ce que tu as écrit le 1 avril 2022 à 18:33: "J'ai essayé d'envoyer le même mail "à la main" (avec Outlook) à un des destinataires qui était en erreur, ça fonctionne.".
Au départ, via mail() ou via ta première utilisation de PHPMailer, le mail était directement "envoyé" par ton serveur, comme expliqué le 2 avril 2022 à 17:38.
En utilisant différemment PHPMailer, en appelantisSMTP()
, en précisantHost=
, le mail est envoyé, comme le fait Outlook, en passant par le serveur mail de Google.
Comme écrit le 6 avril 2022 à 19:28, peut-être que Yahoo fait plus confiance à Google qu'à ton hébergeur.
Peut-être pourrais-tu te créer une adresse email chez Yahoo, et, si le destinataire est chez Yahoo, envoyer le mail via le serveur mail de Yahoo.
-
-
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 ! -
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. -
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 ?-
ContributeurYahoo 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.
-
-
Bonjour,
J'ai essayé avec PHPmailer comme cecitry { // 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. -
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. -
Oui, OK, mais sir $mail->send() ne fonctionne pas comment savoir pourquoi ?
C'est la même question qu'avec php mail(). -
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 codelire 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 ? } -
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 ?-
ContributeurL'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.
-
-
"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. -
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. -
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 ?-
-
ContributeurJe 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.
-
-
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.
- 1
- 2