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:
- 精确匹配contentId:优先用提取的CID值和附件的
contentId字段做精确匹配(可忽略大小写,避免编码差异); - fallback到name匹配:如果附件的
contentId为空或匹配失败,再用CID中@前的文件名(如image001.png)和附件的name字段匹配; - 处理哈希型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
相关产品推荐
相关产品推荐

