Il existe beaucoup d’articles sur ce sujet mais aucun avec la configuration que j’ai mise en place. Du coup je ne sais pas si cela va servir à quelqu’un mais dans le doute je me permets d’expliquer ma configuration. Le but de cet article est d’expliquer comment envoyer des emails depuis votre serveur de messagerie personnel.
L’auto-herbergement de ces types de services (serveur web, serveur mail, serveur de fichiers, etc.) augmente régulièrement depuis de nombreuses années et avec l’arrivée des micro-ordinateurs (comme Raspberry), cette tendance ne fait que de s’amplifier. J’ai donc décidé d’héberger mon serveur de messagerie personnel.
Pour héberger un serveur de messagerie pour lequel vous souhaitez envoyer et recevoir des emails depuis le réseau Internet, vous devez au préalable avoir un enregistrement DNS type MX valide. Pour cela, j’utilise le service de « DNS Dynamic » noip. J’associe à mon enregistrement DNS type A, un enregistrement DNS type MX portant le même nom.
$ host server.noipdomain.net myserver.mydomain.net has address x.x.x.x myserver.mydomain.net mail is handled by 10 myserver.mydomain.net.
J’ai mis en place l’environnement technique suivant :
- Micro-ordinateur Raspberry 3 Model B
- Image RaspBSD (r313109M) (FreeBSD 11.0 pour arm64)
- Sendmail avec le support de SASL
La difficulté n’est pas tant de recevoir les emails depuis Internet mais bien de les envoyer depuis votre serveur de messagerie vers Internet. En effet pour éviter la diffusion de SPAM les opérateurs télécoms ont bloqués les connexions (depuis les box) vers les serveurs de messageries. Il est donc nécessaire d’utiliser un relai SMTP valide pour envoyer un email.
Mon fournisseur d’accès Internet est Orange, j’utilise donc leur relai de messagerie (smtp.orange.fr). La connexion au relai de messagerie chez Orange nécessite une authentification (d’où le support de SASL pour Sendmail). Pour une question de sécurité, j’ai créé un compte de messagerie spécifique. La procédure de création d’une boîte aux lettres secondaire est décrite ici.
Vérifier le support de SASL dans Sendmail via la commande suivante :
# /usr/local/sbin/sendmail -d0.1 -bv root Version x.xx.x Compiled with: DNSMAP IPV6_FULL LOG MAP_REGEX MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6 NETUNIX NEWDB NIS PICKY_HELO_CHECK PIPELINING SASLv2 SCANF STARTTLS TCPWRAPPERS USERDB XDEBUG ============ SYSTEM IDENTITY (after readcf) ============ (short domain name) $w = myserver (canonical domain name) $j = myserver.mydomain.net (subdomain name) $m = mydomain.net (node name) $k = myserver ======================================================== root... deliverable: mailer local, user root
Si le support de SASL n’est pas disponible dans Sendmail, je vous invite à suivre la procédure de compilation d’écrite dans le Handbook de FreeBSD.
Il faut créer le fichier d’authentification au serveur relai de messagerie. J’utilise ici le compte de messagerie spécifique que j’ai créé :
# cat authinfo AuthInfo:smtp.orange.fr "U:root" "I:xxx@orange.fr" "P:pass" "M:LOGIN" AuthInfo:smtp.orange.fr:587 "U:root" "I:xxx@orange.fr" "P:pass" "M:LOGIN"
Une fois le fichier généré, il faut créer la table correspondante :
# makemap hash authinfo < authinfo
Il faut insérer les macros suivante à votre configuration de sendmail (modifier le ficher <server>.mc) :
dnl SMART HOST CONFIG define(`SMART_HOST', `smtp.orange.fr')dnl define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl define(`confAUTH_MECHANISMS', `GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl FEATURE(`authinfo',`hash /etc/mail/authinfo.db')dnl TRUST_AUTH_MECH(`GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
On génère le fichier de configuration via la commande make et on n’oublie pas de recopier le fichier de configuration :
# cd /etc/mail && make /usr/bin/m4 -D_CF_DIR_=/usr/local/share/sendmail/cf/ /usr/local/share/sendmail/cf/m4/cf.m4 server.mc > unixme.cf /usr/bin/m4 -D_CF_DIR_=/usr/local/share/sendmail/cf/ /usr/local/share/sendmail/cf/m4/cf.m4 server.submit.mc > server.submit.cf # cp server.cf sendmail.cf
Un arrêt / relance de sendmail est nécessaire pour prendre en compte les modifications :
# service sendmail stop Stopping sendmail. Waiting for PIDS: 37413. Stopping sendmail_msp_queue. Waiting for PIDS: 36932. # service sendmail start Starting sendmail. Starting sendmail_msp_queue.
Maintenant il suffit de tester notre configuration :
$ mail -v -s Test <messagerie@test.fr> test send . EOT messagerie@test.fr... Connecting to [127.0.0.1] via relay... 220 myserver.mydomain.net ESMTP Sendmail x.xx.x/x.xx.x; Fri, 14 Apr 2017 16:16:59 +0200 (CEST) >>> EHLO myserver.mydomain.net 250-myserver.mydomain.net Hello localhost [127.0.0.1], pleased to meet you 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-8BITMIME 250-SIZE 250-DSN 250-ETRN 250-AUTH DIGEST-MD5 CRAM-MD5 LOGIN PLAIN 250-STARTTLS 250-DELIVERBY 250 HELP >>> STARTTLS 220 2.0.0 Ready to start TLS >>> EHLO myserver.mydomain.net 250-myserver.mydomain.net Hello localhost [127.0.0.1], pleased to meet you 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-8BITMIME 250-SIZE 250-DSN 250-ETRN 250-AUTH DIGEST-MD5 CRAM-MD5 LOGIN PLAIN 250-DELIVERBY 250 HELP >>> MAIL From:<moi@myserver.mydomain.net> SIZE=53 AUTH=moi@myserver.mydomain.net 250 2.1.0 <moi@myserver.mydomain.net>... Sender ok >>> RCPT To:<messagerie@test.fr> >>> DATA 250 2.1.5 <messagerie@test.fr>... Recipient ok 354 Enter mail, end with "." on a line by itself >>> . 250 2.0.0 v3EEGxQi037463 Message accepted for delivery messagerie@test.fr... Sent (v3EEGxQi037463 Message accepted for delivery) Closing connection to [127.0.0.1] >>> QUIT 221 2.0.0 myserver.mydomain.net closing connection
Les logs de Sendmail indique les échanges suivants :
Apr 14 16:16:59 myserver sendmail[37462]: v3EEGx4r037462: from=moi, size=53, class=0, nrcpts=1, msgid=<201704141416.v3EEGx4r037462@myserver.mydomain.net>, relay=moi@localhost Apr 14 16:16:59 myserver sm-mta[37463]: STARTTLS=server, relay=localhost [127.0.0.1], version=TLSv1.2, verify=NO, cipher=ECDHE-RSA-AES256-GCM-SHA384, bits=256/256 Apr 14 16:16:59 myserver sendmail[37462]: STARTTLS=client, relay=[127.0.0.1], version=TLSv1.2, verify=FAIL, cipher=ECDHE-RSA-AES256-GCM-SHA384, bits=256/256 Apr 14 16:16:59 myserver sm-mta[37463]: v3EEGxQi037463: from=<moi@myserver.mydomain.net>, size=383, class=0, nrcpts=1, msgid=<201704141416.v3EEGx4r037462@myserver.mydomain.net>, proto=ESMTPS, daemon=IPv4, relay=localhost [127.0.0.1] Apr 14 16:16:59 myserver sendmail[37462]: v3EEGx4r037462: to=messagerie@test.fr, ctladdr=moi (1000/0), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=30053, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (v3EEGxQi037463 Message accepted for delivery) Apr 14 16:17:00 myserver sm-mta[37465]: v3EEGxQi037463: to=<messagerie@test.fr>, ctladdr=<moi@myserver.mydomain.net> (1000/0), delay=00:00:01, xdelay=00:00:01, mailer=relay, pri=30383, relay=smtp.orange.fr. [x.x.x.x], dsn=2.0.0, stat=Sent (8EGz1v00h4tU8mL03EGzx4 mail accepted for delivery)
Le relai de messagerie d’Orange a bien pris en compte l’envoi de l’email. Reste à vérifier depuis le client de messagerie distant la bonne réception de cet email. L’entête du message permet de suivre son cheminement :
... Received: from smtp.smtpout.orange.fr (smtp08.smtpout.orange.fr [x.x.x.x]) by in12.mail.test.fr (Postfix) with ESMTPS id 4C012FC3 for <messagerie@test.fr>; Fri, 14 Apr 2017 16:17:00 +0200 (CEST) Received: from myserver.mydomain.net ([x.x.x.x]) by mwinf5d68 with ME id 8EGz1v00h4tU8mL03EGzx4; Fri, 14 Apr 2017 16:17:00 +0200 ...
Si jamais vous avez des questions ou besoin de plus de détails sur la configuration mise en place , nécessitez pas à me les poser via un commentaire.