Rendre ses mails désirables

Disclaimer : article en cours de rédaction. Je vous le met quand même car il faut bien que je sorte un ou deux trucs sur ce blog de temps en temps 😉 Mais certains détails restent à régler, entre autre parce que je ne me suis pas encore sorti de tous mes soucis pour pouvoir envoyer moi même des mails !! 😉

Je vous préviens tout de suite, rien de sexy ou de marketing dans ce post, mais un truc technique bien rasoir : comment mettre toutes les chances de son côté pour que les mails que l’on envoie (depuis un script PHP, par exemple), arrivent à l’expéditeur sans passer par les X filtres de spam qui sont installés un peu partout…

Autant vous dire tout de suite, mode “bidouille” et “pifomètre” sont au programme, régler ce problème apparemment tout bête est une vraie prise de tête, et ce n’est pas une science exacte, très loin de là, puisque les filtres en face de vous évoluent en permanence.

0) Quel serveur SMTP ?

Petit préambule : mes astuces s’appliquent lorsque l’on décide d’utiliser son propre serveur SMTP d’envoi, hébergé sur son petit Linux à soi qu’on a. Si vous décidez d’utiliser le serveur SMTP de votre FAI ou de votre hébergeur, les données ne sont bien entendu pas les mêmes, même si quelques unes des astuces montrées ici restent valables.

En PHP (qui servira de support pour mes exemples), la configuration du serveur SMTP à utiliser se fait dans le fichier PHP.INI :

[mail function]
SMTP = localhost
smtp_port = 25

1) Bidouiller les entêtes

Chaque mail possède un entête plus ou moins normalisé. En théorie, plus votre entête sera complet, mieux il sera accepté par le serveur d’en face. Voici ce que j’utilise pour ma part (en vieux code PHP des familles) :

$headers = ‘From: Tof-it ! <contact@tof-it.com>’.”\n”;
$headers .= “Return-Path: <$email>”.”\n”;
$headers .= “Content-Type: text/html; charset=iso-8859-1″.”\n”;
$headers .= “X-Sender: <www.tof-it.com>”.”\n”;
$headers .= “X-Mailer: PHP5.1″.”\n”;
$headers .= “X-auth-smtp-user: contact@tof-it.com”.”\n”;
$headers .= “X-abuse-contact: tof-it@ecoms.fr”.”\n”;
$headers .= ‘Reply-to: <tof-it@ecoms.fr>’.”\n”;
$headers .= “\r\n”;

Tant qu’on est à PHP, lors de l’envoi, utilisez le paramètre de la fonction mail(..) pour qu’elle envoie le mail en donnant comme expéditeur le vrai email mentionné dans l’entête, et pas un mail plus ou moins bien donné par défaut par votre module PHP :

mail($email,$sujet,$corps,$headers,”-f$contact@tof-it.com”);

2) Vous assurer que votre serveur de mail est capable d’en recevoir

Même si votre serveur de mails ne servira qu’en envoi, et que vous définissez une adresse de reply différente, il faut que votre serveur de mails soit capable d’en recevoir ! Eh oui, ça fait partie de la norme RFCmachinbidule, bref, certains serveurs sont sensibles au fait que vous soyiez parfaitement respectueux des normes, même quand certain des détails ne vous servent à rien !

Pour vérifier tout ça, vous avez des sites (hélas payants) tels que www.dnsstuff.com, qui peuvent vous faire un audit complet de votre configuration.

Faire en sorte qu’un serveur de mails envoie des mails, ça n’est pas très compliqué, il suffit que le DNS pointe dessus avec les bons champs MX qui vont bien. En revanche, pour qu’il soit configuré pour en recevoir, il faut le bidouiller un petit peu. Sur notre serveur, on utilise Postfix, j’ai donc dû modifier les fichiers /etc/postfix/virtual et /etc/postfix/transport. Rien de méchant, il s’agit essentiellement de dire dans quelle boîte “physique” doivent être stockés les mails reçus avec le nom de domaine déclarés. Par exemple, j’ai rajouté dans mon fichier virtual :

# TOF-IT
contact@tof-it.com jd

qui indique tout simplement que les mails reçus à contact@tof-it.com sont stockés dans le compte Unix “jd”. On lance ensuite un “postmap /etc/postfix/virtual” pour mettre à jour la base Postfix, puis un /etc/init.d/postfix restart pour relancer le tout, et c’est parti !

3) Sender Id et OpenSPF

Alors là, c’est un peu le bazar à comprendre. OpenSPF est une initiative du monde OpenSource destiné à consolider les transactions mails, en déclarant à l’avance, dans le DNS même, qui peut envoyer des mails, qui peut en recevoir, etc.. Sender-Id est une technologie propriétaire de Microsoft permettant de déterminer les mails autorisés à passer sur Hotmail. Problème : Sender-Id est très largement inspiré d’OpenSPF, ne se différençiant que sur quelques détails. Ce petit détail a d’ailleurs été le sujet d’un conflit juridique lors de la publication d’une RFC certifiant Sender-Id.

Côté Microsoft, il existe un Wizard permettant de générer la chaine SPF à insérer dans votre config DNS. Ca fonctionne pas mal, on peut donc l’utiliser sans mal.

Au final, tout ceci est à insérer dans sa configuration DNS sous la forme d’un champ “TXT”, champ un peu fourre-tout. Restons simple, j’ai rentré une configuration de type : “v=spf1 ip4:213.251.168.95 -all”.

Après validation, un coup de dig -t TXT mondomaine.com permet de contrôler que tout va bien :

;; ANSWER SECTION:
tof-it.com. 600 IN TXT “v=spf1 ip4:213.251.168.95 -all”

4) Déclaration dans la whitelist de Hotmail

Petit bonus, l’inscription dans la “whitelist” de Hotmail, qui recense les noms de domaines de confiance. Pour cela, il faut utiliser ce formulaire.

Dans le même ordre d’idée, Microsoft fournit cet outil, que je n’ai pas vraiment testé, qui semble vous donner des informations sur le trafic mail en provenance de votre serveur vers les serveurs MSN, ainsi que la manière dont ils sont traités.

5) Personnaliser son PTR

Si vous utilisez un serveur dédié, il y a de fortes chances que votre hébergeur vous aie attribué un nom “générique” pour votre serveur style nsXXXXXX.ovh.net. D’après certaines documentations, il semblerai que ça soit une bonne idée de modifier ce nom là, et donc le champ PTR. D’ailleurs, certains sites recensant des blacklists de serveurs SMTP sont sensibles à ce détail : je me suis retrouvé dans la base de blacklists de SpamCannibal simplement parce qu’un autre serveur dédié utilisant un nom PTR générique envoyait des mails douteux !

Pour cela, avec le manager OVH (par exemple), vous avez une rubrique “Reverse” dans votre configuration de serveur dédié, qui va vous permettre d’attribuer le nom de votre choix. Attention, ce nom (par exemple, monserveur.mondomaine.com) doit exister dans les champs A de votre DNS !