【问题标题】:(C#) Image in Mail not displayed in Outlook(C#) 邮件中的图像未显示在 Outlook 中
【发布时间】:2021-06-26 10:29:26
【问题描述】:

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

我的代码应该做的是:它从RichTextBox 获取 RTF 并将其转换为 HTML。这会将嵌入在 HTML 中的图像保留为 base64 字符串。我一一提取所有base64编码的图像并将它们放入MemoryStreamLinkedResource接受。由于邮件客户端通常不接受嵌入图像,因此我将 HTML 中的嵌入图像替换为 content-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. 我将图像作为 base64 字符串保留在 HTML 中

  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;

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

【问题讨论】:

    标签: c# html image outlook mailmessage


    【解决方案1】:

    在 Outlook 中默认阻止 Base64 图像。

    您需要将图像附加到电子邮件并在电子邮件上设置PR_ATTACH_CONTENT_ID 属性(DASL 名称为“http://schemas.microsoft.com/mapi/proptag/0x3712001E”)。请参阅Embed Images in New Messages using a Macro 了解更多信息。

    【讨论】:

    • 这是我需要的缺失信息。谢谢:)
    【解决方案2】:

    您是否确认它不是来自信任中心设置的图像块。

    取消阻止单个消息的图片下载: 单击消息顶部的信息栏。 点击下载图片。

    取消阻止所有邮件的图片下载: 展望 2007 在“工具”菜单上,单击信任中心 > 自动下载。 取消选中“不要在 HTML 电子邮件或 RSS 项目中自动下载图片”复选框。

    展望 2010 及更高版本: 在“文件”选项卡上,单击选项 > 信任中心。 在 Microsoft Outlook 信任中心下,单击信任中心设置。 取消选中“不要在 HTML 电子邮件或 RSS 项目中自动下载图片”复选框。

    取消阻止来自特定电子邮件地址或域的所有邮件的图片下载: 在从特定电子邮件地址或域发送的打开邮件中,右键单击被阻止的项目。 执行以下操作之一:

    • 单击将发件人添加到安全发件人列表。
    • 单击将域 [@domain] 添加到安全发件人列表。

    【讨论】:

    • 图片确实被信任中心屏蔽了,只是下载而已。在我手动下载图像(或禁用图像阻止)后,我得到了我的问题中看到的空图像。
    • 哦,我明白了。您会选择通常的在线服务器图像链接吗?
    • 图像在发送邮件之前不能存储在服务器上。我可以使用绝对路径。不知道会不会有同样的效果。
    猜你喜欢
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 2016-12-22
    • 2020-07-03
    • 2010-09-13
    • 1970-01-01
    相关资源
    最近更新 更多