Prenons l'exemple le plus répandu. Vous hébergez un site de e-commerce propulsé par Magento, vous voulez que les emails soient envoyés avec en expéditeur votre adresse monbeausite@gmail.com. Vous configurez cette adresse d'expéditeur dans le Magento, et les mails partent bien, c'est super.

Quelques jours plus tard, vous remarquez que tous vos emails arrivent en Spam chez Gmail et Outlook. Que se passe-t-il ? Comment faire en sorte d'envoyer ces emails plus proprement ?

SPF

Tout d'abord, que se passe-t-il ? C'est très simple, Gmail reçoit un email provenant d'une adresse @gmail.com, mais cet email ne vient pas des serveurs de Gmail, il arrive d'un serveur inconnu. Il considère donc qu'il s'agit probablement de spam.

Par extension de ce principe, Google a défini dans les DNS de gmail.com une entrée nommée SPF :

# dig TXT gmail.com
"v=spf1 redirect=_spf.google.com"
# dig TXT _spf.google.com
"v=spf1 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com
# dig TXT _netblocks.google.com
~all"o"v=spf1 ip4:64.18.0.0/20 ip4:64.233.160.0/19 ip4:66.102.0.0/20 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:74.125.0.0/16 ip4:108.177.8.0/21 ip4:173.194.0.0/16 ip4:207.126.144.0/20 ip4:209.85.128.0/17 ip4:216.58.192.0/19 ip4:216.239.32.0/19 ~all"

Cette entrée définit la liste des serveurs autorisés par Google à envoyer des emails en @gmail.com. Comme vous pouvez l'imaginer, votre serveur n'est pas dans cette liste, et les destinataires tels que Hotmail auront une tendance naturelle à considérer vos emails comme des spam.

Envoyer les emails proprement

Alors que faire ? La solution la plus propre est d'utiliser le protocole Submission pour soumettre les mails à Gmail de manière authentifiée, exactement comme vous le faites depuis votre client de messagerie. Ainsi, ce ne sera plus votre serveur qui expédiera l'email, mais bien Gmail, et il n'y aura plus de problème de mise en spam.

Le problème, c'est que ça n'est pas si simple :

  • Magento ne permet pas de configurer un serveur sortant, il ne sait envoyer les emails que via PHP ;
  • Sous GNU/Linux, PHP ne peut pas être configuré pour utiliser un serveur sortant, il ne sait que passer les mails à une commande sendmail (qui, elle, peut-être définie).
  • Vous ne pouvez pas configurer Postfix pour router tous les emails vers Gmail, car vos emails système ne seront probablement pas relayés.

À partir de là, il y a deux solutions :

  • Configurer la variable sendmail_path dans le fichier php.ini pour définir une commande qui passera l'email à Gmail par submission. Vous pouvez par exemple utiliser msmtp.
  • Configurer Postfix pour router par Gmail uniquement les emails ayant pour source une adresse @gmail.com.

Il n'y a pas de meilleure solution, ça dépend complètement de votre situation. Mais ici je ne vais décrire que la deuxième.

Router en fonction de la source dans Postfix

La configuration se fait en plusieurs fichiers. Il nous faut d'abord un fichier contenant les identifiants du compte Gmail, /etc/postfix/sasl_password :

[smtp.gmail.com]:587 monbeausite@gmail.com:monbeaumotdepasse

Une fois ce fichier créé, il faut bien entendu en limiter l'accès, puis le compiler dans un format lisible par Postfix :

# postmap /etc/postfix/sasl_passwd

Puis la route doit être mise en place dans /etc/postfix/sender_transport :

@gmail.com smtp:[smtp.gmail.com]:587

Et compilée :

# postmap /etc/postfix/sender_transport

Et ces deux fichiers doivent bien entendu être référencés dans la configuration de Postfix, en ajoutant les lignes suivantes dans le fichier /etc/postfix/main.cf :

…
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_use_tls = yes
inet_protocols = all
sender_dependent_default_transport_maps = hash:/etc/postfix/sender_transport
…

Enfin, il suffit de recharger Postfix pour prendre en compte les nouveautés :

# service postfix force-reload

Tester

Pour tester, il suffit d'envoyer un email ayant pour source une adresse Gmail, et regarder dans les logs ce qu'il se passe.

# echo "Test mail from postfix" | mail -s "Test Postfix" -r monbeausite@gmail.com monemailperso@hotmail.fr

Jusqu'ici, Postfix aurait passé l'email à un serveur de réception de Google, tels que ceux que l'on trouve via la commande dig MX gmail.com. Avec votre nouvelle configuration, Postfix devrait passer l'email au serveur smtp.gmail.com, comme ceci :

Oct  9 09:59:34 example postfix/qmgr[29562]: 9A362540070A: from=<monbeausite@gmail.com>, size=464, nrcpt=1 (queue active)
Oct  9 09:59:36 example postfix/smtp[28508]: 9A362540070A: to=<monemailperso@hotmail.fr>, relay=smtp.gmail.com[74.125.133.109]:587, delay=1.5, delays=0.1/0.01/0.22/1.1, dsn=2.0.0, status=sent (250 2.0.0 OK 1444377576 go5sm1713189wib.3 - gsmtp)
Oct  9 09:59:36 example postfix/qmgr[29562]: 9A362540070A: removed

À propos de l'auteur



Guillaume est l'un des deux fondateurs et cogérants de Sysnove. Développeur Python et administrateur système passionné de logiciel libre et des technologies liées à Internet, il participe à divers projets, notamment le fournisseur d'accès Internet Aquilenet ainsi que la Fédération FDN.

Chez Sysnove, son rôle consiste à mettre en place et administrer les infrastructures nécessaires à l'hébergement des services fournis aux clients. En tant que directeur général, il gère aussi les aspects administratifs de l'entreprise.