如何通过Curl向Teams频道发送消息并@指定人员?
在Teams中通过Curl发送带@提醒的Jenkins构建消息
Teams的@提醒不能直接在消息文本里打@用户名,必须遵循它的消息卡片格式规范,结合用户标识和特定标签实现。以下是具体实现步骤和示例:
核心原理
要@指定用户,消息体需要包含两部分:
- 在文本中用
<at>显示名称</at>标记要@的位置 - 在
mentions数组里声明被@用户的唯一标识(用户ID或用户主体名userPrincipalName)
获取用户标识
你需要先拿到要@用户的以下任一标识:
- 用户ID:在Teams中右键目标用户→「查看详情」,复制页面底部的用户ID(一串长字符)
- 用户主体名:通常是用户的公司邮箱(比如
zhangsan@company.com)
Curl命令示例
1. @单个用户
curl -H "Content-Type: application/json" -X POST -d '{ "text": "Jenkins构建完成:<at>张三</at>,你负责的项目构建失败,请及时排查!", "mentions": [ { "id": "12345678-1234-1234-1234-123456789abc", "mentionType": "person", "text": "<at>张三</at>", "user": { "id": "12345678-1234-1234-1234-123456789abc", "userPrincipalName": "zhangsan@company.com", "displayName": "张三" } } ] }' "你的Teams webhook URL"
2. @多个用户
如果需要同时@多个人,只需在mentions数组里添加多个用户对象即可:
curl -H "Content-Type: application/json" -X POST -d '{ "text": "Jenkins构建完成:<at>张三</at>、<at>李四</at>,项目构建失败,请及时排查!", "mentions": [ { "id": "12345678-1234-1234-1234-123456789abc", "mentionType": "person", "text": "<at>张三</at>", "user": { "id": "12345678-1234-1234-1234-123456789abc", "userPrincipalName": "zhangsan@company.com", "displayName": "张三" } }, { "id": "87654321-4321-4321-4321-cba987654321", "mentionType": "person", "text": "<at>李四</at>", "user": { "id": "87654321-4321-4321-4321-cba987654321", "userPrincipalName": "lisi@company.com", "displayName": "李四" } } ] }' "你的Teams webhook URL"
Jenkins集成优化
在Jenkins脚本中,你可以动态获取构建责任人的信息:
- 从Git提交记录里提取提交者邮箱(对应
userPrincipalName) - 提前维护用户ID和邮箱的映射表,或者用Azure AD Graph API根据邮箱获取用户ID
- 将这些动态值替换到Curl的payload中,实现自动@责任人
比如,用Jenkins变量替换的示例:
BUILD_STATUS="失败" RESPONSIBLE_EMAIL="zhangsan@company.com" RESPONSIBLE_NAME="张三" RESPONSIBLE_ID="12345678-1234-1234-1234-123456789abc" curl -H "Content-Type: application/json" -X POST -d '{ "text": "Jenkins构建完成:<at>'"$RESPONSIBLE_NAME"'</at>,你负责的项目构建'"$BUILD_STATUS"',请及时排查!", "mentions": [ { "id": "'"$RESPONSIBLE_ID"'", "mentionType": "person", "text": "<at>'"$RESPONSIBLE_NAME"'</at>", "user": { "id": "'"$RESPONSIBLE_ID"'", "userPrincipalName": "'"$RESPONSIBLE_EMAIL"'", "displayName": "'"$RESPONSIBLE_NAME"'" } } ] }' "你的Teams webhook URL"
内容的提问来源于stack exchange,提问作者TATA
相关产品推荐
相关产品推荐

