【问题标题】:Email with embedded images showing as "Preview Document" in Outlook 2010 & 2016带有嵌入图像的电子邮件在 Outlook 2010 和 2016 中显示为“预览文档”
【发布时间】:2016-03-01 15:32:35
【问题描述】:

我们目前正在通过 Amazon SES 发送一封相对简单的 C# 电子邮件。对于几乎所有客户,电子邮件看起来都正确,但 Outlook 并未显示电子邮件,而是将其显示为附件。

电子邮件构建代码:

 LinkedResource logoResource = null;
 //Attach Logo 
 if (!string.IsNullOrEmpty(emailMessage.Logo))
 {
     messageHtml = messageHtml.Replace("{{Logo}}", emailMessage.Logo);
     var imageData = Convert.FromBase64String(emailMessage.Logo.Split(Convert.ToChar(","))[1]);

     logoResource = new LinkedResource(new MemoryStream(imageData))
     {
         ContentId = "logo",
         ContentType = new ContentType("image/png"),
         TransferEncoding = TransferEncoding.Base64
     };
 }
 var htmlView = AlternateView.CreateAlternateViewFromString(messageHtml, null, MediaTypeNames.Text.Html);

htmlView.LinkedResources.Add(logoResource);

var message = new MailMessage {
   IsBodyHtml = false,
   Subject = emailMessage.Subject,
   Body = string.IsNullOrEmpty(emailMessage.MessageText) ? emailMessage.Message : emailMessage.MessageText,
   From = new MailAddress(emailMessage.From)
 };

message.AlternateViews.Add(htmlView);

模板:

<tr style="margin-bottom:15px;/*logostyle*/">
    <td width="600" class="mobile" style="font-family: arial; font-size: 12px;  padding: 10px;" align="center">
    <img src="cid:logo"  style="width: 350px" />
   </td>
</tr>

如果您还有什么感兴趣的,请告诉我。

【问题讨论】:

  • hotmail.com 和 Outlook 喜欢将图像的 src 从 http 更改为 https。也许它也会改变你的情况下的 src 。然后outlook不知道在哪里显示图片,所以显示为附件
  • 这是内嵌图片?所以我们没有引用服务器。
  • CreateAlternateViewFromString 也停止了对我的正常工作。对于 SES,我必须做的是将消息转换为原始内存流并以这种方式发送。您可以使用 SES SendRawEmail 调用。我可以发送一个代码 sn-p。
  • @Nix 我知道.. 但我会检查电子邮件源代码中的 src 是否正确
  • 它在其他浏览器中显示良好(图片)@ManosPasgiannis

标签: c# html-email


【解决方案1】:

我认为 Outlook 没有替代视图,这就是它不适合它的原因。

创建邮件消息对象后发送邮件的小片段。

RawMessage rawMessage;

using (MemoryStream memoryStream = ConvertMailMessageToMemoryStream(gMessage))
{
    rawMessage = new RawMessage(memoryStream);
}

SendRawEmailRequest request = new SendRawEmailRequest();

request.RawMessage = rawMessage;
request.Destinations.Add(MessageToSend.ToRecipient.Trim().ToLower());
request.Source = MessageToSend.SenderEmail;

var ses = new Amazon.SimpleEmail.AmazonSimpleEmailServiceClient(UserName, sMailPassword, Amazon.RegionEndpoint.USEast1);

SendRawEmailResponse response = ses.SendRawEmail(request);

这是来自 Amazon Support forum 的 ConvertMailMessageToMemoryStream。

/// <summary>
/// Converts the mail message to memory stream. https://goo.gl/TrCqBu
/// </summary>
/// <param name="message">The message.</param>
/// <returns>MemoryStream.</returns>
public static MemoryStream ConvertMailMessageToMemoryStream(MailMessage message)
{
    Assembly assembly = typeof(SmtpClient).Assembly;
    Type mailWriterType = assembly.GetType("System.Net.Mail.MailWriter");
    MemoryStream fileStream = new MemoryStream();
    ConstructorInfo mailWriterContructor = mailWriterType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(Stream) }, null);
    object mailWriter = mailWriterContructor.Invoke(new object[] { fileStream });
    MethodInfo sendMethod = typeof(MailMessage).GetMethod("Send", BindingFlags.Instance | BindingFlags.NonPublic);

    if (sendMethod.GetParameters().Length == 2)
        sendMethod.Invoke(message, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true }, null);
    else
        sendMethod.Invoke(message, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true, true }, null);

    MethodInfo closeMethod = mailWriter.GetType().GetMethod("Close", BindingFlags.Instance | BindingFlags.NonPublic);
    closeMethod.Invoke(mailWriter, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { }, null);
    return fileStream;
}

【讨论】:

    猜你喜欢
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 2022-09-25
    • 2012-12-08
    • 2011-09-29
    相关资源
    最近更新 更多