ASP.NET发送HTML邮件时本地图片未在正文显示问题
问题原因
Server.MapPath返回的是Web服务器本地磁盘的物理路径,格式类似C:\inetpub\wwwroot\IQCSystem\Content\Uploads\image.jpg。你把这个路径直接拼到img的src属性里,邮件发送到收件人设备后,邮箱客户端会尝试在收件人本地磁盘查找这个路径的文件,根本访问不到你服务器上的存储资源,图片自然无法加载。
修复方案
最稳定的方案是使用内联资源(LinkedResource)将图片作为邮件的关联附件嵌入正文,不需要依赖公网访问,所有主流邮箱客户端都能正常显示,实现逻辑如下:
- 给要嵌入的图片生成全局唯一的ContentId标识
- 构造HTML格式的邮件 alternate view,正文里img标签的src使用
cid:{ContentId}格式引用图片,不再使用本地物理路径 - 将服务器本地图片读取为LinkedResource对象,绑定对应的ContentId,附加到邮件视图中
- 将构造好的HTML视图添加到邮件对象中发送即可
对应实现代码参考:
// 生成唯一图片资源ID,避免和邮件内其他资源冲突 string imgContentId = Guid.NewGuid().ToString("N"); // 构造邮件正文,img标签通过cid引用内联图片 string email_body = "Item has been checked by QC with the following details.. "; email_body += @"<table>"; // ...... 原有的表格行拼接逻辑保持不变 ...... // 缺陷图片行改为cid引用方式 email_body += $"<tr><td>Defective Picture</td><td>:</td><td><img src='cid:{imgContentId}' width='100' height='100' alt='defect img' style='margin:20px 0px 0px 20px'/></td></tr>"; email_body += "</table>"; // 构造HTML邮件视图 AlternateView htmlView = AlternateView.CreateAlternateViewFromString(email_body, null, MediaTypeNames.Text.Html); // 加载本地图片作为内联资源 string sImage = System.Web.HttpContext.Current.Server.MapPath("~/Content/Uploads/image.jpg"); LinkedResource defectImg = new LinkedResource(sImage, MediaTypeNames.Image.Jpeg); defectImg.ContentId = imgContentId; // 和正文cid一一对应 defectImg.TransferEncoding = System.Net.Mime.TransferEncoding.Base64; htmlView.LinkedResources.Add(defectImg); // 组装邮件对象 MailMessage mailMsg = new MailMessage(); mailMsg.From = new MailAddress("你的发件箱地址"); mailMsg.To.Add(To); mailMsg.Subject = Subject; // 注意不要直接把email_body赋值给Body,要添加构造好的AlternateView mailMsg.AlternateViews.Add(htmlView); // 后续使用SmtpClient发送mailMsg即可
备选方案说明
如果你的系统图片可以通过站点的公网域名直接访问,也可以把img的src替换为图片的公网绝对地址(例如https://你的系统域名/Content/Uploads/image.jpg),但这种方式大部分邮箱客户端默认会拦截外链图片,需要收件人手动确认“显示图片”才能加载,稳定性弱于内联嵌入方案。
内容的提问来源于stack exchange,提问作者Preyonti
相关产品推荐
相关产品推荐

