Solution détaillée pour éviter que les courriels soient identifiés comme spam et/ou n'arrivent pas aux destinataires
Exemple de situation : Vous avez un serveur qui exécute un site web PHP pour example.com
qui doit envoyer des e-mails . Et vous remarquez que vos courriels ne sont pas toujours délivrés. (Gros problème si vous êtes propriétaire d'une boutique, et que les clients ne reçoivent pas les emails après un achat !)
Si vous suivez toutes les étapes suivantes, il devrait résoudre 99,9% des problèmes. (J'ai d'abord pensé qu'il était possible de ne faire que quelques-uns d'entre eux, et de sauter DKIM par exemple, mais finalement tous étaient nécessaires pour résoudre tous les problèmes que j'avais).
-
Tout d'abord, qui envoie les e-mails ?
Lorsque votre code PHP envoie des emails, c'est souvent avec la célèbre fonction PHP mail(...)
. Mais que fait cette fonction, sous le capot ? Exécutons un test.php
page contenant <?php echo ini_get('sendmail_path'); ?>
. Vous obtiendrez par exemple : /usr/sbin/sendmail -t -i
. Bonne nouvelle, maintenant nous savons quel programme gère vraiment les emails !
Maintenant une info délicate : le nom sendmail
peut être divers programmes . Même si vous voyez sendmail
à l'étape précédente, vous avez peut-être sendmail o postfix o exim ou qmail, etc. installés. Faisons dpkg -S /usr/sbin/sendmail
. La réponse est postfix: /usr/sbin/sendmail
ok, cela signifie nous avons postfix
installé .
-
Regardez dans le fichier journal /var/mail/www-data
pour savoir quels e-mails n'ont pas été correctement envoyés, et pourquoi. Cela pourrait être utile pour les prochaines étapes.
-
Comme mentionné sur Le blog de Jeff Atwood il est temps d'examiner les enregistrements PTR inversés. (Plus de détails seront ajoutés ici).
-
Ajoutez la ligne suivante dans le fichier de configuration de postfix /etc/postfix/main.cf
fichier :
inet_protocols=ipv4
Puis redémarrez postfix avec service restart postfix
. Pourquoi ? Parce que j'ai eu des problèmes de ce genre lorsque le destinataire est gmail :
Notre système a détecté que ce message ne respecte pas les directives d'envoi IPv6 concernant les enregistrements PTR et l'authentification 550-5.7.1. Veuillez revoir 550-5.7.1 https://support.google.com/mail/?p=ipv6_authentication_error pour plus d'informations sur 550 5.7.1.
El solution la plus facile était alors de passer postfix
en ipv4 uniquement, d'où cette étape 4 (qui pourrait être inutile pour vous ?).
-
Enregistrements DNS SPF . Afin de prouver que vous êtes autorisé à envoyer des e-mails à partir de @example.com
vous pouvez ajouter un enregistrement SPF dans les enregistrements DNS du domaine. example.com
. J'ai trouvé quelque part que The DNS record type 99 (SPF) has been deprecated
Nous utilisons donc un enregistrement TXT à la place. Ajoutons ceci comme un enregistrement DNS TXT (voir également la note 1) :
v=spf1 a mx include:_spf.google.com include:sendgrid.net ~all
Pourquoi ces inclusions ? Parce que mon serveur ne sera pas le seul à envoyer des e-mails à partir de @example.com ! J'ai configuré Gmail pour Envoyer le courrier en tant que contact@example.com ( voir la capture d'écran ici ), en utilisant le fournisseur SMTP de confiance Sendgrid . Si je n'ajoute pas ces include:
Gmail ne serait pas autorisé à envoyer des e-mails à partir de @example.com
.
-
DKIM la signature numérique. Comme indiqué aquí L'objectif de DKIM est de garantir que le contenu du courrier n'a pas été altéré pendant sa transmission. Voici le processus d'installation dans Ubuntu (guide utile aquí aussi) :
-
apt-get install opendkim opendkim-tools
-
Créez les clés (vous pouvez également générer les clés et l'enregistrement TXT DNS correspondant à l'aide de la commande http://dkimcore.org/tools/ ):
mkdir /etc/opendkim
cd /etc/opendkim
opendkim-genkey -t -s mail -d example.com
-
Mettons ça dans /etc/opendkim.conf
:
Syslog yes
Domain *
KeyFile /etc/opendkim/mail.private
Selector mail
AutoRestart yes
Background yes
Canonicalization relaxed/relaxed
DNSTimeout 5
Mode sv
SubDomains no
ceci dans /etc/default/opendkim
:
SOCKET="inet:8891@localhost" # Ubuntu default - listen on loopback on port 8891
et enfin ajouter ceci à la fin du fichier de configuration de postfix /etc/postfix/main.cf
:
# DKIM
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
-
Maintenant, ajoutons la clé publique (trouvée dans /etc/opendkim/mail.txt
) aux enregistrements DNS de votre domaine :
mail._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=OqYHd...waPaQAX"
Voici à quoi cela ressemble avec mon registrar Namelynx :
-
Dernière étape pour DKIM : redémarrer les services de messagerie avec service restart opendkim ; service restart postfix
.
-
Vérifiez si tout fonctionne. La méthode la plus simple consiste à envoyer un courrier électronique via PHP à l'adresse suivante auth-results@verifier.port25.com
(cet outil très utile est mis à disposition par Port25 Solutions) :
$emailfrom = "Example <contact@example.com>";
$headers = "MIME-Version: 1.0 \n";
$headers .= "Content-Transfer-Encoding: 8bit \n";
$headers .= "Content-type: text/plain; charset=utf-8\n";
$headers .= "Reply-To: " . $emailfrom . "\n";
$headers .= "From: " . $emailfrom . "\n";
$headers .= "Bcc: example@gmail.com\n";
mail("check-auth@verifier.port25.com", "Hello", "Hello!", $headers);
Ensuite, voyez la réponse de cet outil, elle devrait ressembler à ceci :
==========================================================
Summary of Results
==========================================================
SPF check: pass
DKIM check: pass
SpamAssassin check: ham
Le service mail-tester.com est également utile.
-
(Facultatif) Essayez postmaster.google.com. Je l'ai utilisé mais je ne me souviens pas si ça a aidé ou pas.
-
Si cela ne fonctionne toujours pas Pour éviter les jours et les nuits de débogage (infructueux), une solution pourrait consister à externaliser le courrier électronique auprès d'une solution professionnelle. Ici est un bon article à ce sujet. En voici une citation : "L'envoi d'emails depuis votre application peut s***. La moitié du temps, les messages qui sont envoyés depuis votre propre serveur se retrouvent simplement dans le dossier de courrier indésirable du destinataire." que j'ai malheureusement découvert vrai, après des semaines d'ajustements.
Notes supplémentaires :
(1)
-all : Fail: All mail servers not listed in the SPF record are explicitly not authorized to send mail using the sender’s domain.
~all : Soft Fail: All mail servers not listed in the SPF record are not authorized to send mail using the sender’s domain, but the owner of the domain is unwilling to make a strong assertion to that effect.
?all : Neutral: The domain controller cannot or does not want to assert whether or not all mail servers not listed in the SPF record are authorized to send mail using the sender’s domain.
+all : Pass: All mail servers are authorized to send mail on behalf of the sender’s domain.