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 fichierphp.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