如何通过MemoryStream在MailKit邮件正文中嵌入图片?
用MailKit通过MemoryStream嵌入资源图片到邮件正文
你已经实现了从资源文件读取图片并转成MemoryStream的逻辑,但没用到它。下面是修改后的代码,直接用MemoryStream嵌入图片,去掉硬编码路径:
修改后的核心代码
using MailKit.Net.Smtp; using MailKit; using System.Drawing.Imaging; public static List<MessageSet> MessageList = new List<MessageSet>(); public static void SendErrorNotification(MONMessage message) { var email = new MimeMessage(); try { var supportImage = GetImageByName("support_image.jpg"); // 直接将Bitmap保存到MemoryStream,比转byte[]更简洁 MemoryStream imageMemoryStream = new MemoryStream(); supportImage.Save(imageMemoryStream, ImageFormat.Jpeg); imageMemoryStream.Position = 0; // 重置流位置,确保能被读取 var validateMessage = MessageList.Where(m => m.MessageTime == message.MessageTime && m.MessageSetVal == message.MessageSet && m.MessageStatus == message.Status); if (validateMessage.Count() == 0) { email.From.Add(new MailboxAddress("Monitor", "m.long@myself.com")); email.To.Add(new MailboxAddress("Lancair", "m.long@myself.com")); email.Subject = "Environment Error Found - Please Review"; var Name = string.IsNullOrEmpty(message.Name) ? "N/A" : message.Name; var emailText = "<br><br>" + "The following error has occurred within the Data Environment" + "<br>" + "Time: " + message.MessageTime + "<br>" + " Database: " + message.DBName + "<br>" + " Name: " + Name + "<br>" + " Event Id: " + message.EventID + "<br>" + " Message: " + message.Text + "</b>"; BodyBuilder _body = new BodyBuilder { HtmlBody = emailText, // 直接用文本,不用先转TextPart }; // 使用MemoryStream添加LinkedResource var image = _body.LinkedResources.Add("support_image.jpg", imageMemoryStream); image.ContentId = MimeUtils.GenerateMessageId(); // 拼接HTML,嵌入图片 _body.HtmlBody = string.Format("<p>Hello Support</p><br><img src=\"cid:{0}\">", image.ContentId) + _body.HtmlBody; email.Body = _body.ToMessageBody(); // 添加到已发送列表 MessageList.Add(new MessageSet { MessageTime = message.MessageTime, MessageSetVal = message.MessageSet, MessageStatus = message.Status }); using (var smtp = new SmtpClient()) { smtp.Connect("mymail.home.com", 0, false); smtp.Send(email); smtp.Disconnect(true); } } } catch (Exception ex) { Debug.WriteLine(ex.Message); } } public static Bitmap GetImageByName(string imageName) { System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); string resourceName = asm.GetName().Name + ".Properties.Resources"; var rm = new System.Resources.ResourceManager(resourceName, asm); return (Bitmap)rm.GetObject(imageName); }
关键修改点
- 简化Bitmap转流逻辑:直接用
Bitmap.Save()将图片写入MemoryStream,比手动处理BitmapData更可靠,自动适配图片格式编码。 - 重置流位置:写入MemoryStream后必须将
Position设为0,否则MailKit读取流时会从末尾开始,导致图片内容为空。 - 使用Stream重载方法:调用
LinkedResources.Add(string fileName, Stream stream),fileName用于自动识别MIME类型(比如.jpg对应image/jpeg),也可以手动指定ContentType:var image = _body.LinkedResources.Add(imageMemoryStream); image.ContentType = new ContentType("image", "jpeg"); image.ContentId = MimeUtils.GenerateMessageId(); - 精简HTML构建:不需要先创建TextPart再转字符串,直接将HTML文本赋值给BodyBuilder的HtmlBody。
内容的提问来源于stack exchange,提问作者user2284452
相关产品推荐
相关产品推荐

