簡體   English   中英

(C#) 郵件中的圖像未顯示在 Outlook 中

[英](C#) Image in Mail not displayed in Outlook

我想發送帶有圖像的郵件。 我編寫的代碼工作正常,但由於某種我不知道的原因,它不適用於 Outlook 客戶端。 我發送的測試郵件是(左:Thunderbird,右:Outlook):

在 Thunderbird 客戶端中看到的郵件 在 Outlook 客戶端中看到的郵件

我的代碼應該做的是:它從RichTextBox獲取 RTF 並將其轉換為 HTML。 這會將嵌入在 HTML 中的圖像保留為 base64 字符串。 我一一提取所有 base64 編碼的圖像,並將它們放入一個被LinkedResource接受的MemoryStream中。 由於郵件客戶端通常不接受嵌入圖像,因此我將 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. 我將圖像保留為 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;

盡管這似乎對其他人有所幫助,但這些對我都不起作用。 我忽略了什么嗎?

您是否確認它不是來自信任中心設置的圖像塊。

取消阻止單個消息的圖像下載:單擊消息頂部的信息欄。 單擊下載圖片。

取消阻止所有消息的圖像下載: Outlook 2007 在“工具”菜單上,單擊信任中心 > 自動下載。 取消選中“不要在 HTML 電子郵件或 RSS 項目中自動下載圖片”復選框。

Outlook 2010 及更高版本:在“文件”選項卡上,單擊選項 > 信任中心。 在 Microsoft Outlook 信任中心下,單擊信任中心設置。 取消選中“不要在 HTML 電子郵件或 RSS 項目中自動下載圖片”復選框。

取消阻止來自特定 email 地址或域的所有郵件的圖片下載:在從特定 email 地址或域發送的打開郵件中,右鍵單擊被阻止的項目。 執行以下操作之一:

  • 單擊將發件人添加到安全發件人列表。
  • 單擊將域 [@domain] 添加到安全發件人列表。

Base64 圖像在 Outlook 中默認被阻止。

您需要將圖像附加到 email 並在 email 上設置PR_ATTACH_CONTENT_ID屬性(DASL 名稱為“http://schemas.microsoft.com/mapi/proptag/0x3712001E”)。 有關更多信息,請參閱使用宏在新消息中嵌入圖像

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM