ASP.NET Core MVC中SmtpClient如何将本地图片嵌入邮件正文
问题描述
我需要发送包含本地图片的邮件,要求图片作为邮件正文的头部,图片存放在本地项目文件夹中。我用SmtpClient写了一段代码,但没法在正文里正确嵌入图片,尝试过添加附件的代码也没用,求正确的实现方法。
我的代码:
using(var client = new SmtpClient()) { foreach(FeeEntry student in q) { client.Connect("smtp.gmail.com", 465); client.Authenticate("emailaddress", "password"); var bodyBuilder = new BodyBuilder { HtmlBody = $ "<img src='** i want to add image here **'/>" + $ "<h3 style = 'border:2px solid blue; margin-right: 123px ;text-align: center'>Remaing Fee Notification from(OCMWP) </h3>" + $ "<table style = 'border:2px solid blue' border='1'> <thead> </thead> <tr>" + $ "<th> </th><th>Name</th> <th>Fee Type </th> <th>Fee Amount</th> </tr> " + $ "<tbody> <tr> <th>1</th> <td>{student.students.StdName}</td> <td> {student.AddFeeInfo.Feetype} </td> <td> {student.AddFeeInfo.FeeAmount} </td><tr> </tbody> </table> ", TextBody = "{formData.ID}\n{ formData.subject}\n{formData.body}\n{formData.Email}" }; var message = new MimeMessage { Body = bodyBuilder.ToMessageBody() }; message.From.Add(new MailboxAddress("No Reply OCMWP", "bs180201421@vu.edu.pk")); message.To.Add(new MailboxAddress(student.students.StdName, student.students.StdEmailAddress)); message.Subject = "Panding ( OCMWP)"; client.Send(message); client.Disconnect(true); } }
尝试过的无效代码:
foreach(var attachment in attachments) { mailMessage.Attachments.Add(new Attachment(attachment)); }
正确实现方法
你用的是MimeKit库(从BodyBuilder和MimeMessage可以看出),要嵌入图片到HTML正文,不能用普通附件,得用LinkedResource来关联本地图片,具体步骤和修改后的代码如下:
- 加载本地图片到
LinkedResource,设置唯一的ContentId(和HTML里的引用对应) - 在HTML的
<img>标签里用cid:你的ContentId作为src属性值 - 把
LinkedResource添加到BodyBuilder.LinkedResources集合中 - 优化连接逻辑:将
Connect和Disconnect移到循环外,避免频繁建立/断开连接
修改后的完整代码:
using(var client = new SmtpClient()) { // 提前建立连接,无需每次循环重复操作 client.Connect("smtp.gmail.com", 465, true); client.Authenticate("emailaddress", "password"); // 替换成你本地项目文件夹中的图片绝对路径,比如 @"D:\Projects\OCMWP\mail-header.png" string imagePath = @"你的本地图片绝对路径"; // 创建LinkedResource并生成唯一ContentId var headerImage = new LinkedResource(imagePath) { ContentId = Guid.NewGuid().ToString() }; foreach(FeeEntry student in q) { var bodyBuilder = new BodyBuilder { HtmlBody = $"<img src='cid:{headerImage.ContentId}' style='width:100%; max-width:600px;'/>" + $"<h3 style='border:2px solid blue; margin-right: 123px; text-align: center'>Remaining Fee Notification from(OCMWP)</h3>" + $"<table style='border:2px solid blue' border='1'>" + $"<thead></thead>" + $"<tr><th></th><th>Name</th><th>Fee Type</th><th>Fee Amount</th></tr>" + $"<tbody><tr><th>1</th><td>{student.students.StdName}</td><td>{student.AddFeeInfo.Feetype}</td><td>{student.AddFeeInfo.FeeAmount}</td></tr></tbody></table>", TextBody = $"ID: {formData.ID}\nSubject: {formData.subject}\nBody: {formData.body}\nEmail: {formData.Email}" }; // 将图片添加到正文关联资源集合 bodyBuilder.LinkedResources.Add(headerImage); var message = new MimeMessage { From = { new MailboxAddress("No Reply OCMWP", "bs180201421@vu.edu.pk") }, To = { new MailboxAddress(student.students.StdName, student.students.StdEmailAddress) }, Subject = "Pending (OCMWP)", Body = bodyBuilder.ToMessageBody() }; client.Send(message); } // 循环结束后统一断开连接 client.Disconnect(true); }
关键说明:
LinkedResource是专门用于嵌入HTML正文的资源类型,和普通附件的作用不同ContentId是邮件内部的唯一标识,HTML通过cid:前缀引用该资源- 图片路径建议用绝对路径,避免因程序运行目录变化导致找不到文件
- 优化连接逻辑能减少网络开销,也避免频繁连接被邮件服务器限制
内容的提问来源于stack exchange,提问作者bs180201421 MUHAMMAD SHADAB SK
相关产品推荐
相关产品推荐

