Vous voulez ouvrir un nouveau chat Teams par simple URL, avec des destinataires prédéfinis et un message déjà rédigé ? Ce guide détaille la syntaxe, l’état du support dans le « nouveau Teams (work or school) », les contournements fiables et des exemples prêts à l’emploi.
Problème posé
De nombreuses organisations utilisent des liens (deep links) pour accélérer la mise en relation : bouton « Écrire sur Teams », signature d’e‑mail, page intranet, carte Adaptive… L’intention est simple : ouvrir une nouvelle conversation dans Microsoft Teams, renseigner automatiquement les destinataires (un ou plusieurs) et pré‑remplir la zone de rédaction avec un texte (message=
).
Après migration vers le nouveau Teams (work or school), plusieurs équipes ont observé que le paramètre message=
—bien qu’encore documenté—n’injecte plus le brouillon : la conversation s’ouvre, mais la zone de composition reste vide. Microsoft classe ce comportement comme une limitation connue du nouveau client (non comme une erreur de documentation). Les articles officiels ont été révisés en 2025 et continuent de mentionner message=
, signe d’un rétablissement progressif ou conditionnel selon les anneaux de mise à jour.
Syntaxe correcte d’un deep link (Teams « classique »)
https://teams.microsoft.com/l/chat/0/0?
tenantId=<ID_locataire>& (facultatif)
users=<user1>,<user2>,…& (obligatoire, e‑mail ou UPN)
topicName=<Nom_du_chat>& (facultatif, ≥3 participants)
message=<Texte_url‑encodé> (facultatif)
Exemple :
https://teams.microsoft.com/l/chat/0/0?users=alice@contoso.com,bob@contoso.com&topicName=Pr%C3%A9paration%20r%C3%A9union&message=Bonjour%20%C3%A0%20tous
Règles importantes
Élément | Bonnes pratiques |
---|---|
Texte du message | Encoder les espaces en %20 , les apostrophes en %27 , les accents (é → %C3%A9 ), les retours à la ligne (%0A ). |
Multiples destinataires | Les séparer par une virgule sans espace : users=alice@...,bob@...,chris@... |
Organisation | Tous les utilisateurs doivent être autorisés à converser entre eux (politiques d’accès inter‑tenant, invités, etc.). |
topicName | Pris en compte pour un chat de groupe (≥ 3 personnes). Pour un 1:1, le nom n’est pas appliqué. |
tenantId | Optionnel ; peut aider en environnement multi‑tenant. En son absence, Teams choisit le contexte disponible pour l’utilisateur. |
Pourquoi cela ne fonctionne plus dans le nouveau Teams ?
- Depuis fin 2023, le nouveau client desktop/web a désactivé temporairement l’injection de brouillon via
message=
. Le chat s’ouvre, mais le texte n’est pas placé dans la zone de composition. - Microsoft qualifie cela de limitation connue. Les pages officielles demeurent alignées sur la syntaxe historique et ont été ré‑actualisées en 2025, ce qui laisse entrevoir un rétablissement partiel ou progressif (selon anneaux de déploiement, plateformes ou contextes).
Conséquence : les liens existants restent utiles pour ouvrir le bon fil (destinataires corrects, éventuel sujet de groupe) mais n’assurent pas l’auto‑remplissage du message sur le nouveau client desktop/web. En revanche, le comportement peut être différent sur mobile.
Contournements et solutions actuelles
Scénario | Alternative recommandée |
---|---|
Clients Windows/macOS (nouveau Teams) | Basculer momentanément sur « Teams classique » si l’option reste disponible dans l’organisation, afin de bénéficier du brouillon auto. Utiliser TeamsJS dans le contexte d’une application Teams :chat.openGroupChat({ users: [...], topic: "…", message: "…" }) pour renseigner le brouillon. |
Automatisation / bouton dans une carte Adaptive | Construire le deep link sans message= et afficher, dans la carte, le texte à copier. L’utilisateur colle ensuite le message dans la zone de rédaction. |
Bots ou services backend | Via Microsoft Graph (/chats/{id}/messages ), envoyer directement le premier message au chat ciblé plutôt que d’injecter un brouillon côté client. |
Outlook / signatures d’e‑mail | Conserver la syntaxe standard. Le lien fonctionnera sur mobile et web, et restera rétro‑compatible si le support message= est réactivé sur desktop. |
Matrice de compatibilité (observée)
Le tableau ci‑dessous synthétise les comportements typiques. Les organisations peuvent rencontrer des variations selon anneaux, politiques et versions.
Plateforme | Ouverture du chat | users= | topicName= | message= (brouillon) | Remarques |
---|---|---|---|---|---|
Windows – Teams classique | OK | OK | OK (≥ 3) | OK | Comportement historique documenté. |
Windows – Nouveau Teams | OK | OK | OK (≥ 3) | Désactivé (limitation) | Voir contournements (TeamsJS, Graph, copier/coller). |
macOS – Nouveau Teams | OK | OK | OK (≥ 3) | Désactivé | Comportement comparable à Windows. |
Web (Edge/Chrome) | OK | OK | OK (≥ 3) | Variable | Peut suivre le rythme du déploiement service‑side. |
iOS / Android (app Teams) | OK | OK | OK (≥ 3) | Souvent OK | Dépend des versions mobiles ; tester. |
Encodage : le guide express
L’encodage correcte du message est crucial. Utilisez systématiquement l’équivalent d’encodeURIComponent
dans votre langage pour éviter les caractères non valides. Quelques conversions utiles :
Caractère | Encodage | Exemple |
---|---|---|
Espace | %20 | Bonjour%20%C3%A0%20tous |
Retour ligne | %0A | L1%0AL2 |
« é » | %C3%A9 | r%C3%A9union |
« ’ » (apostrophe) | %27 | l%27%C3%A9quipe |
« & » | %26 | A%26B |
« # » | %23 | Plan%23Alpha |
Astuce : n’utilisez pas +
pour les espaces. Dans les chemins modernes, Teams attend l’encodage %20
.
Exemples prêts à l’emploi
JavaScript (navigateur ou intranet)
<button id="openTeams">Ouvrir un chat Teams</button>
<script>
const users = ["alice@contoso.com","bob@contoso.com"].join(",");
const topic = encodeURIComponent("Préparation réunion");
const msg = encodeURIComponent("Bonjour à tous,\nPouvez-vous valider l'ordre du jour ?");
// Si nouveau Teams: conserver message pour compatibilité future/mobiles
const url = `https://teams.microsoft.com/l/chat/0/0?users=${users}&topicName=${topic}&message=${msg}`;
document.getElementById("openTeams").addEventListener("click", () => {
window.location.href = url;
});
</script>
TeamsJS (dans une application Teams)
// webapp hébergée dans Teams
import { chat } from "@microsoft/teams-js";
async function openPrefilledChat() {
await chat.openGroupChat({
users: \["[alice@contoso.com](mailto:alice@contoso.com)","[bob@contoso.com](mailto:bob@contoso.com)"],
topic: "Préparation réunion",
message: "Bonjour à tous, voici le point du jour."
});
}
Avantage : même si message=
est ignoré par le client, l’API JavaScript de Teams peut renseigner le brouillon dans le contexte d’une application Teams.
PowerShell (génération de lien)
$users = "alice@contoso.com,bob@contoso.com"
$topic = [System.Uri]::EscapeDataString("Préparation réunion")
$msg = [System.Uri]::EscapeDataString("Bonjour à tous — point du jour :\n1) Budget\n2) Planning")
$link = "https://teams.microsoft.com/l/chat/0/0?users=$users&topicName=$topic&message=$msg"
$link
HTML (signature Outlook ou page intranet)
<a href="https://teams.microsoft.com/l/chat/0/0?users=alice@contoso.com,bob@contoso.com&topicName=Pr%C3%A9paration%20r%C3%A9union">
Écrire à l'équipe sur Teams
</a>
Note : on peut conserver message=…
pour la compatibilité mobile et un futur rétablissement, mais il n’injectera pas de texte sur le nouveau client desktop/web tant que la limitation persiste.
Microsoft Graph (envoyer le premier message)
POST https://graph.microsoft.com/v1.0/chats/{chat-id}/messages
Content-Type: application/json
{
"body": {
"contentType": "html",
"content": "\Bonjour à tous\\Voici l'ordre du jour.\"
}
}
Ce flux contourne totalement la notion de « brouillon » : votre service envoie directement le message dans le chat cible (authentification et consentement requis).
Ouvrir une application Teams avec un message pré‑rempli
Si votre objectif est de lancer un bot ou une application Teams plutôt qu’un chat, privilégiez le deep link « entity ». Les données passées dans context
sont transmises à l’app, qui peut initialiser son interface (champ texte, ID de sous‑entité, etc.).
https://teams.microsoft.com/l/entity/<appId>/<pageId>?
webUrl=<url>&
context={ "subEntityId":"<payload>", "channelId":"<id>", "message":"<texte_encod%C3%A9>" }
Bonne pratique : encodez la valeur du paramètre context
en JSON compact, puis appliquez un encodage d’URL sur l’ensemble du JSON.
Diagnostic : check‑list rapide
- Les UPN/e‑mails sont‑ils valides ? Une virgule erronée, un espace ou un alias incorrect peut empêcher l’ouverture du fil.
- Le chat de groupe comporte‑t‑il ≥ 3 participants ? Sinon
topicName
n’est pas visible. - Politiques d’accès inter‑tenant : les utilisateurs sont‑ils autorisés à échanger ? Les invités doivent exister dans l’annuaire cible.
- Encodage : l’ensemble du message est‑il pleinement URL‑encodé (y compris diacritiques,
&
, etc.) ? - Client ciblé : sur nouveau Teams desktop/web,
message=
n’injecte pas le brouillon. Tester sur mobile et web. - Conflits d’application par défaut : certaines installations capturent le schéma
msteams://
. Préférer l’URL HTTPS pour plus d’universalité.
Modèles de mise en œuvre
Bouton intranet avec « copier‑coller » de secours
Quand le brouillon ne peut pas être injecté, affichez le message dans une zone facilement copiable :
<textarea id="msg" rows="5" style="width:100%">Bonjour à tous,
Voici l'ordre du jour…</textarea>
<button onclick="navigator.clipboard.writeText(document.getElementById('msg').value)">
Copier le message
</button>
<button onclick="location.href='https://teams.microsoft.com/l/chat/0/0?users=alice@contoso.com,bob@contoso.com&topicName=R%C3%A9union%20projet'">
Ouvrir le chat Teams
</button>
Carte Adaptive illustrant le message
Placez le texte attendu dans un composant TextBlock
et/ou un Input.Text
pour faciliter la copie par l’utilisateur. Lien « Ouvrir le chat » sans message=
.
{
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.5",
"body": [
{ "type": "TextBlock", "text": "Préparez le message ci‑dessous puis ouvrez le chat :", "wrap": true },
{ "type": "Input.Text", "id": "msg", "value": "Bonjour à tous, …", "isMultiline": true }
],
"actions": [
{ "type": "Action.OpenUrl", "title": "Ouvrir le chat Teams",
"url": "https://teams.microsoft.com/l/chat/0/0?users=alice@contoso.com,bob@contoso.com&topicName=Pr%C3%A9paration%20r%C3%A9union" }
]
}
Générer dynamiquement la chaîne users=
depuis un outil métier
// Exemple Node.js
function buildUsersParam(list) {
return list.map(x => x.trim()).filter(Boolean).join(",");
}
// Exemple d'utilisation
const users = buildUsersParam(["alice@contoso.com", "bob@contoso.com", " chris@contoso.com "]);
Bonnes pratiques de gouvernance
- Standardisez le format d’adresse : utilisez systématiquement l’UPN ou l’e‑mail primaire O365.
- Validez les destinataires avant de générer le lien (contrôle côté serveur ou script d’assemblage).
- Surveillez les notes de version du client Teams : le support de
message=
peut évoluer par anneaux. - Documentez un plan B : mention explicite « Copiez/collez ce message… » lorsque l’injection automatique n’est pas possible.
FAQ
Le paramètre message=
est‑il obsolète ?
Non : la syntaxe reste documentée. C’est son application qui est temporairement limitée dans le nouveau client desktop/web. Conservez‑le dans vos liens pour la compatibilité mobile et un éventuel rétablissement desktop.
Puis‑je nommer un chat de 1:1 avec topicName
?
Non : topicName
s’applique aux chats de groupe (à partir de 3 personnes). Pour 1:1, le nom n’est pas visible.
Pourquoi spécifier tenantId=
?
En environnement multi‑tenant, cela peut guider le contexte d’ouverture. En règle générale, l’omission fonctionne si l’utilisateur est déjà connecté au bon tenant.
Les ID d’objets Azure AD sont‑ils acceptés dans users=
?
Non, indiquez l’UPN ou l’e‑mail O365. Évitez les GUID et formats propriétaires.
Comment insérer des sauts de ligne dans le message ?
Encodez \n
en %0A
. Exemple : Bonjour%20%0ASecond%20paragraphe
.
Et les @mentions ?
Les mentions enrichies ne sont pas prises en charge dans un brouillon injecté par URL. Si vous devez « mentionner » quelqu’un, laissez le texte brut @nom
et faites la mention manuellement ensuite.
Recommandations pratiques
- Toujours encoder tous les paramètres d’URL : espaces, apostrophes, dièses, accents.
- Tester sur chaque cible : Android/iOS, web, Teams classique et nouveau Teams. Documentez les différences observées.
- Suivre la roadmap Microsoft 365 : anticipez la ré‑activation éventuelle de
message=
sur desktop. - Prévoir un texte d’aide tant que le brouillon automatique est désactivé (« Copiez/collez ce message… »).
Points clés à retenir
- Le format de lien est toujours valide et recommandé (
users
requis,topicName
/tenantId
/message
facultatifs). - Dans le nouveau client Teams (desktop/web), la pré‑saisie via
message=
est désactivée ; privilégiez TeamsJS (dans une app), Microsoft Graph (envoi direct), ou un flux copier‑coller ergonomique. - Soignez l’encodage URL ; une seule erreur (
&
, diacritiques, espaces) suffit à invalider le lien. - Vérifiez que tous les destinataires sont autorisés à discuter (politiques inter‑tenant) pour éviter les ouvertures « vides » ou les erreurs d’accès.
- Conservez message= pour la rétro‑compatibilité (mobile, rétablissement futur) même s’il n’alimente pas la zone de rédaction sur desktop aujourd’hui.
Annexe : gabarits testables
1) Chat 1:1 sans message
https://teams.microsoft.com/l/chat/0/0?users=alice@contoso.com
2) Chat de groupe nommé (≥ 3)
https://teams.microsoft.com/l/chat/0/0?users=alice@contoso.com,bob@contoso.com,chris@contoso.com&topicName=%5BProjet%5D%20Lancement
3) Chat avec message (rétro‑compatibilité mobile & futur)
https://teams.microsoft.com/l/chat/0/0?users=alice@contoso.com,bob@contoso.com&topicName=Pr%C3%A9paration%20r%C3%A9union&message=Bonjour%20%C3%A0%20tous%20%0AOdj%20ci-joint
4) Lancer une application Teams avec contexte
https://teams.microsoft.com/l/entity/<appId>/home?webUrl=https%3A%2F%2Fapp.contoso.com%2Fhome&context=%7B%22message%22%3A%22Bonjour%2520depuis%2520le%2520lien%22%7D
Conclusion
Les deep links restent un excellent levier UX pour « aller droit au chat ». Tant que la pré‑saisie est désactivée sur le nouveau client desktop/web, combinez plusieurs stratégies : TeamsJS dans vos applications hébergées, Graph pour envoyer le premier message directement, et une UX de copier‑coller élégante ailleurs. Conservez la syntaxe standard dans vos liens pour assurer le fonctionnement sur mobile et capitaliser immédiatement lorsqu’un rétablissement du paramètre message
sera pleinement déployé.