Sèkun blog


Récupérer ses emails outlook via mbsync pour une consultation sur emacs avec l'oauth2

2024-07-31 sys | tags : mail oauth2

Contexte

Suite à un changement au sein de mon institution d'un Zimbra auto-hébergé vers la plateforme office365, récupérer des emails via mbsync ne fonctionnait plus: une authentification oauth2 est obligatoire. J'ai testé de suivre cet article de blog, la récupération des emails fonctionnaient bien, mais moins l'envoi. Alors je me suis tourné vers un proxy hébergé en local, écrit en python, le tout tenant dans un seul fichier: emailproxy.

Configuration de emailproxy

Je suis passé par pip pour l'installer:

DIR="~/prog/emailproxy"
mkdir -p "$DIR"
pushd "$DIR"
# création de l'environnement virtuel
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install emailproxy[gui]

J'ai adapté le fichier de configuration, et utilisé comme client_id et client_secret ceux figurant sur l'article de blog ci-haut:

client_id = 08162f7c-0fd2-4200-a84a-f25a4db0b584
client_secret = TxRBilcHdC6WGBee]fs?QR:SJ8nI[g82

Il semble qu'ils proviennent de Thunderbird, bien que le secret ne soit pas dans le code source.

J'obtiens ceci au final:

[Email OAuth 2.0 Proxy configuration file]
[Server setup]
[IMAP-1501]
server_address = outlook.office365.com
server_port = 993
local_address = 127.0.0.1

[SMTP-1502]
server_address = smtp-mail.outlook.com
server_port = 587
server_starttls = True
local_address = 127.0.0.1

[Account setup]
[my_office365_email_address]
permission_url = https://login.microsoftonline.com/common/oauth2/v2.0/authorize
token_url = https://login.microsoftonline.com/common/oauth2/v2.0/token
oauth2_scope = https://outlook.office365.com/IMAP.AccessAsUser.All https://outlook.office365.com/POP.AccessAsUser.All https://outlook.office365.com/SMTP.Send offline_access
redirect_uri = http://localhost
client_id = 08162f7c-0fd2-4200-a84a-f25a4db0b584
client_secret = TxRBilcHdC6WGBee]fs?QR:SJ8nI[g82

[emailproxy]
delete_account_token_on_password_error = True
encrypt_client_secret_on_first_use = False
allow_catch_all_accounts = False

Le serveur proxy écoutera sur les ports 1501 (pour imap) et 1502 (pour smtp).

Je n'ai pas réussi à faire fonctionner l'UI sur i3 (enfin l'icône apparaissait bien dans le tray, mais aucune interaction possible avec). Je lance le proxy via la commande suivante: emailproxy --local-server-auth.

Puis je me connecte manuellement via telnet, sur une autre console:

telnet 127.0.0.1 1501
a1 login my_office365_email_address my_password

Sur la console de emailproxy, une url apparaît. Je la copie-colle dans le navigateur, me connecte à mon compte office365. Je suis ensuite redirigé vers localhost, je colle l'url dans la console de emailproxy. emailproxy modifie alors le fichier de configuration, et telnet m'indique que la connexion s'est bien passée.

Configuration de mbsync

J'installe le paquet isync, et configure le client mbsync via le fichier ~/.mbsynrc.

IMAPAccount myaccount
Host localhost
User my_office365_email_address
Port 1501
SSLType None

IMAPStore myaccount-remote
Account myaccount

MaildirStore myaccount-local
Path ~/Mail/myaccount/
Inbox ~/Mail/myaccount/INBOX
SubFolders Verbatim

Channel myaccount
Far :myaccount-remote:
Near :myaccount-local:
Patterns *
Create Both
Expunge Both
SyncState *

Les mails seront stockés dans ~/Mail/myaccount/ et ~/Mail/myaccount/INBOX. Les deux dossiers sont à créer pour éviter un segmentation fault.

Article publié le 31 juillet 2024.