钉钉Markdown消息推送需严格满足三条件:JSON结构正确、Content-Type为application/json、text字段支持基础Markdown语法;必须包含msgtype: "markdown"及同级markdown对象,其下title和text字段不可缺,text中换行用\n,标题顶格,@人和图片需特殊处理。

能推,但必须严格满足三个条件:JSON结构正确、Content-Type头明确、text字段里支持基础Markdown语法(不支持HTML标签或复杂嵌套)。
curl推送Markdown消息的必需参数组合
钉钉的markdown类型不是“渲染任意Markdown”,而是只认特定字段结构。漏掉title或把text写成content都会返回errcode: 10005(无效的msgtype)。
- 必须用
-H 'Content-Type: application/json',否则钉钉直接拒收(返回415 Unsupported Media Type) - 必须包含
"msgtype": "markdown"和同级的"markdown"对象 -
"markdown"对象里必须有"title"(字符串,最长256字)和"text"(字符串,支持换行、列表、加粗、链接、引用块) -
"text"里的换行要用\n,不能靠缩进或空行;###标题需顶格,前面不能有空格
常见错误:中文乱码、@人失效、图片不显示
乱码基本是shell变量未转义或脚本文件编码非UTF-8;@功能在markdown类型里不生效(得用text类型配atMobiles);图片地址必须是公网可直访HTTPS链接,本地路径或HTTP链接会失败。
- 确保
curl命令中所有中文都用双引号包裹,且终端locale为en_US.UTF-8或zh_CN.UTF-8 - 想@某人?别在
markdown.text里写@138xxxxxxx——这没用。改用text类型,或单独发一条text消息带atMobiles字段 - 图片用
语法,但链接必须能被钉钉服务器GET通(可先用curl -I https://...验证)
一个可用的shell函数封装示例
直接复制进.bashrc或脚本里就能用,自动处理换行和引号转义:
dingding_md() {
local webhook="$1"
local title="$2"
local content="$3"
curl -s -X POST "$webhook" \
-H 'Content-Type: application/json' \
-d "{
\"msgtype\": \"markdown\",
\"markdown\": {
\"title\": \"$title\",
\"text\": \"$content\"
}
}" > /dev/null
}调用方式:dingding_md "https://oapi.dingtalk.com/robot/send?access_token=xxx" "部署通知" "#### ✅ 部署完成\n- 环境: prod\n- 版本: v2.3.1\n- 时间: $(date +%H:%M)"
注意text字段里不能出现未转义的双引号或反斜杠,否则JSON解析失败。复杂内容建议先拼好字符串再传入,别在-d里硬写多行。


















