如何解决(C#) Outlook 中不显示邮件中的图像
我想发送带有图片的邮件。我编写的代码工作正常,但由于我不知道的某种原因,它不适用于 Outlook 客户端。 我发送的测试邮件是(左:Thunderbird,右:Outlook):
我的代码应该做的是:它从 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++;
}
}
所以我尝试了不同的解决方案,但都没有奏效。 我目前的步骤:
-
我在
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;
这些对我都不起作用,尽管它似乎帮助了其他人。我是不是忽略了什么?
解决方法
您确认它不是来自信任中心设置的图像块。
取消阻止单个消息的图片下载: 单击消息顶部的信息栏。 点击下载图片。
取消阻止所有邮件的图片下载: 展望 2007 在“工具”菜单上,单击信任中心 > 自动下载。 取消选中“不要自动下载 HTML 电子邮件或 RSS 项目中的图片”复选框。
展望 2010 年及以后: 在“文件”选项卡上,单击选项 > 信任中心。 在 Microsoft Outlook 信任中心下,单击信任中心设置。 取消选中“不要自动下载 HTML 电子邮件或 RSS 项目中的图片”复选框。
取消阻止来自特定电子邮件地址或域的所有邮件的图片下载: 在从特定电子邮件地址或域发送的打开邮件中,右键单击被阻止的项目。 执行以下操作之一:
- 点击将发件人添加到安全发件人列表。
- 单击将域 [@domain] 添加到安全发件人列表。
Base64 图像在 Outlook 中默认被阻止。
您需要将图像附加到电子邮件并设置电子邮件的 PR_ATTACH_CONTENT_ID
属性(DASL 名称为“http://schemas.microsoft.com/mapi/proptag/0x3712001E”)。有关详细信息,请参阅 Embed Images in New Messages using a Macro。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。