我们有一个工具可以为我们提供嵌入图像的 html,如下所示:
数据:图像/png;base64,1234
我们希望提取所有图像并将其更改为 cid 图像。
有没有一种简单的方法来提取所有嵌入的base64图像并将其转换为带有cid:标签的附件?
我们使用 MailMessage 发送邮件消息,使用 SmtpClient 发送电子邮件。
我们在使用 Base64 嵌入图像时遇到的问题是,并非所有邮件客户端都接受这种方法。
要使用 MailMessage 和 SmtpClient 将嵌入 Base64 图像的 HTML 转换为包含 CID 图像的电子邮件,您可以提取 Base64 图像,将它们保存为文件或流,并将它们附加为带有 Content-ID 的内联附件。以下是实现它的方法:
步骤
解析 HTML 以查找所有 Base64 编码的图像。解码每个base64
图像并将其保存为流或临时文件。创造 链接资源 obj
为每个图像创建并分配一个 Content-ID。
将 HTML 中的 base64 图像引用替换为 cid: 链接。添加 林克
dResource 对象到 MailMessage。
代码实现
这是一个 C# 示例:
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Mail;
using System.Net.Mime;
using System.Text.RegularExpressions;
public class EmailWithCidImages
{
public static void SendEmailWithCidImages(string htmlContent, string recipientEmail, string subject)
{
// Create a MailMessage
var mailMessage = new MailMessage
{
From = new MailAddress("[email protected]"),
Subject = subject,
IsBodyHtml = true
};
mailMessage.To.Add(recipientEmail);
// Create an alternate view with CID images
var alternateView = AlternateView.CreateAlternateViewFromString(htmlContent, null, MediaTypeNames.Text.Html);
var imageResources = ExtractAndReplaceBase64Images(ref htmlContent);
// Add all LinkedResources to the alternate view
foreach (var resource in imageResources)
{
alternateView.LinkedResources.Add(resource);
}
mailMessage.AlternateViews.Add(alternateView);
// Send the email using SmtpClient
using (var smtpClient = new SmtpClient("your-smtp-server"))
{
smtpClient.Credentials = new System.Net.NetworkCredential("your-username", "your-password");
smtpClient.Port = 587; // Or your SMTP port
smtpClient.EnableSsl = true;
smtpClient.Send(mailMessage);
}
}
private static List<LinkedResource> ExtractAndReplaceBase64Images(ref string htmlContent)
{
var linkedResources = new List<LinkedResource>();
var base64Regex = new Regex(@"data:image/(?<type>.+?);base64,(?<data>.+?)""", RegexOptions.Compiled);
int imageIndex = 0;
// Match all base64 images
var matches = base64Regex.Matches(htmlContent);
foreach (Match match in matches)
{
var base64Data = match.Groups["data"].Value;
var imageType = match.Groups["type"].Value;
var imageBytes = Convert.FromBase64String(base64Data);
// Create a memory stream for the image
var memoryStream = new MemoryStream(imageBytes);
var resource = new LinkedResource(memoryStream, $"image/{imageType}")
{
ContentId = $"image{imageIndex}@example.com"
};
linkedResources.Add(resource);
// Replace base64 image in HTML with CID reference
htmlContent = htmlContent.Replace(match.Value, $"cid:{resource.ContentId}\"");
imageIndex++;
}
return linkedResources;
}
}
说明