Office 365 / Outlook / Hotmail
Quel Mode Choisir ?
Section intitulée « Quel Mode Choisir ? »Choisissez Personnel si vous envoyez depuis une boîte Microsoft grand
public comme @outlook.com, @hotmail.com, @live.com ou @msn.com. Cette
méthode utilise une connexion unique pour obtenir un refresh_token, ensuite
renouvelé automatiquement par Apprise au fil des envois.
Choisissez Organisationnel si vous envoyez depuis un tenant Microsoft 365
professionnel ou scolaire adossé à Exchange Online. Cette méthode repose sur
un enregistrement d’application Azure et le flux client_credentials avec
votre tenant_id, client_id et client_secret.
Les comptes consommateurs personnels — @outlook.com, @hotmail.com,
@live.com, @msn.com et les variantes régionales Hotmail/Live — utilisent
un flux par jeton de rafraîchissement à la place du flux client credentials
organisationnel.
Ce processus comporte deux phases :
- Configuration unique : enregistrez une application cliente publique dans
Azure, puis exécutez un court script pour vous connecter et capturer votre
refresh_token. - Utilisation courante : Apprise utilise le
refresh_tokenstocké pour obtenir automatiquement des jetons d’accès de courte durée. Chaque envoi réussi renouvelle silencieusement le jeton de rafraîchissement, de sorte qu’il reste actif tant qu’Apprise est utilisé au moins une fois tous les 90 jours.
Enregistrement de l’application
Section intitulée « Enregistrement de l’application »-
Allez dans App Registrations dans le portail Azure et cliquez sur Register an application.
-
Donnez-lui un nom (ex.
Apprise Personnel). -
Sous Supported account types, sélectionnez Personal Microsoft accounts only.
-
Sous Redirect URI, choisissez Public client / native (mobile & desktop) et définissez l’URI sur :
https://login.microsoftonline.com/common/oauth2/nativeclient -
Cliquez sur Register.
-
-
Depuis le panneau Overview, copiez l’Application (client) ID - c’est votre
client_id. -
Sous Manage -> Authentication, faites défiler jusqu’à Advanced settings et définissez Allow public client flows sur Yes, puis cliquez sur Save. Cela active le flux de code d’appareil utilisé pour obtenir le jeton initial.
-
Sous Manage -> API permissions :
- Cliquez sur Add a permission -> Microsoft Graph -> Delegated Permissions
- Recherchez et cochez Mail.Send, puis cliquez sur Add permissions
Obtenir votre jeton de rafraîchissement
Section intitulée « Obtenir votre jeton de rafraîchissement »Il s’agit d’une étape unique. Les scripts ci-dessous utilisent le
flux de code d’appareil
de Microsoft : votre script affiche un code court et un lien ; vous ouvrez ce
lien dans n’importe quel navigateur et vous connectez ; le script capture
automatiquement votre refresh_token.
L’ensemble du processus prend généralement moins de deux minutes.
Seul requests est requis - déjà installé si vous avez Apprise.
Modifiez la ligne CLIENT_ID, puis copiez et collez l’intégralité du bloc
dans votre terminal.
import time, requests
# - Modifiez cette ligneCLIENT_ID = "your-client-id-here" # Application (client) ID depuis Azure# -
DEVICE_URL = "https://login.microsoftonline.com/consumers/oauth2/v2.0/devicecode"TOKEN_URL = "https://login.microsoftonline.com/consumers/oauth2/v2.0/token"SCOPE = "Mail.Send offline_access"
# Étape 1 - demander un code d'appareilr = requests.post(DEVICE_URL, data={"client_id": CLIENT_ID, "scope": SCOPE})r.raise_for_status()d = r.json()
# Étape 2 - le script affiche un lien et un code court ; ouvrez le lien dans# un navigateur et entrez le code pour vous connecter à votre compteprint("\n" + d["message"] + "\n")
# Étape 3 - interroger silencieusement jusqu'à la fin de la connexion (< 60 s)interval = d.get("interval", 5)while True: time.sleep(interval) r = requests.post(TOKEN_URL, data={ "client_id": CLIENT_ID, "grant_type": "urn:ietf:params:oauth:grant-type:device_code", "device_code": d["device_code"], }) t = r.json() if "refresh_token" in t: print("Votre refresh_token (à utiliser dans votre URL Apprise) :\n") print(t["refresh_token"]) break if t.get("error") == "slow_down": interval += 5 elif t.get("error") != "authorization_pending": print("Erreur :", t.get("error_description", t)) breakAucun outil externe au-delà de curl n’est nécessaire. Exécutez les étapes
ci-dessous dans la même session de terminal pour que les variables soient
conservées entre les étapes.
Étape 1 - Définir votre client ID et demander un code d’appareil
# - Modifiez cette ligne, puis collez l'intégralité du blocCLIENT_ID="your-client-id-here" # Application (client) ID depuis Azure# -
curl -s -X POST \ "https://login.microsoftonline.com/consumers/oauth2/v2.0/devicecode" \ --data "client_id=${CLIENT_ID}&scope=Mail.Send+offline_access"La réponse est du JSON. Repérez deux valeurs :
user_code- le code court à saisir dans le navigateur (ex.ABCD-EFGH)device_code- la longue chaîne opaque à coller à l’Étape 3 ci-dessous
Étape 2 - Se connecter chez Microsoft
Ouvrez microsoft.com/devicelogin dans
un navigateur et saisissez
le user_code obtenu ci-dessus. Connectez-vous avec votre compte Hotmail /
Outlook / Live et approuvez les permissions demandées.
Étape 3 - Coller le code d’appareil et récupérer votre jeton de rafraîchissement
# - Modifiez cette ligne avec la valeur device_code de l'Étape 1DEVICE_CODE="paste-device_code-here" # longue chaîne issue du JSON ci-dessus# -
# Exécutez ceci après avoir terminé l'Étape 2.# Si la réponse indique "authorization_pending", attendez quelques secondes# et réessayez - ou utilisez la boucle d'attente automatique dans l'astuce.curl -s -X POST \ "https://login.microsoftonline.com/consumers/oauth2/v2.0/token" \ --data "client_id=${CLIENT_ID}&grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Adevice_code&device_code=${DEVICE_CODE}"Repérez "refresh_token" dans la réponse JSON — cette valeur est celle à
placer dans votre URL Apprise.
Fonctionne sous Windows, macOS et Linux. Aucun module supplémentaire n’est
requis - Invoke-RestMethod est intégré.
Modifiez la ligne $ClientId, puis copiez et collez l’intégralité du bloc
dans un terminal PowerShell.
# - Modifiez cette ligne$ClientId = "your-client-id-here" # Application (client) ID depuis Azure# -
$Scope = "Mail.Send offline_access"$DeviceUrl = "https://login.microsoftonline.com/consumers/oauth2/v2.0/devicecode"$TokenUrl = "https://login.microsoftonline.com/consumers/oauth2/v2.0/token"
# Étape 1 - demander un code d'appareil$DeviceResp = Invoke-RestMethod -Method Post -Uri $DeviceUrl ` -Body @{ client_id = $ClientId; scope = $Scope }
# Étape 2 - le script affiche un lien et un code court ; ouvrez le lien dans# un navigateur et entrez le code pour vous connecterWrite-Host ""Write-Host $DeviceResp.messageWrite-Host ""
# Étape 3 - interroger silencieusement jusqu'à la fin de la connexion$DeviceCode = $DeviceResp.device_code$Interval = $DeviceResp.interval
do { Start-Sleep -Seconds $Interval try { $TokenResp = Invoke-RestMethod -Method Post -Uri $TokenUrl ` -Body @{ client_id = $ClientId grant_type = "urn:ietf:params:oauth:grant-type:device_code" device_code = $DeviceCode } } catch { $TokenResp = $_.ErrorDetails.Message | ConvertFrom-Json if ($TokenResp.error -eq "slow_down") { $Interval += 5 } }} until ($TokenResp.refresh_token -or $TokenResp.error -notin @("authorization_pending", "slow_down"))
if ($TokenResp.refresh_token) { Write-Host "Votre refresh_token (à utiliser dans votre URL Apprise) :`n" Write-Host $TokenResp.refresh_token} else { Write-Host "Erreur : $($TokenResp.error_description)"}Syntaxe personnelle
Section intitulée « Syntaxe personnelle »La syntaxe valide est la suivante, les alias o365:// et azure:// étant tous
deux acceptés :
o365://{source}/{client_id}/{refresh_token}/o365://{source}/{client_id}/{refresh_token}/{targets}
Apprise détecte automatiquement le mode personnel lorsque source est un
domaine consommateur connu (outlook.com, hotmail.com, live.com, msn.com
et variantes régionales). Utilisez ?mode=personal pour forcer le mode
personnel sur tout autre domaine.
Paramètres personnels
Section intitulée « Paramètres personnels »| Variable | Requis | Description |
|---|---|---|
| source | *Oui | Votre adresse e-mail consommateur (ex. user@outlook.com). Utilisée comme expéditeur et, si aucun targets n’est précisé, également comme destinataire. |
| client_id | *Oui | L’Application (client) ID issu de votre enregistrement d’application Azure. |
| refresh_token | *Oui | Le jeton de rafraîchissement obtenu lors de la configuration unique ci-dessus. Apprise le renouvelle automatiquement à chaque envoi réussi. |
| targets | Non | Une ou plusieurs adresses e-mail destinataires. Si omis, l’e-mail est envoyé à source. |
| to | Non | Alias de targets. Pratique dans une configuration YAML. |
| cc | Non | Une ou plusieurs adresses en copie carbone. Accepte des valeurs séparées par des virgules et des adresses nommées (ex. Nom <email@example.com>). |
| bcc | Non | Une ou plusieurs adresses en copie carbone invisible. Accepte des valeurs séparées par des virgules et des adresses nommées (ex. Nom <email@example.com>). |
| reply_to | Non | Une ou plusieurs adresses Répondre à. Lorsqu’un destinataire répond, sa réponse est dirigée ici plutôt que vers source. Accepte des valeurs séparées par des virgules et des adresses nommées. |
| mode | Non | Force le mode personnel sur un domaine non standard : ?mode=personal. |
Paramètres Globaux
Section intitulée « Paramètres Globaux »| Variable | Description |
|---|---|
| overflow | Ce paramètre peut être défini sur split, truncate ou upstream. Il détermine la manière dont Apprise remet le message que vous lui transmettez. Par défaut, il vaut upstream. 👉 upstream : ne fait aucune modification et transmet le message exactement tel qu’il a été reçu au service.👉 truncate : veille à ce que le message tienne dans la limite amont documentée par le service. Si plus d’informations sont fournies que la limite définie, l’excédent est tronqué.👉 split : similaire à truncate, sauf que si le message dépasse la limite amont documentée par le service, il est découpé en plusieurs morceaux plus petits puis envoyés séquentiellement. |
| format | Ce paramètre peut être défini sur text, html ou markdown. Certains services prennent en charge plusieurs formats de publication du contenu. La valeur par défaut varie selon le service choisi et peut correspondre à l’un de ces trois formats. Vous pouvez facultativement forcer cette option pour vous écarter du comportement par défaut. Si le service ne prend pas en charge plusieurs formats de transmission, ce champ est ignoré. |
| verify | Les requêtes externes vers des emplacements sécurisés, par exemple via https, utilisent des certificats. Par défaut, Apprise vérifie la validité de ces certificats ; si ce n’est pas le cas, aucune notification n’est envoyée à la source. Dans certains cas, un utilisateur ne dispose pas d’une autorité de certification pour valider la clé ou fait simplement confiance à la source ; dans ce cas, vous pouvez définir ce drapeau sur no. Par défaut, il vaut yes. |
| cto | Signifie Socket Connect Timeout. Il s’agit du nombre de secondes pendant lesquelles Requests attend que votre client établisse une connexion avec une machine distante, ce qui correspond à l’appel connect() sur la socket. La valeur par défaut est de 4.0 secondes. |
| rto | Signifie Socket Read Timeout. Il s’agit du nombre de secondes pendant lesquelles le client attend que le serveur envoie une réponse. La valeur par défaut est de 4.0 secondes. |
| emojis | Active la prise en charge des emojis, par exemple :+1: qui sera traduit en 👍. Par défaut, cette option vaut no. Remarque : selon la configuration côté serveur, l’administrateur peut désactiver globalement la prise en charge des emojis ; mais par défaut, ce n’est pas le cas. |
| tz | Identifie le fuseau horaire de la base IANA que vous souhaitez utiliser. Par défaut, celui-ci est détecté à partir de la configuration du serveur qui exécute Apprise. Vous pouvez le définir sur des valeurs comme America/Toronto, ou sur tout autre fuseau correctement formaté correspondant à votre région. |
Exemples personnels
Section intitulée « Exemples personnels »Envoyer depuis un compte Outlook personnel (le mode est détecté automatiquement depuis le domaine) :
# source: vous@outlook.com# client_id: aa-bb-cc-dd-ee# refresh_token: (issu du script ci-dessus)apprise -vv -t "Titre du test" -b "Corps du test" \ "o365://vous@outlook.com/aa-bb-cc-dd-ee/votre-refresh-token-ici/"Envoyer à un destinataire différent depuis un compte Hotmail :
apprise -vv -t "Bonjour" -b "Corps du message" \ "o365://moi@hotmail.com/aa-bb-cc-dd-ee/votre-refresh-token-ici/ami@example.com"Forcer le mode personnel sur un domaine non standard :
apprise -vv -t "Bonjour" -b "Corps du message" \ "o365://moi@custom.com/aa-bb-cc-dd-ee/votre-refresh-token-ici/?mode=personal"Configuration du Compte
Section intitulée « Configuration du Compte »Puisque Microsoft a désactivé l’authentification basique (nom d’utilisateur / mot de passe), vous devez enregistrer une application dans Azure afin de générer les identifiants nécessaires à Apprise (Client ID, Secret, etc.).
-
Depuis le portail Azure, ouvrez App Registrations (lien alternatif).
- Utilisez la barre de recherche en haut du portail Azure et tapez
App Registrations. - Si vous n’y avez toujours pas accès, il est possible que votre
organisation vous le restreigne. Vous devrez peut-être contacter votre
administrateur pour poursuivre.

- Utilisez la barre de recherche en haut du portail Azure et tapez
-
Cliquez sur Register an application.
Attention : écran que vous pouvez voir si vous n’avez pas de compte Azure
Vous devez avoir un compte Azure, plus précisément un abonnement, pour que cette partie fonctionne. Les abonnements sont gratuits, mais exigent tout de même l’enregistrement d’une carte bancaire. Pour créer un abonnement :

Allez dans : Azure Portal -> Subscriptions
Cliquez sur Add
Choisissez Azure subscription (Free)
Aucune ressource n’a besoin d’être déployée. Cela permet simplement de finaliser le provisionnement du tenant.
Ensuite, assurez-vous d’être dans le bon annuaire :
- Cliquez sur votre avatar (en haut à droite)
Sélectionnez Switch directory
Choisissez l’annuaire dans lequel l’abonnement a été créé. Il est possible qu’il n’y ait qu’un seul nouvel abonnement, celui que vous venez de créer. Dans ce cas, vous êtes déjà au bon endroit et pouvez poursuivre.
-
Dans le formulaire d’enregistrement :
- Donnez-lui un nom, par exemple
Apprise Notifications. - Point crucial : sélectionnez la 3e option : Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts.
- Cliquez sur Register.
- Donnez-lui un nom, par exemple
-
Depuis le panneau Overview, vous pouvez récupérer :
- l’Application (client) ID -> votre
client_id - l’Object ID -> votre
source(si vous utilisez un Object ID plutôt qu’une adresse e-mail) - le Directory (tenant) ID -> votre
tenant_id
- l’Application (client) ID -> votre
-
Pour créer votre
client_secret, développez l’onglet Manage à gauche :- Cliquez sur Certificates & secrets -> Client secrets
- Cliquez sur New client secret
- Fournissez une description (par ex.
Apprise Secret) et une expiration - Cliquez sur Add
-
Pour configurer les permissions, développez l’onglet Manage à gauche :
- Cliquez sur API permissions. Vous aurez probablement déjà la permission User.Read par défaut ; nous devons en ajouter d’autres.
- Cliquez sur Add a permission -> Microsoft Graph -> Application Permissions
- Recherchez et cochez Mail.Send, puis cliquez sur Add permissions
- Ajoutez également :
- User.Read.All - permet à Apprise de résoudre votre Object ID utilisé
comme
source - Mail.ReadWrite (optionnel) - requis uniquement pour les pièces jointes volumineuses (> 3 Mo)
- User.Read.All - permet à Apprise de résoudre votre Object ID utilisé
comme
Important : après ajout, vous devez cliquer sur Grant admin consent for <Directory Name> pour que les permissions prennent effet. Ce bouton se trouve juste à côté de Add a permission.
- Vous êtes maintenant prêt. 🙂
Syntaxe Organisationnelle
Section intitulée « Syntaxe Organisationnelle »La syntaxe valide est la suivante, les alias o365:// et azure:// étant tous
deux acceptés :
o365://{source}/{tenant_id}/{client_id}/{client_secret}/o365://{source}/{tenant_id}/{client_id}/{client_secret}/{targets}
Paramètres Organisationnels
Section intitulée « Paramètres Organisationnels »| Variable | Requis | Description |
|---|---|---|
| source | *Oui | L’adresse e-mail ou l’Object ID de la boîte aux lettres Exchange Online utilisée pour envoyer les e-mails. Cette boîte doit disposer de la permission applicative Mail.Send. |
| tenant_id | *Oui | Le Tenant ID (Directory ID) associé à l’enregistrement de votre application. |
| client_id | *Oui | Le Client ID (Application ID) associé à l’enregistrement de votre application. |
| client_secret | *Oui | Le Client Secret généré dans la section “Certificates & secrets”. |
| targets | Non | Une ou plusieurs adresses e-mail destinataires. Si omis, l’e-mail est envoyé à l’adresse identifiée par source. |
| to | Non | Alias de targets. Pratique dans une configuration YAML. |
| cc | Non | Une ou plusieurs adresses en copie carbone. Accepte des valeurs séparées par des virgules et des adresses nommées (ex. Nom <email@example.com>). |
| bcc | Non | Une ou plusieurs adresses en copie carbone invisible. Accepte des valeurs séparées par des virgules et des adresses nommées (ex. Nom <email@example.com>). |
| reply_to | Non | Une ou plusieurs adresses Répondre à. Lorsqu’un destinataire répond à l’e-mail de notification, sa réponse est dirigée ici plutôt que vers la boîte source. Accepte des valeurs séparées par des virgules et des adresses nommées (ex. Nom <email@example.com>). |
Paramètres Globaux
Section intitulée « Paramètres Globaux »| Variable | Description |
|---|---|
| overflow | Ce paramètre peut être défini sur split, truncate ou upstream. Il détermine la manière dont Apprise remet le message que vous lui transmettez. Par défaut, il vaut upstream. 👉 upstream : ne fait aucune modification et transmet le message exactement tel qu’il a été reçu au service.👉 truncate : veille à ce que le message tienne dans la limite amont documentée par le service. Si plus d’informations sont fournies que la limite définie, l’excédent est tronqué.👉 split : similaire à truncate, sauf que si le message dépasse la limite amont documentée par le service, il est découpé en plusieurs morceaux plus petits puis envoyés séquentiellement. |
| format | Ce paramètre peut être défini sur text, html ou markdown. Certains services prennent en charge plusieurs formats de publication du contenu. La valeur par défaut varie selon le service choisi et peut correspondre à l’un de ces trois formats. Vous pouvez facultativement forcer cette option pour vous écarter du comportement par défaut. Si le service ne prend pas en charge plusieurs formats de transmission, ce champ est ignoré. |
| verify | Les requêtes externes vers des emplacements sécurisés, par exemple via https, utilisent des certificats. Par défaut, Apprise vérifie la validité de ces certificats ; si ce n’est pas le cas, aucune notification n’est envoyée à la source. Dans certains cas, un utilisateur ne dispose pas d’une autorité de certification pour valider la clé ou fait simplement confiance à la source ; dans ce cas, vous pouvez définir ce drapeau sur no. Par défaut, il vaut yes. |
| cto | Signifie Socket Connect Timeout. Il s’agit du nombre de secondes pendant lesquelles Requests attend que votre client établisse une connexion avec une machine distante, ce qui correspond à l’appel connect() sur la socket. La valeur par défaut est de 4.0 secondes. |
| rto | Signifie Socket Read Timeout. Il s’agit du nombre de secondes pendant lesquelles le client attend que le serveur envoie une réponse. La valeur par défaut est de 4.0 secondes. |
| emojis | Active la prise en charge des emojis, par exemple :+1: qui sera traduit en 👍. Par défaut, cette option vaut no. Remarque : selon la configuration côté serveur, l’administrateur peut désactiver globalement la prise en charge des emojis ; mais par défaut, ce n’est pas le cas. |
| tz | Identifie le fuseau horaire de la base IANA que vous souhaitez utiliser. Par défaut, celui-ci est détecté à partir de la configuration du serveur qui exécute Apprise. Vous pouvez le définir sur des valeurs comme America/Toronto, ou sur tout autre fuseau correctement formaté correspondant à votre région. |
Exemples Organisationnels
Section intitulée « Exemples Organisationnels »Envoyer une notification e-mail depuis une boîte Exchange Online :
# tenant_id: ab-cd-ef-gh# source: user@example.com# client_id: zz-yy-xx-ww# secret: rt/djdwjjd (/ encodé en %2F)apprise -vv -t "Titre du message" -b "Corps du message" \ "o365://user@example.com/ab-cd-ef-gh/zz-yy-xx-ww/rt%2Fdjdwjjd/"Envoyer à plusieurs destinataires avec CC et BCC :
apprise -vv -t "Titre" -b "Corps" \ "o365://user@example.com/ab-cd-ef-gh/zz-yy-xx-ww/rt%2Fdjdwjjd/destinataire@example.com?cc=manager@example.com&bcc=audit@example.com"Envoyer avec une adresse Répondre à (utile pour les formulaires de contact - les réponses sont dirigées vers l’utilisateur final, et non vers la boîte expéditrice) :
apprise -vv -t "Formulaire de contact" -b "Quelqu'un vous a contacté" \ "o365://noreply@example.com/ab-cd-ef-gh/zz-yy-xx-ww/rt%2Fdjdwjjd/support@example.com?reply_to=client@externe.com" Questions ou commentaires ?
Documentation
Vous avez repéré une faute de frappe ou une erreur ? Signalez-la ou proposez une correction .
Problèmes Techniques
Vous rencontrez un problème avec le code ? Ouvrez un ticket sur GitHub :