Install
openclaw skills install outlook-entraMicrosoft Outlook via OAuth 2.0 (device code flow) et Microsoft Graph API. Lecture seule — Mail.Read, Calendars.Read, Contacts.Read.
openclaw skills install outlook-entraMicrosoft Outlook via OAuth 2.0 (device code flow) et Microsoft Graph API.
Lecture seule — seules les permissions Mail.Read, Calendars.Read, Contacts.Read sont utilisées.
Mail.Read, Calendars.Read, Contacts.Readrequests, html2text, cryptography.venv créé dans le répertoire du skill (uv venv .venv && uv pip install html2text requests cryptography).env configuré (voir .env.example)# Créer l'environnement virtuel (obligatoire)
cd ~/.openclaw/workspace/skills/outlook-entra
uv venv .venv
uv pip install html2text requests cryptography
# Copier et éditer la config
cp .env.example .env
# ⚠️ Remplir client_id, client_secret, tenant_id dans .env
Le device code flow (RFC 8628) nécessite une intervention utilisateur unique.
.venv/bin/python scripts/outlook_auth.py
Le script va :
Aller sur https://login.microsoft.com/device et entrer le code affiché. Délai : 15 minutes maximum.
Le script poll automatiquement le endpoint Microsoft jusqu'à obtention du token. Une fois confirmé, les tokens sont sauvegardés localement.
access_token expire après ~1hrefresh_token permet d'obtenir un nouvel access_token sans interventionrefresh_token expire aussi (plusieurs mois d'inactivité) → relancer le flow complet# Vérifier le statut du token
.venv/bin/python scripts/outlook_auth.py --status
# Rafraîchir le token manuellement
.venv/bin/python scripts/outlook_refresh.py
# Révoquer et supprimer les tokens
.venv/bin/python scripts/outlook_auth.py --revoke
# Statut de connexion
.venv/bin/python scripts/outlook_auth.py --status
# Lire les derniers messages
.venv/bin/python scripts/outlook_graph.py messages --folder Inbox --top 10
# Détail d'un message (corps complet, Markdown par défaut)
.venv/bin/python scripts/outlook_graph.py message <messageId>
# Détail en HTML brut (pour extraction/collage)
.venv/bin/python scripts/outlook_graph.py message <messageId> --raw
# Lister les dossiers mail
.venv/bin/python scripts/outlook_graph.py folders
# Pièces jointes d'un message
.venv/bin/python scripts/outlook_graph.py attachments <messageId>
# Télécharger une pièce jointe
.venv/bin/python scripts/outlook_graph.py download <messageId> --attach-id <attachmentId> --output /path/to/file
# Événements calendrier
.venv/bin/python scripts/outlook_graph.py events --top 10
# Contacts
.venv/bin/python scripts/outlook_graph.py contacts --top 20
# Rechercher dans les mails
.venv/bin/python scripts/outlook_graph.py search "mot-clé"
# Profil utilisateur
.venv/bin/python scripts/outlook_graph.py profile
| Variable | Description | Exemple |
|---|---|---|
AZURE_TENANT_ID | GUID du tenant Entra | 52ffb8b9-… |
AZURE_CLIENT_ID | ID de l'app (Application ID) | xxxxxxxx-… |
AZURE_CLIENT_SECRET | Secret de l'app | ~ |
AZURE_REDIRECT_URI | Redirect URI (device flow : tout fait) | http://localhost |
OAUTH_TOKEN_URL | URL token endpoint | https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token |
OAUTH_DEVICE_CODE_URL | URL device code endpoint | https://login.microsoftonline.com/{tenant}/oauth2/v2.0/devicecode |
MS_GRAPH_BASE_URL | Base URL Microsoft Graph | https://graph.microsoft.com/v1.0 |
TOKEN_FILE | Chemin du fichier de stockage des tokens | ~/.openclaw/outlook_tokens.json |
TOKEN_FILE_KEY | Clé de chiffrement (optionnel) | (vide par défaut) |
outlook-entra/
├── SKILL.md
├── README.md
├── .env.example
├── .gitignore
├── .venv/ # Environnement virtuel Python (créé via uv venv)
├── scripts/
│ ├── outlook_auth.py # OAuth device code flow + status/revoke
│ ├── outlook_graph.py # Appels Graph API (lecture seule)
│ ├── outlook_refresh.py # Refresh token automatisé (pour cron)
│ └── outlook_token.py # Module partagé (lecture/refresh tokens)
└── tests/
└── test_outlook.py # Tests unitaires
https://microsoft.com/devicelogin. Une seule fois.TOKEN_FILE_KEY est défini, les tokens sont chiffrés AES-GCM avant stockage.Le script outlook_refresh.py vérifie si le token expire bientôt et le rafraîchit automatiquement.
Crontab — refresh toutes les heures à HH:55 :
55 * * * * /home/fred-ghilini/.openclaw/workspace/skills/outlook-entra/.venv/bin/python /home/fred-ghilini/.openclaw/workspace/skills/outlook-entra/scripts/outlook_refresh.py >> /home/fred-ghilini/.openclaw/outlook_refresh.log 2>&1
Installation :
SKILL_DIR="/home/fred-ghilini/.openclaw/workspace/skills/outlook-entra"
( crontab -l 2>/dev/null | grep -v outlook_refresh; echo "55 * * * * ${SKILL_DIR}/.venv/bin/python ${SKILL_DIR}/scripts/outlook_refresh.py >> ~/.openclaw/outlook_refresh.log 2>&1" ) | crontab -
Vérification :
crontab -l | grep outlook_refresh