Cet article décrit la configuration d’un compte email Office 365 avec ses identifiants SMTP comme smarthost d’émission Exim 4 sur un serveur Debian 10. Vous pourrez donc émettre des emails depuis un compte Office 365. Si votre adresse IP a été bannie par les serveurs de Microsoft, ce qui vous empêche d’émettre le courrier directement depuis votre IP, utiliser un compte Office 365 vous permettra de contourner le bannissement IP. De même, depuis une box internet grand public, il est interdit par la plupart des sentinelles anti-spam d’émettre des emails en direct. Si vous souhaitez plutôt utiliser un compte email OVH comme tel, l’explication est dans cet article.
Les mainteneurs de distributions comme Debian font un travail fantastique pour proposer une logique de configuration (cf. article Travailler avec Exim4 sur Debian), mais il faut avouer que la configuration d’Exim pour ce genre d’opérations est toujours délicate.
Les identifiants de connexion
Pour commencer, le compte email Office 365 pressenti dans cet exemple est supposé fonctionner avec les réglages suivants :
- Serveur : smtp.office365.com
- Port : 587
- Sécurité : SSL/TLS
- Identifiant : adresse@domaine.fr
- Mot de passe : password
En réalité il semblerait que Mictosoft utilise STARTTLS sur le port 587 et non pas SSL/TLS.
Tester le protocole de chiffrement de la connexion
Un outil très sympathique pour débugger les problèmes de connexion avec un serveur SMTP sécurisé SSL ou TLS est smtptest dans le paquet Debian cyrus-clients . Je l’ai découvert dans cette mailing-list.
La tentative suivante (SSL) échoue :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
root@serveur:/etc/exim4# /usr/lib/cyrus/bin/smtptest -u adresse@domaine.fr -s -p 587 smtp.office365.com -v starting TLS engine setting up TLS connection SSL_connect:before SSL initialization write to 558A2C995900 [558A2C9A5B20] (176 bytes => 176 (0xB0)) 0000 16 03 01 00 ab 01 00 00|a7 03 03 08 04 de 18 54 [...] SSL_connect:SSLv3/TLS write client hello read from 558A2C995900 [558A2C99C963] (5 bytes => 5 (0x5)) 0000 32 32 30 20 41 SSL_connect:error in SSLv3/TLS write client hello -1 SSL_connect error -1 SSL session removed failure: TLS negotiation failed! |
La tentative suivante (TLS) fonctionne :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
root@serveur:/etc/exim4# /usr/lib/cyrus/bin/smtptest -u adresse@domaine.fr -a adresse@domaine.fr -t "" -p 587 smtp.office365.com -v S: 220 AM0PR04CA0138.outlook.office365.com Microsoft ESMTP MAIL Service ready at Thu, 10 Sep 2020 08:28:41 +0000 C: EHLO smtptest S: 250-AM0PR04CA0138.outlook.office365.com Hello [176.31.182.18] S: 250-SIZE 157286400 S: 250-PIPELINING S: 250-DSN S: 250-ENHANCEDSTATUSCODES S: 250-STARTTLS S: 250-8BITMIME S: 250-BINARYMIME S: 250-CHUNKING S: 250 SMTPUTF8 C: STARTTLS S: 220 2.0.0 SMTP server ready starting TLS engine setting up TLS connection SSL_connect:before SSL initialization write to 562C92CBF900 [562C92CCFB20] (176 bytes => 176 (0xB0)) 0000 16 03 01 00 ab 01 00 00|a7 03 03 c0 2c c5 79 7d [...] SSL_connect:SSLv3/TLS write client hello read from 562C92CBF900 [562C92CC6963] (5 bytes => 5 (0x5)) 0000 16 03 03 0f 2f read from 562C92CBF900 [562C92CC6968] (3887 bytes => 1455 (0x5AF)) 0000 02 00 00 51 03 03 5f 59|e3 b9 16 48 fb 99 6a 6c [...] read from 562C92CBF900 [562C92CC6F17] (2432 bytes => 2432 (0x980)) 0000 6d 82 16 6d 61 69 6c 2e|73 65 72 76 69 63 65 73 [...] 0980 - <SPACES/NULS> SSL_connect:SSLv3/TLS write client hello SSL_connect:SSLv3/TLS read server hello Peer cert verify depth=1 /C=BE/O=GlobalSign nv-sa/CN=GlobalSign Organization Validation CA - SHA256 - G3 verify error:num=20:unable to get local issuer certificate verify return:1 Peer cert verify depth=0 /C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/CN=outlook.com verify return:1 SSL_connect:SSLv3/TLS read server certificate SSL_connect:SSLv3/TLS read server key exchange SSL_connect:SSLv3/TLS read server certificate request SSL_connect:SSLv3/TLS read server done SSL_connect:SSLv3/TLS write client certificate SSL_connect:SSLv3/TLS write client key exchange SSL_connect:SSLv3/TLS write change cipher spec write to 562C92CBF900 [562C92CCFB20] (170 bytes => 170 (0xAA)) 0000 16 03 03 00 07 0b 00 00|03 00 00 00 16 03 03 00 [...] SSL_connect:SSLv3/TLS write finished read from 562C92CBF900 [562C92CC6963] (5 bytes => 5 (0x5)) 0000 14 03 03 00 01 read from 562C92CBF900 [562C92CC6968] (1 bytes => 1 (0x1)) 0000 01 SSL_connect:SSLv3/TLS write finished read from 562C92CBF900 [562C92CC6963] (5 bytes => 5 (0x5)) 0000 16 03 03 00 28 read from 562C92CBF900 [562C92CC6968] (40 bytes => 40 (0x28)) 0000 00 00 00 00 00 00 00 00|3f 1f 8a 87 b1 8b 23 37 [...] SSL_connect:SSLv3/TLS read change cipher spec SSL_connect:SSLv3/TLS read finished subject_CN=outlook.com, issuer_CN=GlobalSign Organization Validation CA - SHA256 - G3 TLS connection established: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits) Asking for capabilities again since they might have changed C: EHLO smtptest write to 562C92CBF900 [562C92CCAAB3] (44 bytes => 44 (0x2C)) 0000 17 03 03 00 27 6d 41 d6|32 20 8d f7 6e 0b 93 1f [...] read from 562C92CBF900 [562C92CC6963] (5 bytes => 5 (0x5)) 0000 17 03 03 00 ef read from 562C92CBF900 [562C92CC6968] (239 bytes => 239 (0xEF)) 0000 00 00 00 00 00 00 00 01|d4 e4 cf 26 d3 51 db c0 [...] S: 250-AM0PR04CA0138.outlook.office365.com Hello [176.31.182.18] S: 250-SIZE 157286400 S: 250-PIPELINING S: 250-DSN S: 250-ENHANCEDSTATUSCODES S: 250-AUTH LOGIN XOAUTH2 S: 250-8BITMIME S: 250-BINARYMIME S: 250-CHUNKING S: 250 SMTPUTF8 C: AUTH LOGIN write to 562C92CBF900 [562C92CCAAB3] (41 bytes => 41 (0x29)) 0000 17 03 03 00 24 6d 41 d6|32 20 8d f7 6f 2c 04 d6 [...] read from 562C92CBF900 [562C92CC6963] (5 bytes => 5 (0x5)) 0000 17 03 03 00 2a read from 562C92CBF900 [562C92CC6968] (42 bytes => 42 (0x2A)) 0000 00 00 00 00 00 00 00 02|f9 a7 b8 b9 2e 83 ff 55 [...] S: 334 VXNlcm5hbWU6 Please enter your password: |
La configuration Exim
Pour commencer, il faut configurer le fichier update-exim4.conf.conf comme ceci, soit par une édition en mode texte, soit par la commande dpkg-reconfigure exim4-config :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
dc_eximconfig_configtype='smarthost' dc_other_hostnames='' dc_local_interfaces='127.0.0.1' dc_readhost='domaine.fr' dc_relay_domains='' dc_minimaldns='false' dc_relay_nets='' dc_smarthost='smtp.office365.com::587' CFILEMODE='644' dc_use_split_config='false' dc_hide_mailname='true' dc_mailname_in_oh='true' dc_localdelivery='mail_spool' |
Je ne connais pas la signification du double deux-points dans smtp.office365.com::587. Avec un seul, cela semble fonctionner également. En outre l’adresse localhost en IPv6 a été retirée comme une tentative non fructueuse d’empêcher toute connexion IPv6 aux autres serveurs email.
Au tour du fichier exim4.conf.template, parce qu’ici la configuration se fait dans un fichier unique (ligne dc_use_split_config='false' du précédent fichier). La ligne 1705 protocol = smtps a été commentée car elle se réfère au chiffrement SSL et qu’elle empêche l’établissement normal des connexions STARTTLS avec les serveurs de Microsoft.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
### transport/30_exim4-config_remote_smtp_smarthost ################################# # This transport is used for delivering messages over SMTP connections # to a smarthost. The local host tries to authenticate. # This transport is used for smarthost and satellite configurations. # Refuse to send any messsage with over-long lines, which could have # been received other than via SMTP. The use of message_size_limit to # enforce this is a red herring. remote_smtp_smarthost: debug_print = "T: remote_smtp_smarthost for $local_part@$domain" driver = smtp #protocol = smtps .ifndef IGNORE_SMTP_LINE_LENGTH_LIMIT message_size_limit = ${if > {$max_received_linelength}{998} {1}{0}} .endif hosts_try_auth = <; ${if exists{CONFDIR/passwd.client} \ {\ ${lookup{$host}nwildlsearch{CONFDIR/passwd.client}{$host_address}}\ }\ {} \ } |
J’ai tenté de configurer le fichier exim4.conf.localmacros avec les macros REMOTE_SMTP_SMARTHOST_HOSTS_REQUIRE_TLS (valeur *) et TLS_ON_CONNECT_PORTS (valeur 587) mais cela s’est avéré non-nécessaire.
Pour terminer, les identifiants de connexion ont été configurés comme ceci dans passwd.client :
1 2 3 4 5 6 7 8 |
# password file used when the local exim is authenticating to a remote # host as a client. # # see exim4_passwd_client(5) for more documentation # # Example: ### target.mail.server.example:login:password *:adresse@domaine.fr:password |
A noter qu’avec le signe étoile, ces identifiants seront utilisés pour tous les serveurs smarthost. Cela est nécessaire pour matcher avec tous les reverse DNS (rDNS) utilisés par Microsoft sur les domaines office365.com, office.com, etc. Ici, aucun problème car nous avons configuré un seul et unique compte smarthost.
A l’utilisation
Limitation dans l’adresse d’expédition
Il semblerait que les comptes Office 365 disposent d’une sécurité qui empêche d’émettre un email sous une adresse différente de l’adresse officielle et utilisée comme identifiant. C’est une sécurité bienvenue dans un monde où le SPAM sévit, mais qui peut limiter l’utilisation du compte en tant que smarthost.
Exemple de log si on cherche à utiliser le compte adresse@domaine.fr pour émettre en tant que autre-adresse@autre-domaine.fr. Chercher SMTP error from remote mail server after end of data: 554 5.2.0 STOREDRV.Submission.Exception:SendAsDeniedException.MapiExceptionSendAsDenied; Failed to process message due to a permanent exception with message Cannot submit message.
1 2 |
2020-09-10 07:38:42 1kGFIA-00073d-Oq <= adresse@domaine.fr H=localhost.localdomain (serveur-web.domaine.fr) [127.0.0.1] P=smtp S=1297 id=Qx9YAqjyjpo1Hdf56PIAK0pIXjD9iB2WzHx6i8ZzI@autre-domaine.fr 2020-09-10 07:38:44 1kGFIA-00073d-Oq ** autre-adresse@autre-domaine.fr R=smarthost T=remote_smtp_smarthost H=AMS-efz.ms-acdc.office.com [40.101.81.146] X=TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256 CV=no DN="C=US,ST=Washington,L=Redmond,O=Microsoft Corporation,CN=outlook.com": SMTP error from remote mail server after end of data: 554 5.2.0 STOREDRV.Submission.Exception:SendAsDeniedException.MapiExceptionSendAsDenied; Failed to process message due to a permanent exception with message Cannot submit message. 0.35250:A92D0000, [...] |
Pour reproduire ce comportement il vous suffit de tenter d’émettre depuis une adresse différente de celle du compte O365. Par exemple en exécutant ce script Bash :
1 2 3 4 5 6 7 8 9 |
#!/bin/bash /usr/sbin/exim4 -v destin@taire.fr << EOF from: autre-adresse@autre-domaine.fr to: destin@taire.fr subject: test message test . EOF |
En argument derrière -v, on trouve l’adresse à laquelle le message sera envoyé. Derrière le champ to: on trouve l’adresse de destination qui sera affichée dans le logiciel de messagerie. Dans la plupart des cas ces deux adresses seront identiques.
La solution semble être de configurer l’ensemble des applications ou sites internet pour émettre en tant que l’adresse officielle du compte, dans cet exemple adresse@domaine.fr.
Une réécriture d’adresse email pour contourner cette limitation
Etant donné qu’il n’est pas toujours simple de modifier les applications émettrices d’email pour configurer un champ d’émetteur From: personnalisé, je vous propose de configurer Exim 4 pour mettre en place une réécriture d’adresse email à la volée.
Toujours dans le fichier de configuration, ici exim4.conf.template , ligne 1801 :
1 2 3 4 5 6 7 8 9 10 |
##################################################### ### rewrite/00_exim4-config_header ##################################################### ###################################################################### # REWRITE CONFIGURATION # ###################################################################### begin rewrite * adresse@domaine.fr Ffrs |
La réécriture consiste à remplacer toutes les adresses d’expédition (ici *) en adresse@domaine.fr. La troisième colonne « Ffrs » concerne les flags de configuration Exim pour traiter les champs suivants :
- F : champ enveloppe From:
- f : champ From:
- r : champ Reply-To:
- s: champ Sender:
Les différents flags possibles dans la configuration sont décrits ici.
Après un redémarrage du service Exim, la configuration d’un compte SMTP Office 365 devrait fonctionner correctement.