[英](C#) Image in Mail not displayed in Outlook
我想發送帶有圖像的郵件。 我編寫的代碼工作正常,但由於某種我不知道的原因,它不適用於 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++;
}
}
所以我經歷了不同的解決方案,但都沒有奏效。 到目前為止我的步驟:
我在HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\x.0\Outlook\Options\Mail
或HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\x.0\Common
中編輯了一些注冊密鑰
我將圖像保留為 HTML 中的 base64 字符串
添加了一些屬性
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 地址或域發送的打開郵件中,右鍵單擊被阻止的項目。 執行以下操作之一:
Base64 圖像在 Outlook 中默認被阻止。
您需要將圖像附加到 email 並在 email 上設置PR_ATTACH_CONTENT_ID
屬性(DASL 名稱為“http://schemas.microsoft.com/mapi/proptag/0x3712001E”)。 有關更多信息,請參閱使用宏在新消息中嵌入圖像。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.