.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,实现目标结构的代码如下:
- 首先安装NuGet依赖:
Install-Package MimeKitInstall-Package MailKit - 邮件构建与发送代码:
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
相关产品推荐
相关产品推荐

