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

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来关联本地图片,具体步骤和修改后的代码如下:

  1. 加载本地图片到LinkedResource,设置唯一的ContentId(和HTML里的引用对应)
  2. 在HTML的<img>标签里用cid:你的ContentId作为src属性值
  3. 把LinkedResource添加到BodyBuilder.LinkedResources集合中
  4. 优化连接逻辑:将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:33:38