Voici mon problème : J'ai installé et utilisé phpmailer selon les indications trouvées sur github et pas de problème pour envoyer des mails depuis mon site à partir de formulaires quand je passe par le serveur de mon école. Mais quand je test en local, ou chez mon hébergeur web (world light, pour le besoin d'un stage en entreprise) cela ne fonctionne plus.
En local, le mail n'est pas envoyé et le message d'erreur apparaît.
Chez mon hébergeur, le mail semble s'envoyer (message de succès) mais je ne le reçois pas.
Je vous transmet la partie de code, merci d'avance pour votre aide :).
[code]try{
$this->mail->From=$emailExpediteur;
$this->mail->FromName=$nomExpediteur;
$this->mail->Subject="Balance âgée";
$this->mail->MsgHTML($emailContent);
$this->mail->AltBody="Votre messagerie n'accepte pas le format HTML";
$this->mail->CharSet="UTF-8";
$this->mail->AddAddress($emailDestinataire);
$this->mail->AddAttachment($file_location);
if($this->mail->Send()){
$message[].="Email envoyé avec succès";
$type[].="success";
$desc[].='Envoi mail';
}
else{
$message[].="L'email n'a pas pu être envoyé";
$type[].="error";
$desc[].='Envoi mail';
}
}
catch(Exception $mail){
echo "Erreur :".$mail->ErrorInfo;
}[/code]
J'utilise une architecture MVC, voici le constructeur du model où se trouve l'initialisation de la classe phpmailer.
[code]<?php
include 'dompdf/autoload.inc.php';
use Dompdf\Dompdf;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer-master/src/PHPMailer.php';
require 'PHPMailer-master/src/Exception.php';
class Model{
/**
@varstring connexion au serveur via PDO
@accessprotected
/
protected $connexion;
/**
@varstring requette SQL
@accessprotected
/
protected $requete;
protected $pdf;
protected $mail;
/**
Méthode de construction de la class
*
/
public function __construct(){
//Définition des constantes contenants les identifiants de connexion
define('SERVER' ,"localhost");
define('USER' ,"root");
define('PASSWORD',"");
define('BASE' ,"*******");
try{
//On tente de se connecter avec la méthode PDO avec ces identifiants
$this->connexion= new PDO("mysql:host=".SERVER.";dbname=".BASE, USER, PASSWORD);
}
catch(Exception $e){
echo "Erreur : " . $e->getMessage();
}
$this->pdf= new Dompdf();
$this->mail=new PHPMailer();
}[/code]
A voir également:
Problème d'envoi avec phpmailer selon les serveurs
Je n'ai pas adapté mes fichiers en local car je peut déjà faire mes tests sur le serveur de mon école, je voulais m'occuper de mon hébergeur en priorité pour que le client puisse tester la fonctionnalité.
Après lectyre de votre lien, j'ai crée un compte de messagerie depuis le panneau de commande de planetHoster, et modifié mon code comme ceci :
try{
$this->mail->Host='webmail.world.planethoster.net:25';
$this->mail->Username='******@mywebsitearctest.yn.fr';
$this->mail->Password='*************';
$this->mail->From=$emailExpediteur;
$this->mail->FromName=$nomExpediteur;
$this->mail->Subject="Balance âgée";
$this->mail->MsgHTML($emailContent);
$this->mail->AltBody="Votre messagerie n'accepte pas le format HTML";
$this->mail->CharSet="UTF-8";
$this->mail->AddAddress($emailDestinataire);
$this->mail->AddAttachment($file_location);
if($this->mail->Send()){
$message[].="Email envoyé avec succès";
$type[].="success";
$desc[].='Envoi mail';
}
else{
$message[].="L'email n'a pas pu être envoyé";
$type[].="error";
$desc[].='Envoi mail';
}
}
catch(Exception $mail){
echo "Erreur :".$mail->ErrorInfo;
}
Mais toujours la meme chose, quand j'envoi le mail depuis mywebsitearctest.yn.fr j'ai le message de succès mais le mail ne s'envoi pas.
Je n'ai pas adapté mes fichiers en local car je peut déjà faire mes tests sur le serveur de mon école, je voulais m'occuper de mon hébergeur en priorité pour que le client puisse tester la fonctionnalité.
Après lectyre de votre lien, j'ai crée un compte de messagerie depuis le panneau de commande de planetHoster, et modifié mon code comme ceci :
Mais toujours la meme chose, quand j'envoi le mail depuis mywebsitearctest.yn.fr j'ai le message de succès mais le mail ne s'envoi pas.
Disons que c'est assez différent de mon problème à moi.
1: Je ne suis pas chez Hosteur mais planetHoster (Dans le lien il s'agit de Hosteur apparemment)
2: Je n'ai pas de soucis avec un compte mail en particulier, aucun ne fonctionne que se soit yahoo, gmail ou autre.
3: Je n'ai aucun message d'erreur
Cependant une des réponse suggérée de crée un compte de messagerie dédié depuis la panneau de commande de l'hébergeur.
as-tu essayé d'envoyer un mail à destination du compte de messagerie dédié créé depuis la panneau de commande de l'hébergeur?
donc en utilisant cette adresse pour $emailDestinataire?
ce qui confirmerait l'hypothèse (en #4) que l'hébergeur est considéré comme suspect par les autres services de messagerie, qui semblent ne pas accepter les courriels venant de cet hébergeur.
si je résume, quelles options as-tu testé chez cet hébergeur? mail, sendmail, SMTP vers le service mail de l'hébergeur.
si je m'y retrouve, tu n'as pas testé, chez cet hébergeur, SMTP vers un autre service mail.
c'est, par ailleurs, la solution à utiliser en local.
J'ai utilisé isMail, isSendMail et isSMTP pour $this->mail;
Il me semble que j'ai envoyé avec SMTP vers un autre service mail puisque j'ai défini $this->mail->isSMTP et que l'adresse de destination est différente de celle du compte dédié.
J'en ai essayé plusieurs (gmail, gmx, hotmail...) pour l'expéditeur mais cela ne fonctionne que quand le destinataire est mon compte de messagerie dédié.
De plus cela ne fonctionne toujours pas en local. Même en passant par le compte de messagerie de planetHoster et en utilisant isSMTP.
"cela ne fonctionne toujours pas en local": symptôme? qu'as-tu testé?
je n'ai pas été assez clair.
il y a, généralement, deux services de messagerie impliqués dans l'envoi d'un message:
- le service de messagerie émetteur dans lequel le message est posté par l'émetteur
- le service de messagerie récepteur qui gère la boite du destinataire
ton programme est en contact avec le service émetteur. quand tu utilises SMTP, c'est en spécifiant Host que tu choisis le service émetteur.
le service récepteur est, évidemment, celui qui gère l'adresse du destinataire. ton programme n'est pas en contact avec le service récepteur, c'est le service émetteur qui va lui transmettre le message.
as-tu testé en utilisant comme adresse email de l'expéditeur (From) une adresse email valide et hébergée sur le service émetteur, donc qui se termine par planethoster.net, sinon l'adresse email qui te sert comme Username? tu comprends bien qu'utiliser une autre adresse comme expéditeur ne peut que sembler suspect, puisque c'est une usurpation d'identité.
as-tu testé que l'adresse email qui te sert comme Username reçoit bien des messages envoyé à partir de services comme gmail?
quels sont les services de messagerie sur lesquels tu as un compte (dont tu connais le mot de passe). ce seront des candidats services émetteurs.
Tout d'abord je vous remercie pour vos réponses et votre temps.
En local, j'ai donc essayé de me connecter en utilisant
$this->mail->isSMTP()
et en mettant comme expéditeur (
setFrom()
) l'adresse de messagerie dédiée chez planetHost.
Je suppose qu'il manque quelque chose car je reçois encore le message SMTP suivant :
SMTP ERROR: Failed to connect to server: (0)
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
Par contre maintenant, et avec la même méthode, cela fonctionne depuis mon site. Bien que je n'ai plus de message SMTP qui apparaisse après envoi du mail, je reçois bien ce dernier (les caractères accentués ne sont cependant pas traduits).
Si je comprend bien, je doit mettre le mail de l'utilisateur qui envoi le mail dans le 'reply' plutôt que comme expéditeur (
setFrom()
).
Dans ce cas je ne comprend pas comment cela peut fonctionner depuis le serveur de l'école en mettant l'adresse de l'utilisateur comme expéditeur (
tu ne l'as pas clairement expliqué, mais il me semble que tu envoies des messages avec des adresses expéditeurs autres que tes propres adresses. pourquoi fais-tu cela, qui ressemble furieusement à de l'usurpation d'identité?
quels sont les services de messagerie sur lesquels tu as un compte (dont tu connais le mot de passe). ce seront des candidats services émetteurs?
il me semble que ton ordi local ne peut pas communiquer avec le serveur de messagerie de planetHost. ne connais-tu aucun autre service de messagerie que tu pourrais utiliser? sinon, il suffit de créer une adresse gmail, par exemple, et utiliser le service de messagerie de gmail.
je ne comprends pas le "bien que" dans la phrase suivante: "Bien que je n'ai plus de message SMTP qui apparaisse après envoi du mail, je reçois bien ce dernier".
tu t'étonnes que cela fonctionne depuis le serveur de l'école, et pas depuis planetHost. moi je m'étonnes que le serveur de l'école laisse ainsi passer des messages dont l'adresse de l'expéditeur est ainsi usurpée. peut-être que, tout simplement, planetHost jette ce genre de message.
Pour répondre à ta première question, je souhaitait que l'adresse de l'expéditeur soit celle de l'utilisateur envoyant le mail, pour faire comme si il l'avait envoyé depuis sa boite perso en quelque sorte.
Pour la seconde, je possède 2 adresses personnelles (une chez gmx une autre chez Gmail) et un adresse dédiée, la fameuse que j'ai crée depuis planetHoster.
Si je comprend bien, je doit crée une adresse spécifique (Gmail par exemple) pour les mails envoyés depuis mon hôte local ?
Pour le "Bien que", je disais cela dans le sens ou je pensais recevoir les même message de succès (250 OK), en définissant sur
isSMTP()
.
En fait, pour situer un peu le contexte, quand on se connecte sur mon site, je récupère l'adresse mail de l'utilisateur (chargé d'affaires) dans une variable de session dans le but d'indiquer par la suite qui envoi le mail pour que l'on puisse lui répondre sur sa boite perso.
Il y a un pdf généré à partir d'une page html (dompdf) et je voulais que l'utilisateur puisse l'envoyer directement au client sans avoir à télécharger le document sur son ordi pour l'envoyer ensuite depuis sa boite mail.
je pense que tu peux utiliser n'importe quelle adresse gmail dont tu es propriétaire pour tester en local.
pour des raisons de sécurité, il est préférable, je pense, de créer une adresse spécifique pour ces tests.
Je viens donc de créer une adresse sur Gmail spécialement pour les envois en local, cela ne fonctionne pas.
Je reçois l'erreur :
SMTP NOTICE: EOF caught while checking if connected
SMTP Error: Could not authenticate.
Il y a quelque chose que j'ai du oublier, mais ce n'est pas de modifier les identifiants de connexion dans mon model.
peux-tu montrer comment tu as spécifié les infos de connexion?
je suppose que tu as fait une recherche "phpmailer gmail" pour trouver les bon paramètres?
je me trompe où tu ne récupères ni n'affiches $mail->ErrorInfo en cas d'erreur?
comme d'habitude, il est utile de spécifier des paramètres incorrects, pour voir ce qui influence le comportement, si le message d'erreur reste le même:
- username
- password
- host
- port
en cas d'erreur, il me répète simplement les erreurs SMTP déjà relevées.
J'ai suivis votre lien et après lecture j'ai adapté les paramètres de sécurité du compte Gmail, de plus j'ai modifié le port (465 -> 587) et changé les paramètres de sécurité SMTP
$this->mail->SMTPSecure = 'tls';
.
Cela fonctionne depuis mon site en ligne :)
Mais toujours pas en local :(
SMTP Error: Could not connect to SMTP host.
Je passe quand même le sujet en résolu, car il s'agissait de le faire fonctionner en ligne avant tout.
Pour ce qui est du local et de l'encodage, je vais faire quelques recherches.
New-Object : Exception lors de l'appel de «.ctor» avec «2» argument(s): «Une tentative de connexion a échoué car le
parti connecté n’a pas répondu convenablement au-delà d’une certaine durée ou une connexion établie a échoué car
l’hôte de connexion n’a pas répondu»
Autant pour moi. Oui j'ai essayé aussi et toujours pareil : Message 250 OK depuis SMTP, quand le mdp est le bon, mais aucun mail reçus et aucun mail visible depuis le panneau de commande de mon adresse mail dédié sur planetHoster.
Je reposte ma question car le post précédent ne me permettait pas d'éditer du code...
Voici le problème : Mon hébergeur est planethoster, j'utilise phpmailer pour envoyer des mails générés depuis mon site web. Quand je l'envoi depuis le serveur de mon école, sans préciser de compte de messagerie, cela fonctionne sans problème, mais quand je le met en ligne sur planète hoster le mail ne s'envoi pas bien que le message de succès apparaisse.
J'ai d'abord crée un compte de messagerie dans planetHoster et insérer les identifiants de connexion dans mon code que voici :
try{
$this->mail->Host='webmail.world.planethoster.net:25';
$this->mail->Username='******@mywebsitearctest.yn.fr';
$this->mail->Password='*************';
$this->mail->From=$emailExpediteur;
$this->mail->FromName=$nomExpediteur;
$this->mail->Subject="Balance âgée";
$this->mail->MsgHTML($emailContent);
$this->mail->AltBody="Votre messagerie n'accepte pas le format HTML";
$this->mail->CharSet="UTF-8";
$this->mail->AddAddress($emailDestinataire);
$this->mail->AddAttachment($file_location);
if($this->mail->Send()){
$message[].="Email envoyé avec succès";
$type[].="success";
$desc[].='Envoi mail';
}
else{
$message[].="L'email n'a pas pu être envoyé";
$type[].="error";
$desc[].='Envoi mail';
}
}
catch(Exception $mail){
echo "Erreur :".$mail->ErrorInfo;
}
J'utilise une architecture MVC, donc voici le constructeur du model ou est initialisée la classe phpmailer :
<?php
include 'dompdf/autoload.inc.php';
use Dompdf\Dompdf;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer-master/src/PHPMailer.php';
require 'PHPMailer-master/src/Exception.php';
/**
* Création d'une class Mère Model
*
* Contient les méthodes de traitements des données liées à toutes les entités
*/
class Model{
/**
* @var string connexion au serveur via PDO
* @access protected
*/
protected $connexion;
/**
* @var string requette SQL
* @access protected
*/
protected $requete;
protected $pdf;
protected $mail;
/**
* Méthode de construction de la class
*
*/
public function __construct(){
//Définition des constantes contenants les identifiants de connexion
define('SERVER' ,"localhost");
define('USER' ,"*************");
define('PASSWORD',"***************");
define('BASE' ,"***************");
try{
//On tente de se connecter avec la méthode PDO avec ces identifiants
$this->connexion= new PDO("mysql:host=".SERVER.";dbname=".BASE, USER, PASSWORD);
}
catch(Exception $e){
//On récupère l'exeption éventuellement produite et on l'affiche
echo "Erreur : " . $e->getMessage();
}
$this->pdf= new Dompdf();
$this->mail=new PHPMailer();
}