Trace du mail envoyé avec PHP

Trace du mail envoyé avec PHP - PHP - Programmation

Marsh Posté le 06-03-2019 à 12:59:51    

Bonjour,
 
J'imagine que la question des envois de mail via la fonction mail() de PHP a été largement débattue ici. Mais ce n'est pas tout à fait à ce propos que je lance cette discussion car l'envoi de mon mail fonctionne. Cependant, je ne suis pas totalement satisfait.
En l'occurrence, j'ai créé quelques pages sur le site de notre club pour gérer les inscriptions au tournoi annuel que nous organisons. Et une fois l'inscription validée, un mail est envoyé la la personne qui s'est inscrite et qui a déclaré une adresse mail valide. Pour cet envoi, j'utilise la fonction mail() en précisant avec quelle adresse mail le message doit être envoyé, il s'agit de la boîte Gmail du club. Là où je bute, c'est que dans cette boîte Gmail, j'aimerai pouvoir retrouver dans "Messages envoyés" les mails de confirmation qui ont été adressés aux personnes dont l'inscription a été prise en compte.
Pour le moment, je contourne cette écueil en envoyant en parallèle une copie cachée mais je ne trouve pas ça très satisfaisant.
 
Ma question est donc de savoir s'il faut un paramétrage particulier de la fonction mail() pour arriver au résultat escompté ou si je suis obligé de passer par des librairies externes telles que PHPMailer.
 
Merci d'avance pour votre aide.

Reply

Marsh Posté le 06-03-2019 à 12:59:51   

Reply

Marsh Posté le 06-03-2019 à 14:33:19    

Avec la fonction mail, c'est le serveur smtp de ton hébergeur qui envoi le mail, il n'a donc aucune chance d'apparaitre dans les emails envoyé du compte Google.
Par contre il a toute les chances d'aller dans le spams, voir même de ne jamais être réceptionné si tu l'utilises comme adresse d’expéditeur (car les champs spf, dkim, dmarc, etc. qui prouvent que l’expéditeur est bien celui qu'il prétend être ne seront pas présent).
 
La solution la plus simple a mettre en œuvre est bien d'envoyer un email depuis noreply@ton-domaine.com avec une copie au compte Gmail.
 
Un envoi SMTP via phpMailer en utilisant les identifiants de ton compte Gmail ne mettront de toute façon pas l'email dans la boite d'envoi du compte (enfin je ne crois pas, si je me trompes merci de corriger).


---------------
D3
Reply

Marsh Posté le 06-03-2019 à 14:35:07    

A priori, le problème du spam est écarté dans la mesure où j'ai envoyé mes tests vers des boîtes Gmail (simple alerte), Free et Yahoo et tous sont bien arrivés à destination.

Message cité 1 fois
Message édité par archeo le 06-03-2019 à 14:35:22
Reply

Marsh Posté le 06-03-2019 à 15:59:11    

De ma propre expérience, les plus chiants sont Orange et Gmail au niveau du classement "abusif" en spam.
 
Mais dans la mesure ou on est jamais à l’abri d'un durcissement des règles à l’avenir, il vaux mieux faire de l'envoi le plus propre possible...
Utiliser une classe php qui forge des entêtes solide et envoyer des Emails depuis une adresse compatible avec l'hébergement ou en utilisant un smtp externe, ce n'est jamais perdu ! ^^
 
Tu peux très bien avoir une adresse replyto différente de ton from d’ailleurs.


---------------
D3
Reply

Marsh Posté le 06-03-2019 à 16:00:32    

Je vais regarder ça plus en détail même si je trouve que ça fait beaucoup de boulot pour envoyer ce simple mail à côté du travail réalisé pour le reste du site !

Reply

Marsh Posté le 07-03-2019 à 12:00:40    

archeo a écrit :

A priori, le problème du spam est écarté dans la mesure où j'ai envoyé mes tests vers des boîtes Gmail (simple alerte), Free et Yahoo et tous sont bien arrivés à destination.


C'est pas parce que ça a marché quelques fois que ça va marcher tout le temps. Je confirme qu'Orange et Gmail sont ultra casse-couilles avec la classification en spam. Y'a d'ailleurs eu un gros soucis il y a quelques semaines avec Gmail : plus aucun mail partant d'Orange ou Free arrivait chez les Gmail.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 07-03-2019 à 12:32:56    

J'ai essayé hier d'utiliser PHPMailer mais entre la version 5 et la version 6, j'ai pas réussi à trouver un exemple fonctionnel de test sur lequel je pouvais me baser pour ensuite l'adapter à mes besoins :(


Message édité par archeo le 07-03-2019 à 12:40:20
Reply

Marsh Posté le 07-03-2019 à 14:31:27    

C'est pour quel forme d'envoi, via smtp ou via la fonction mail ?
Via mail c'est très simple, ça devrait donc fonctionner "rapidement", en SMTP c'est plus compliquer car il faut parfois faire du pop avant stmp et/ou utiliser des ports différent de ceux par défaut...
 
...ça dépend de ton smtp d'envoi, y' un mode debug verbose sur phpmailer, que dit le message d'erreur dans ces conditions ?


---------------
D3
Reply

Marsh Posté le 07-03-2019 à 14:48:35    

Je ne sais pas te répondre. Je voudrais juste vérifier si avec PHPMailer, on peut obtenir le résultat que j'espère (cf premier post).

Reply

Marsh Posté le 07-03-2019 à 15:03:37    

Ben je ne sais pas te répondre non plus, désolé...
[:michaeldell]
https://www.google.com/search?q=deb [...] +phpmailer


---------------
D3
Reply

Marsh Posté le 07-03-2019 à 15:03:37   

Reply

Marsh Posté le 10-03-2019 à 09:05:29    

Je viens partager la solution que j'ai réussi à mettre en oeuvre et qui fonctionne désormais. Quelques précisions "techniques" au préalable car c'est là-dessus que je buttais.
J'ai utilisé la version 6.0.7 de PHPMailer qui se trouve ici => https://github.com/PHPMailer/PHPMailer. Il y a beaucoup de tuto sur le net mais qui pour la plupart se rapportent à la version 5 et il y a des modifications dans l'appel à cette librairie qui faisaient que je ne m'y retrouvais pas.
Après avoir décompressé l'archive, j'ai renommé le répertoire en "PHPMailer" et je l'ai uploadé sur mon site dans ../mon répertoire/ pour avoir une arborescence nommée ../mon répertoire/PHPMailer
Je suis reparti d'un exemple disponible sur Github et adapté à Gmail mais qu'il a fallu que j'adapté, justement pour tenir compte de la version de PHPMailer. J'ai aussi rajouté de quoi prendre en charge les caractère accentués et créé un message permet d'intégrer du HTML dans le message. J'ai aussi désactiver la possibilité de mettre une pièce jointe qui était proposé dans le code d'origine, il suffit d'enlever le commentaire et d'indiquer le chemin de la pièce pour que ça fonctionne. Enfin, j'ai aussi désactivé le texte alternatif.
Je précise également que le premier message à provoqué une alerte sur le compte Gmail émetteur du mail. Il a fallu que j'aille dans le paramétrage du compte, partie "Sécurité", Section "Accès moins sécurisé des applications" pour autoriser l'accès.

 

Au final le code que j'ai employé :

 

<?php
/**
 * This example shows settings to use when sending via Google's Gmail servers.
 * This uses traditional id & password authentication - look at the gmail_xoauth.phps
 * example to see how to use XOAUTH2.
 * The IMAP section shows how to save this message to the 'Sent Mail' folder using IMAP commands.
 */
//Import PHPMailer classes into the global namespace
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
require 'PHPMailer/src/Exception.php';

 

//Create a new PHPMailer instance
$mail = new PHPMailer;

 

//Tell PHPMailer to use SMTP
$mail->isSMTP();

 

//Enable SMTP debugging
// 0 = off (for production use)
// 1 = client messages
// 2 = client and server messages
$mail->SMTPDebug = 2;

 

//Set the hostname of the mail server
$mail->Host = 'smtp.gmail.com';

 

// use
// $mail->Host = gethostbyname('smtp.gmail.com');
// if your network does not support SMTP over IPv6
//Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission
$mail->Port = 465;

 

//Set the encryption system to use - ssl (deprecated) or tls
$mail->SMTPSecure = 'ssl';

 

//Whether to use SMTP authentication
$mail->SMTPAuth = true;

 

//Username to use for SMTP authentication - use full email address for gmail
$mail->Username = "username@gmail.com";

 

//Password to use for SMTP authentication
$mail->Password = "yourpassword";

 

//Set who the message is to be sent from
$mail->setFrom('from@example.com', 'First Last');

 

//Set an alternative reply-to address
$mail->addReplyTo('replyto@example.com', 'First Last');

 

//Set who the message is to be sent to
$mail->addAddress('whoto@example.com', 'John Doe');

 

//Set the subject line
$mail->Subject = 'PHPMailer GMail SMTP test';

 

//Read an HTML message body from an external file, convert referenced images to embedded,
//convert HTML into a basic plain-text alternative body
$mail->msgHTML(file_get_contents('contents.html'), __DIR__);

 

//Set the CharSet
$mail->CharSet = 'UTF-8';

 

$message = '<html>';
$message = '<head>';
$message = '</head>';
$message = '<body>';
$message = '<p>Bonjour,</p>';
$message .= '<p><b>Ceci est un test de PHPMailer.</b></p>';
$message .= '</body>';
$message .= '</html>';

 

$mail->Body = $message;

 

//Replace the plain text body with one created manually
$mail->AltBody = 'This is a plain-text message body';

 

//Attach an image file
//$mail->addAttachment('images/phpmailer_mini.png');

 

//send the message, check for errors
if (!$mail->send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    echo "Message sent!";
    //Section 2: IMAP
    //Uncomment these to save your message in the 'Sent Mail' folder.
    #if (save_mail($mail)) {
    #    echo "Message saved!";
    #}
}

 

//Section 2: IMAP
//IMAP commands requires the PHP IMAP Extension, found at: https://php.net/manual/en/imap.setup.php
//Function to call which uses the PHP imap_*() functions to save messages: https://php.net/manual/en/book.imap.php
//You can use imap_getmailboxes($imapStream, '/imap/ssl', '*' ) to get a list of available folders or labels, this can
//be useful if you are trying to get this working on a non-Gmail IMAP server.
function save_mail($mail)
{
    //You can change 'Sent Mail' to any other folder or tag
    $path = "{imap.gmail.com:993/imap/ssl}[Gmail]/Sent Mail";
    //Tell your server to open an IMAP connection using the same username and password as you used for SMTP
    $imapStream = imap_open($path, $mail->Username, $mail->Password);
    $result = imap_append($imapStream, $path, $mail->getSentMIMEMessage());
    imap_close($imapStream);
    return $result;
}

 


J'espère que ça servira à d'autres forumeurs qui comme moi s'arrachaient les cheveux ! ;)


Message édité par archeo le 10-03-2019 à 09:09:02
Reply

Marsh Posté le 11-03-2019 à 14:48:44    

Pas mal du tout, je ne connaissais pas la partie 2 pour faire de la synchro IMAP, c'est très pratique !
 
Pas contre tu devrais peut être géré un envoi basique dans le cas ou l'envoi SMTP ne se fait pas (trop de latence entre les serveurs par exemple).


---------------
D3
Reply

Marsh Posté le 11-03-2019 à 15:23:30    

Pour moi, l'important c'est que l'inscription soit bien prise en compte dans ma base de données. Si certains ne reçoivent pas le mail de confirmation, sachant qu'ils ont accès à une page où figurent tous les joueurs inscrits, ça n'est pas dramatique.

Reply

Marsh Posté le 24-03-2019 à 15:34:18    

On ne peut jamais suivre un email via php, seulement avec javascript

Reply

Marsh Posté le 24-03-2019 à 16:45:03    

Si, on peut suivre un mail via du PHP en mettant dans le mail une url de de script (genre un script PHP qui est appelé pour générer une image (même si aujourd'hui, la plupart des clients mails bloquent ce type de technique) :o


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-08-2019 à 20:12:39    

Testé et approuvé.
Je vais l'intégrer à Garradin (je vais essayer de ...).
Merci archeo !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed