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 23427 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 janvier 2025 - 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

Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 9
6 avril 2022 à 17:15
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é
0
yg_be Messages postés 23427 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 janvier 2025 1 559
6 avril 2022 à 19:33
Peut-être ton hébergeur bloque-t-il cette communication 'smtp.gmail.com:465).
Il est souvent utile, dans ces cas-là, d'introduire des erreurs, pour mieux 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 > yg_be Messages postés 23427 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 janvier 2025
7 avril 2022 à 09:33
C'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.
0
yg_be Messages postés 23427 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 janvier 2025 1 559 > Herve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024
7 avril 2022 à 11:48
Le 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 appelant
isSMTP()
, en précisant
Host=
, 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.
0
jordane45 Messages postés 38384 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 15 janvier 2025 4 727
6 avril 2022 à 22:10
Bonjour,

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.
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 > jordane45 Messages postés 38384 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 15 janvier 2025
7 avril 2022 à 09:36
Avec 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}";
}
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 7 avril 2022 à 10:31
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
0
yg_be Messages postés 23427 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 janvier 2025 1 559
7 avril 2022 à 11:30
"Network is unreachable": cela confirme mon hypothèse du 6 avril 2022 à 19:33.
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
7 avril 2022 à 11:56
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 ?
0
yg_be Messages postés 23427 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 janvier 2025 1 559
7 avril 2022 à 12:47
Si ton code PHP ne peut pas se connecter aux serveurs mail externes, cela semble une voie sans issue.

Objectivement, ce que tu fais ressemble énormément à l'envoi de spams, il est donc logique que cela soit rendu difficile.
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 7 avril 2022 à 12:56
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 !
0
yg_be Messages postés 23427 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 janvier 2025 1 559
7 avril 2022 à 13:39
Je 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.
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
7 avril 2022 à 15:20
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.
0
yg_be Messages postés 23427 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 janvier 2025 1 559
7 avril 2022 à 15:43
pourras-tu marquer la discussion comme résolue?
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 8 avril 2022 à 09:59
Puisque j'ai eu réponse à ma question (dans le titre), c'est fait.
Question hors sujet à propos de PHPMailer
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';
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
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
8 avril 2022 à 14:44
Bonjour,

Cette syntaxe fait partie des espaces de nom (namespaces) :
https://www.php.net/manual/fr/language.namespaces.php
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
8 avril 2022 à 15:50
Merci mais c'est la syntaxe que je ne comprends pas.
Que représentent les 3 PHPMailer dans
use PHPMailer\PHPMailer\PHPMailer;
0
yg_be Messages postés 23427 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 janvier 2025 1 559
8 avril 2022 à 16:27
As-tu examiné le fichier PHPMailer/src/PHPMailer.php?
Quelle instruction namespace contient-il?
Quel est donc le nom absolu de la classe définie dans ce fichier?
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
8 avril 2022 à 16:34
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;
0
yg_be Messages postés 23427 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 14 janvier 2025 1 559 > Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022
8 avril 2022 à 17:04
Je 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;
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
8 avril 2022 à 16:39
Merci à vous deux.
0