将带有 Base64 的 Html 转换为带有 cid 的电子邮件

问题描述 投票:0回答:1

我们有一个工具可以为我们提供嵌入图像的 html,如下所示:

数据:图像/png;base64,1234

我们希望提取所有图像并将其更改为 cid 图像。

有没有一种简单的方法来提取所有嵌入的base64图像并将其转换为带有cid:标签的附件?

我们使用 MailMessage 发送邮件消息,使用 SmtpClient 发送电子邮件。

我们在使用 Base64 嵌入图像时遇到的问题是,并非所有邮件客户端都接受这种方法。

c# asp.net .net base64
1个回答
0
投票

要使用 MailMessage 和 SmtpClient 将嵌入 Base64 图像的 HTML 转换为包含 CID 图像的电子邮件,您可以提取 Base64 图像,将它们保存为文件或流,并将它们附加为带有 Content-ID 的内联附件。以下是实现它的方法:

步骤

  1. 解析 HTML 以查找所有 Base64 编码的图像。解码每个base64

  2. 图像并将其保存为流或临时文件。创造 链接资源 obj

  3. 为每个图像创建并分配一个 Content-ID。

  4. 将 HTML 中的 base64 图像引用替换为 cid: 链接。添加 林克

  5. 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;
    }
}

说明

  1. 提取 Base64 图像:
  • 使用正则表达式查找 HTML 中的所有 Base64 图像字符串。
  • 提取图像类型和数据。
  1. 解码 Base64 并创建 LinkedResource:
  • 将base64字符串转换为字节数组。
  • 为每个图像创建一个 MemoryStream 和一个 LinkedResource。
  1. 用 CID 替换 Base64:
  • 将 HTML 中的 base64 图像替换为与 LinkedResource 的 ContentId 匹配的 cid: 引用。
  1. 将图像附加到电子邮件:
  • 将 LinkedResource 对象添加到 AlternateView。
  1. 发送电子邮件:
  • 使用SmtpClient发送电子邮件。
© www.soinside.com 2019 - 2024. All rights reserved.