(C#) Outlook 中不显示邮件中的图像

问题描述

我想发送带有图片的邮件。我编写的代码工作正常,但由于我不知道的某种原因,它不适用于 Outlook 客户端。 我发送的测试邮件是(左:Thunderbird,右:Outlook):

Mail as seen in a Thunderbird client

Mail as seen in an Outlook client

我的代码应该做的是:它从 RichTextBox 获取 RTF 并将其转换为 HTML。这使得嵌入在 HTML 中的图像作为 base64 字符串。我将所有 base64 编码的图像一一提取,并将它们放入 MemoryStream 接受的 LinkedResource 中。由于邮件客户端通常不接受嵌入图像,因此我将 HTML 中的嵌入图像替换为内容 ID。然后我设置 LinkedResource 的一些属性并将其添加到 AlternateView。然后将此替代视图添加到 System.Net.Mail.MailMessage 并发送邮件。 对应的代码:

MemoryStream mem = null;
private readonly Regex embeddedImageRegex = new Regex("src=\"data:image/.*?\"");

public MyHTMLMailMessage() 
    : base()
{
    this.SubjectEncoding = Encoding.UTF8;
    this.BodyEncoding = Encoding.UTF8;
    this.IsBodyHtml = true;
}

public bool Send()
{
    // create HTML View with images
    AlternateView htmlView = AlternateView.CreateAlternateViewFromString(HTML,System.Text.Encoding.UTF8,MediaTypeNames.Text.Html);
    ReplaceEmbeddedImagesWithCID(htmlView);
    this.AlternateViews.Add(htmlView);

    this.Body = HTML;

    SmtpClient client = new SmtpClient(server,port);
    client.DeliveryMethod = SmtpDeliveryMethod.Network;
    client.UseDefaultCredentials = String.IsNullOrEmpty(username);

    try
    {
        client.Send(this);
        return true;
    }
    catch (SmtpException e)
    {
        return false;
    }
    finally
    {
        mem?.Close();
    }
}

private void ReplaceEmbeddedImagesWithCID(AlternateView altView)
{
    string extension;
    int imageIndex = 0;
    string contentID = $"image{imageIndex}";

    // go through every base64 string,create a content id and LinkedResource for it
    while (embeddedImageRegex.IsMatch(HTML))
    {
        extension = new Regex("image/.*?;").Match(HTML).Value
                    .Replace("image/","")
                    .Replace(";","");

        string base64img = embeddedImageRegex.Match(HTML).Value
                            .Replace("src=\"","")
                            .Replace("\"","")
                            .Split(',')[1];
        HTML = embeddedImageRegex.Replace(HTML,$"src=\"cid:image{imageIndex}\"",1);

        byte[] byBitmap = Convert.FromBase64String(base64img);
        mem = new MemoryStream(byBitmap);
        mem.Position = 0;
        
        LinkedResource linkedImage = new LinkedResource(mem,$"image/{extension}");
        linkedImage.ContentId = contentID;

        altView.LinkedResources.Add(linkedImage);
        altView = AlternateView.CreateAlternateViewFromString(HTML,null,MediaTypeNames.Text.Html);
        imageIndex++;
    }
}

所以我尝试了不同的解决方案,但都没有奏效。 我目前的步骤:

  1. 我在 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\x.0\Outlook\Options\MailHKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\x.0\Common 中编辑了一些注册键

  2. 我在 HTML 中将图像保留为 base64 字符串

  3. 添加了一些属性

linkedImage.TransferEncoding = TransferEncoding.Base64;
linkedImage.ContentType.Name = contentID;
linkedImage.ContentLink = new Uri($"cid:{contentID}");
this.Headers.Add("Content-ID",$"<image{imageIndex}>");
this.Headers.Add("X-Attachment-Id",$"image{imageIndex}");
altView.TransferEncoding = TransferEncoding.QuotedPrintable;

这些对我都不起作用,尽管它似乎帮助了其他人。我是不是忽略了什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)