(C#) 邮件中的图像在 Outlook 中不显示
(C#) Image in Mail not displayed in Outlook
我想发送带有图片的邮件。我编写的代码工作正常,但出于某种我不知道的原因,它不适用于 Outlook 客户端。
我发送的测试邮件是(左:Thunderbird,右:Outlook):
我的代码应该做的是:它从 RichTextBox
获取 RTF 并将其转换为 HTML。这会将嵌入 HTML 中的图像保留为 base64 字符串。我一张一张地提取所有base64编码的图像并将它们放入MemoryStream
中,该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++;
}
}
所以我尝试了不同的解决方案,但其中 none 有效。
到目前为止我的步数:
我在 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;
None 其中的一些对我有用,尽管它似乎对其他人有所帮助。我是不是忽略了什么?
您是否确认它不是信任中心设置中的图像块。
取消阻止单个消息的图像下载:
单击消息顶部的信息栏。
单击下载图片。
取消阻止所有邮件的图片下载:
展望 2007
在“工具”菜单上,单击“信任中心”>“自动下载”。
取消选中“不自动下载 HTML 电子邮件或 RSS 项目中的图片”复选框。
Outlook 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。
我想发送带有图片的邮件。我编写的代码工作正常,但出于某种我不知道的原因,它不适用于 Outlook 客户端。 我发送的测试邮件是(左:Thunderbird,右:Outlook):
我的代码应该做的是:它从 RichTextBox
获取 RTF 并将其转换为 HTML。这会将嵌入 HTML 中的图像保留为 base64 字符串。我一张一张地提取所有base64编码的图像并将它们放入MemoryStream
中,该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++;
}
}
所以我尝试了不同的解决方案,但其中 none 有效。 到目前为止我的步数:
我在
中编辑了一些注册码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;
None 其中的一些对我有用,尽管它似乎对其他人有所帮助。我是不是忽略了什么?
您是否确认它不是信任中心设置中的图像块。
取消阻止单个消息的图像下载: 单击消息顶部的信息栏。 单击下载图片。
取消阻止所有邮件的图片下载: 展望 2007 在“工具”菜单上,单击“信任中心”>“自动下载”。 取消选中“不自动下载 HTML 电子邮件或 RSS 项目中的图片”复选框。
Outlook 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。