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

.NET Core 3.1使用MailMessage生成邮件结构异常导致嵌入图片失效如何修复

问题原因

你当前的代码将内嵌图片绑定到富文本视图htmlView的关联资源集合中,原生System.Net.Mail.MailMessage的默认实现会自动为携带关联资源的AlternateView单独嵌套一层multipart/related,最终生成外层为multipart/alternative、内层嵌套multipart/related的结构,部分邮件客户端对这种嵌套结构兼容性不佳,导致无法正常渲染内嵌图片。

修复方案

方案1:使用MimeKit自定义邮件结构(推荐)

MimeKit是.NET生态下成熟的MIME邮件处理库,支持完全自定义邮件层级结构,完美适配.NET Core 3.1,实现目标结构的代码如下:

  1. 首先安装NuGet依赖:
    Install-Package MimeKit
    Install-Package MailKit
  2. 邮件构建与发送代码:
using MimeKit;
using MailKit.Net.Smtp;

// 初始化邮件基础信息
var mail = new MimeMessage();
mail.From.Add(new MailboxAddress("发件人名称", "from@from.com"));
mail.To.Add(new MailboxAddress("收件人名称", "to@to.com"));
mail.Subject = mailContent.Subject;

// 构建根节点 multipart/related
var rootMultipart = new Multipart("related");

// 构建 multipart/alternative 节点,包含纯文本和富文本视图
var alternativeMultipart = new Multipart("alternative");
alternativeMultipart.Add(new TextPart("plain")
{
    Text = mailContent.Plain,
    ContentTransferEncoding = ContentEncoding.SevenBit
});
alternativeMultipart.Add(new TextPart("html")
{
    Text = mailContent.Html,
    ContentTransferEncoding = ContentEncoding.SevenBit
});
rootMultipart.Add(alternativeMultipart);

// 添加图片资源到根节点
var imagePart = new MimePart("image", "png")
{
    Content = new MimeContent(File.OpenRead("image.png"), ContentEncoding.Base64),
    ContentId = "imagecid"
};
rootMultipart.Add(imagePart);

mail.Body = rootMultipart;

// SMTP发送邮件
using var smtpClient = new SmtpClient();
smtpClient.Connect("SMTP服务地址", 端口, 是否启用SSL);
// 如需身份认证添加 smtpClient.Authenticate("账号", "密码");
smtpClient.Send(mail);
smtpClient.Disconnect(true);

上述代码生成的邮件结构完全符合你要求的层级,兼容绝大多数主流邮件客户端。

方案2:原生MailMessage兼容方案(不推荐)

如果必须使用原生System.Net.Mail类库,可以通过反射强制修改邮件根内容类型,但是该方案依赖类库内部实现,跨版本兼容性差,不建议在生产环境使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:45:03