Deblan blog

[tips] Envoyer du mail depuis un post de développement

Le développement d'applications web nécessite souvent l'envoi d'emails, ne serait-ce que pour la gestion d'un espace membre par exemple. On a deux façons de voir les choses quand on est encore en phase de développement :

  • Utiliser un serveur de mail "fake" qui va délivrer une copie du mail si il avait été envoyé
  • Utiliser un vrai serveur d'envoi de mail

La première méthode est pas mal du tout, cependant il arrivera le moment où il faudra vraiment envoyer le mail, ne serait-ce que pour s'assurer qu'on n'est pas passé à côté de quelque chose (comme un problème lié aux clients mails). Ainsi, je suis assez partisant d'envoyer du vrai mail, même dans la phase de développement.

Pour se faire, deux nouvelles solutions s'offrent à nous :

  • Passer par un serveur de mail en local pour délivrer le mail
  • Passer par un relais SMTP pour délivrer le message

Dans le premier cas, vous avez 1 chance sur 100 que le message ne soit pas bloqué par les services anti-spam. Du coup, on va préférer passer un relais SMTP qui lui ne devrait pas poser de problème.

Pour se faire, on va installer un serveur de mail en local puis configurer un relais SMTP. Ça veut dire que le serveur de mail va faire office de client pour se connecter à un autre serveur de mail pour délivrer nos messages. Le principal intérêt de cette méthode est que quelque soit le programme qui enverra du mail en utilisant le serveur de mail "localhost" pourra faire transiter les messages vers le relais SMTP et les délivrer correctement.

Le seul pré-requis est d'avoir un relais SMTP sur lequel se connecter. En d'autres mots, vous devez avoir un prestataire d'envoie de mail qui n'est pas trop restrictif (donc pas Free par exemple) : OVH, Gandi, Gmail, …

Il faut déjà installer un serveur de mail sur sa machine. Je vous propose d'utiliser Postfix dont la renommée n'est pas à faire :

$ su - 
# aptitude update
# aptitude install postfix

Éditions à présent le fichier de conf (/etc/postfix/main.cf) :

[...]
myhostname = exemple.fr

relayhost = serveur.smtp.relais # exemple : mail.deblan.fr
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options =
[...]

Il est nécessaire de prévoir un fichier pour s'authentifier sur le serveur SMTP relais :

# touch /etc/postfix/sasl_passwd
# echo "serveur.smtp.relais login:password" > /etc/postfix/sasl_passwd

Modifiez le login et le password, si le login contient un "@", remplacez le par "#".

# postmap /etc/postfix/sasl_passwd (à faire à chaque modification du fichier)
# chown root:root /etc/postfix/sasl_passwd*
# chmod 600 /etc/postfix/sasl_passwd*
# service postfix restart

À présent, si le relais mail n'est pas bloquant et que les identifiants sont bons, vous passerez par un "vrai" serveur de mails pour délivrer les messages de votre espaces de développement (et pas que).

Si vous envoyez le mail au nom d'un domaine qui n'est pas celui du serveur de mail, il faudra prendre le temps de faire une configuration SPF pour rendre l'envoi de mail légitime depuis ce serveur relais. À titre d'exemple, j'ai deux serveurs de mails qui peuvent délivrer des messages avec comme domaine d'expédition "deblan.fr". Les ip's associées sont 5.135.190.125 et 109.190.159.83. Voici les entrées DNS que j'ai créées :

$ dig -t TXT deblan.fr
[...]
deblan.fr. 10739 IN TXT	"spf2.0/mfrom mx ip4:109.190.159.83 ip4:5.135.190.125 ~all"
deblan.fr. 10739 IN TXT	"v=spf1 ip4:109.190.159.83 ip4:5.135.190.125 ~all"
[...]

$ dig -t SPF deblan.fr
[...]
deblan.fr. 10739 IN	SPF	"spf2.0/mfrom mx ip4:109.190.159.83 ip4:5.135.190.125 ~all"
deblan.fr. 10739 IN	SPF	"v=spf1 ip4:109.190.159.83 ip4:5.135.190.125 ~all"
[...]

Si je fais un test de query SPF, voilà résultats :

$ spfquery -i 5.135.190.125 -s foo@deblan.fr | tail -n 1
Received-SPF: pass (spfquery: domain of deblan.fr designates 5.135.190.125 as permitted sender) client-ip=5.135.190.125; envelope-from=foo@deblan.fr;
'
$ spfquery -i 109.190.159.83 -s foo@deblan.fr | tail -n 1
Received-SPF: pass (spfquery: domain of deblan.fr designates 109.190.159.83 as permitted sender) client-ip=109.190.159.83; envelope-from=foo@deblan.fr;

$ spfquery -i 1.2.3.4 -s foo@deblan.fr | tail -n 1
Received-SPF: softfail (spfquery: transitioning domain of deblan.fr does not designate 1.2.3.4 as permitted sender) client-ip=1.2.3.4; envelope-from=foo@deblan.fr;

Les 2 ip's que je rend légitimes passent le test sans problème alors que le 3ème est en échec. Ce test SPF devient très important et par expérience, c'est la source de beaucoup de rejets. Si vous avez des IPV6, pensez à les déclarer, je me suis fais avoir il y a quelques jours encore :)

J'espère que ça vous sera utile :)


Ajouter un commentaire

Vous pouvez utiliser du markdown.Afficher l'aide.