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和路径拼接的错误:
- 首分支的HTML拼接去掉多余空格:
builder.HtmlBody = string.Format(@"<img src='cid:{0}'><br>{1}<br><img src='cid:{2}'>", imageHead.ContentId, BodyHtml, imageFoot.ContentId); - 所有文件路径拼接替换为
Path.Combine,例如:builder.LinkedResources.Add(Path.Combine(filesDirectory, EmailLogoHeader));
注:如果测试后还是不显示,可以先打日志确认
filesDirectory拼接后的完整路径是否能正常读取到对应图片文件,避免路径错误导致图片加载失败。
内容的提问来源于stack exchange,提问作者bargo
相关产品推荐
相关产品推荐

