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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:53:10