[RESOLU] Solutions pour envoyer un mail avec PHP, les entêtes à utiliser,...

Mammouth du PHP | 903 Messages

21 nov. 2021, 20:04

Personne aime que son message atterrisse dans le dossier SPAM, ni même qu'il soit pas reçu du tout, on va essayer de donner quelques conseils pour que l'envoi se fasse dans les meilleurs conditions.

Conseils:
- Utiliser des retours à la ligne pour les entêtes: \r\n en utilisant des guillemets double " sinon il seront pas pris en compte, ex:
$Entetes = 'MIME-Version: 1.0\r\n'; //ne fonctionnera pas
$Entetes = "MIME-Version: 1.0\r\n";//fonctionnera

//une version plus propore consiste à créer un tableau $Entetes que vous "imploderez" de \r\n :
$Entetes = []; 
$Entetes[] = "MIME-Version: 1.0";
$Entetes[] = "Content-type: text/html; charset=UTF-8";
$Entetes[] = "etc..";
//puis:
$Entetes = implode("\r\n",$Entetes);

//une autre méthode avec la concaténation:
$Entetes = 
	"MIME-Version: 1.0\r\n" .
	"Content-type: text/html; charset=UTF-8\r\n" .
	"etc..\r\n";
- Si utilisation d'une adresse en "noreply", il faut quelle soit du même domaine d'où est envoyé le mail (et l'adresse mail qui envoi aussi)
- Définir l'entête Content-Type en "text/html" si du HTML est inclus (comme c'est souvent le cas)
- ?

J'arrive à un score de 8.7 avec ma fonction mail()

Code pour envoyer un mail correctement:
//configuration
$mail_expediteur="[email protected]";
$mail_destinataire="[email protected]";
$titre="Titre du mail";
$msg="Contenu du mail HTML avec <strong>des balises</strong> HTML";

//entêtes
$Entetes=[];
$Entetes[] = "MIME-Version: 1.0";
$Entetes[] = "Content-type: text/html; charset=UTF-8";
$Entetes[] = "From: Mon site <$mail_expediteur>";
$Entetes[] = "Reply-To: Mon site <$mail_expediteur>";

//envoi
if(mail($mail_destinataire,"=?UTF-8?B?".base64_encode($titre)."?=",$msg,implode("\r\n",$Entetes))){
	echo "ok";
} else{
	echo "pas ok";
}

Il me reste à utiliser DKIM (Le -1 dans l'image dessous), List-Unsubscribe et améliorer les recommandations "SpamAssassin" pour l'améliorer :D

Image
Modifié en dernier par two3d le 22 nov. 2021, 00:27, modifié 6 fois.

Eléphant du PHP | 323 Messages

21 nov. 2021, 20:20

Pour reprendre la conversation, à propos de X-auth-smtp-user et X-abuse-contact, je ne sais pas si c'est utile vraiment ou pas, j'ai pas fait les tests partant du principe que si ça fait pas de bien, ça peut pas faire de mal en tout cas :D

Et sinon, la solution qui consiste à utiliser la navigation des internautes pour envoyer les mails groupés à leur insu, je mets ça sur les pages de l'administrateur, comme ça les clients lambdas ne sont pas concernés, et je suis sûr que l'admin vérifie son interface régulièrement. Bref, ça m'évite surtout de me faire chier avec des Crons, parce que je connais pas et que j'ai la flemme d'apprendre :roll: :mrgreen:

Mammouth du PHP | 903 Messages

21 nov. 2021, 21:01

Si tu sais pas à quoi ça sert, le met pas ^^ tu est sur un serveur ? cron est simplifié sur hébergement mutualisé ;)

j'ai rajouté le code PHP pour envoyer un mail, je l'éditerais suivant les conseils qui seront ajoutés ici.

Mammouth du PHP | 903 Messages

21 nov. 2021, 23:36

Ya pas de tutos qui explique l'entête DKIM ?, j'ai juste trouvé le nom de l'entête qui est "DKIM-Signature:" en cherchant dans le code de PHPMailer pour voir comment il utilise. :ordi:

EDIT: j'ai trouvé la doc: https://datatracker.ietf.org/doc/html/rfc6376

Traduit avec google

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9102 Messages

22 nov. 2021, 11:43

Il faut aussi signaler que des librairies comme PHPmailer sont trèèèès utiles car elles ont déjà intégrées toutes ces fonctionnalités pour éviter de tomber en spam, notamment quand on envoie un mail en HTML, la gestion facile des pièces jointes... ou encore la signature DKIM :
https://github.com/PHPMailer/PHPMailer

Si les emails qui sont envoyés ont une importance business, il sera aussi préférable de passer par une plateforme d'envoi de mails type Mailjet qui vous fournira un SMTP que vous pourrez paramétrer en 3 lignes de codes dans PHPmailer.
Il y a de nombreux avantages de passer par une plateforme de mail, notamment la surveillance des blacklists (ce sont eux qui font les demandes de déblacklistage, si un de leur SMTP est blacklisté), par ailleurs ils gèrent facilement le SPF/DKIM/DMARC, s'assurent de ne pas renvoyer des mails à une adresse qui a été hard-bouncée (typiquement car il y aune faute de frappe), et permettent un suivi détaillé des mails envoyés.


Ça ne veut pas dire qu'il ne faut pas passer par la fonction mail() pour envoyer des mails, mais il faut être conscient qu'en 2021 le spam est un fléau contre lequel les opérateurs de mails luttent continuellement en mettant des règles de plus en plus strict et il faut plus que jamais être le plus "propre" possible dans son code et parfois même faire des adaptations spécifiques pour un "gros" (comme Gmail, Microsoft, Orange ou Free) qui ne respectent pas toujours à la lettre de leur côté les RFC si ça permet de faire diminuer le nombre de spams sur leur plateformes
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 903 Messages

22 nov. 2021, 12:28

Oui, totalement conscient.

Ah mince, je peux plus rééditer mon message pour dire que le post s'adresse aux gens qui souhaitent envoyer un mail en HTML sans installer de librairie et sans qu'il arrive dans les SPAMS.

Toute la nuit, j'ai lu DKIM sur la doc, et amélioré ma fonction, je commence à comprendre mais c'est entre "simple et le presque compliqué" pour l'installation de ma fonction mail() si je lui rajoute DKIM, PHPMailer me semble peut être plus judicieux si jamais ça s'empire.

Je souhaiterais juste tester ma fonction avec le DKIM en plus, pour voir si j'arrive toujours dans les SPAMS chez HOTMAIL. Je serais aussi avec un score de 9.7/10! Pour l'instant le DKIM, j'apprends encore, je sais qu'il faut créer un enregistrement DNS, comment je sais pas trop encore... (je cherche à générer ma clé publique base64 pour pouvoir continuer).

Mammouth du PHP | 903 Messages

22 nov. 2021, 20:50

Ça devient compliquer avec le DKIM, la doc est compliquée à traduire car les lignes ne dépassent pas 76 caractères (ou quelques chose du genre, une ancienne normalité sans doute pour correspondre aux normes RFC internet), du coup la traduction est biaisée.

De plus, la doc dit:
Les en-têtes List-Unsubscribe et List-Unsubscribe-Post DOIVENT être
couvert par la signature et inclus dans la balise "h=" d'un
Champ d'en-tête DKIM-Signature.

Si le message n'a pas la signature DKIM requise, le courrier
le destinataire NE DEVRAIT PAS proposer de désabonnement en un clic pour ce message.
Donc "pas de bras, pas de chocolat", pas de DKIM pas de lien de désinscription proposé dans le Webmail.

Mammouth du PHP | 903 Messages

23 nov. 2021, 18:32

On dirait bien que j'ai réussi à mettre en place DKIM \:D/

Après avoir attendu 24h la propagation de mon entrée DKIM elle est enfin valide, du moins pour https://glockapps.com/spam-testing/

Image

2 jours quand même...