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

C# 使用MailKit发送带嵌入式图片邮件时图片无法显示问题求助

问题原因及修复方案

核心错误

你构建BodyBuilder并添加LinkedResources内嵌图片后,没有调用builder.ToMessageBody()生成包含内嵌资源的多部分邮件体,而是手动创建了仅包含文本内容的TextPart,导致所有内嵌图片完全没有被打包进邮件内容,客户端找不到对应cid的资源,只能显示占位符。

其他次要问题

  • 首分支的页脚图片img标签中,cid:{2}后面多了多余空格,会导致cid匹配失败
  • 仅页脚存在的分支中,img标签的cid写法不规范,部分客户端识别会出错
  • 路径拼接直接使用字符串拼接斜杠,容易出现多斜杠、漏斜杠的兼容问题,建议用Path.Combine处理
  • 纯文本模式下(Format=false)直接赋值纯文本TextPart,自然不会显示内嵌图片,如果需要纯文本+附件模式可以保留该逻辑,否则也可以调整为对应模式

修复后的核心代码片段

把原来给email.Body赋值的代码:

email.Body = Format == false ? new TextPart(TextFormat.Text) { Text = builder.TextBody } : new TextPart(TextFormat.Html){ Text= builder.HtmlBody };

替换为:

// 自动生成包含内嵌资源、文本/HTML内容的完整邮件体
email.Body = builder.ToMessageBody();
// 如果需要保留纯文本模式下仅返回纯文本的逻辑,可以保留分支判断:
// email.Body = Format == false ? new TextPart(TextFormat.Text) { Text = builder.TextBody } : builder.ToMessageBody();

同时修正HTML和路径拼接的错误:

  1. 首分支的HTML拼接去掉多余空格:builder.HtmlBody = string.Format(@"<img src='cid:{0}'><br>{1}<br><img src='cid:{2}'>", imageHead.ContentId, BodyHtml, imageFoot.ContentId);
  2. 所有文件路径拼接替换为Path.Combine,例如:builder.LinkedResources.Add(Path.Combine(filesDirectory, EmailLogoHeader));

注:如果测试后还是不显示,可以先打日志确认filesDirectory拼接后的完整路径是否能正常读取到对应图片文件,避免路径错误导致图片加载失败。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:57:01