C# 发送包含内嵌图片的 HTML 邮件详解
在开发需要发送通知的应用时,往往希望邮件内容图文并茂。本方案演示如何在 C# 中使用 System.Net.Mail 组件构建 HTML 邮件正文,并通过 Content-ID (CID) 机制将本地图片“内嵌”到邮件中,从而在 Outlook、Gmail 等主流客户端中直接展示图片,而非作为普通附件下载。
核心原理与准备
要实现图片和正文合一的效果,关键在于使用 AlternateView 定义邮件的内容结构,并利用 LinkedResource 绑定图片。HTML 正文中的 <img> 标签需引用由 LinkedResource.ContentId 生成的 ID(通常写法为 cid:ImageName)。
第1步:配置基础邮件信息
首先实例化 MailMessage 对象,设定发件人、收件人及主题。这一步确立邮件的基本骨架。
第2步:构建 HTML 视图并绑定图片
这是实现内嵌图片的关键环节。我们需要创建一个 HTML 格式的 AlternateView,并在其中插入指向图片 CID 的标签。
- 编写 HTML 主体:在 HTML 字符串中使用
<img src="cid:Pic1">引用图片。 - 创建资源关联:实例化
LinkedResource指定本地图片路径(如pic.jpg),并将其ContentId设为与 HTML 中一致的值(如 "Pic1")。 - 添加链接:将
LinkedResource添加到AlternateView.LinkedResources集合中。 - 附加纯文本备选:为了兼容不支持 HTML 的旧式邮箱客户端,建议同时添加一个纯文本版本的
AlternateView。
第3步:发送邮件
实例化 SmtpClient 并配置 SMTP 服务器地址(如 smtp.example.com),调用 Send 方法完成投递。
代码实现示例
以下是完整的 C# 代码片段,展示了如何设置上述参数:
using System.Net;
using System.Net.Mail;
// 1. 创建邮件消息对象
MailMessage m = new MailMessage();
m.From = new MailAddress("sender@example.com", "发件人名称");
m.To.Add(new MailAddress("receiver@example.com", "收件人名称"));
m.Subject = "测试HTML邮件与内嵌图片";
// 2. 创建 HTML 视图
// 注意:src 属性必须写成 "cid:Pic1",其中 Pic1 对应下方 LinkedResource 的 ContentId
string htmlBody = "<html><body><h1>图片展示</h1>" +
"<p>这是一张内嵌图片:</p>" +
"<img src=\"cid:Pic1\">" +
"</body></html>";
AlternateView avHtml = AlternateView.CreateAlternateViewFromString(htmlBody, null, MediaTypeNames.Text.Html);
// 3. 创建并关联图片资源
// 确保 pic.jpg 文件存在于程序运行目录下,或填写完整路径
LinkedResource pic1 = new LinkedResource("pic.jpg", MediaTypeNames.Image.Jpeg);
pic1.ContentId = "Pic1"; // 必须与 HTML 中的 cid 值一致
avHtml.LinkedResources.Add(pic1);
// 4. 添加纯文本备用视图(重要:兼容不支持HTML的客户端)
string textBody = "您的邮件客户端不支持HTML显示,请升级或查看附件。";
AlternateView avText = AlternateView.CreateAlternateViewFromString(textBody, null, MediaTypeNames.Text.Plain);
// 5. 将所有视图加入邮件
m.AlternativeViews.Add(avHtml);
m.AlternativeViews.Add(avText);
// 6. 配置SMTP并发送
SmtpClient client = new SmtpClient("smtp.example.com");
// 若需认证,可在此处设置 Credentials 属性
// client.Credentials = new NetworkCredential("user", "pwd");
client.Send(m);
常见问题排查
- 图片未显示/显示红叉:检查
LinkedResource的ContentId是否与 HTML 中cid:后的字符串完全一致(区分大小写)。确保图片文件路径正确且存在。 - 被归类为垃圾邮件:大量内嵌小图片或缺少 SPF/DKIM 验证可能导致邮箱服务拦截。建议尽量使用外链图片URL(
<img src="http://...">)而非内嵌,或通过邮件服务商模板中心发送。 - 兼容性:Outlook 对内嵌图片支持较好,但某些 Webmail 客户端出于安全考虑默认不加载图片,会提示用户手动允许。
以上就是 C# 发送包含内嵌图片的 HTML 邮件的详细内容,更多关于 C# 电子邮件编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













