You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Microsoft Graph API:邮件正文CID附件名与API返回附件名不匹配问题

解决内联附件CID与Graph API附件匹配问题

核心问题在于你之前的附件查询请求没有获取contentId字段——这才是内联附件CID引用的核心标识,而非name字段。以下是具体解决步骤:

1. 修改附件查询API请求

将第二步的接口请求添加contentId到$select参数中,这样返回的内联附件会包含对应的CID标识:

curl "https://graph.microsoft.com/v1.0/users/{UserId}/messages/{MessageId}/attachments?$select=name,id,contentType,isInline,contentId" \
  -H "Authorization: Bearer <your-access-token>"

返回的内联附件数据会新增类似"contentId": "183b27ac45e855d34"或"contentId": "image001.png@01D8D9DB.51722550"的字段,这正是正文里CID引用的对应值。

2. 提取正文里的CID值

从正文的<img>标签中提取完整的CID内容:

  • 对于<img src="cid:image001.png@01D8D9DB.51722550">,提取image001.png@01D8D9DB.51722550;
  • 对于<img src="cid:183b27ac45e855d34">,提取183b27ac45e855d34;
  • 如果遇到alt属性里带完整CID的情况(如alt="cid:image007.png@01D869CB.F672DCF0"),也可以提取该值作为备选匹配项。

3. 匹配逻辑优先级

按照以下顺序匹配附件与CID:

  1. 精确匹配contentId:优先用提取的CID值和附件的contentId字段做精确匹配(可忽略大小写,避免编码差异);
  2. fallback到name匹配:如果附件的contentId为空或匹配失败,再用CID中@前的文件名(如image001.png)和附件的name字段匹配;
  3. 处理哈希型CID:对于正文里是哈希值的CID(如183b27ac45e855d34),只能通过附件的contentId字段匹配,这是唯一对应关系。

4. 示例匹配逻辑(Shell伪代码)

假设你已经把邮件正文保存到email_body.html,附件数据保存到attachments.json:

# 提取所有CID值
cid_values=$(grep -o 'cid:[^"]*' email_body.html | sed 's/cid://g')

# 遍历每个CID,匹配附件ID
for cid in $cid_values; do
  attachment_id=$(jq -r --arg cid "$cid" '.[] | select(.isInline == true and .contentId == $cid) | .id' attachments.json)
  # 如果contentId匹配失败,尝试用文件名匹配
  if [ -z "$attachment_id" ]; then
    filename=$(echo "$cid" | cut -d'@' -f1)
    attachment_id=$(jq -r --arg fn "$filename" '.[] | select(.isInline == true and .name == $fn) | .id' attachments.json)
  fi
  # 拿到attachment_id后,调用第三步接口获取原始内容并替换正文里的CID引用
  # 这里省略替换逻辑,可使用sed或其他工具完成
done

内容的提问来源于stack exchange,提问作者Alex SL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 03:15:41