【问题标题】:Create inline image that displays properly in iOS mail app创建在 iOS 邮件应用程序中正确显示的内联图像
【发布时间】:2016-11-02 18:31:45
【问题描述】:

所以我尝试了 2 种不同的方法来使用 c# 创建内联图像:

  1. 使用AlternateView
  2. 使用inline Attachement

选项 2 更糟糕的是,它没有出现在我的任何测试客户端(outlook 2010/2013、Samsung android 电子邮件客户端、ios 10 电子邮件客户端)上。

选项 1 几乎完美,只要没有其他附件,所有客户端都能正确显示内联图像。但是,如果您在电子邮件中添加文件附件,那么只有在 iOS 电子邮件应用程序上才会出现奇怪的副作用。在 iOS 上,客户端将内嵌图像和附件都显示为附件(内嵌图像显示为图标)。

我试图通过在 Outlook 中编写带有嵌入图像和附件的电子邮件来解决这个问题。 Outlook 生成看起来像两个常规附件(查看来自 Outlook 和 dotNet 生成的电子邮件的原始消息数据),图像被标记为内联内容处置。这适用于我所有的测试客户。除非使用 .Net Mail 消息 api 来复制它(选项 2),否则它不起作用。我不知道这里发生了什么。

编辑 1

有趣的是,当使用选项 2 时,电子邮件正文被编码为 base64。这与 Outlook 客户端的管理方式不同。正文是纯文本,内联附件图像是唯一以 bas64 编码的内容。

编辑 2 使用选项 2 时设置以下属性会使正文再次变为纯文本:

mail.BodyEncoding = Encoding.UTF8;
mail.BodyTransferEncoding = TransferEncoding.QuotedPrintable;

【问题讨论】:

    标签: ios email c#-4.0


    【解决方案1】:

    所以为了让它发挥作用,我必须结合这两种方法。下面是对我有用的方法,它将签名图像显示为预期的(内联/嵌入式)图像,并将附件显示为图标(无论如何在 iOS 中)。这在三星 Android 手机和 Outlook 2010/2013 中也能正确显示。为简单起见,我将仅将嵌入的图像包含在邮件正文中作为示例:

    var smtpMail = new SmtpClient
    using (var mail = new MailMessage())
    {
        mail.From = new MailAddress(Settings.Default.FromAddress, Settings.Default.FromDisplayName);
        mail.To.Add(toAddress);
        mail.Subject = subjectText;
        mail.IsBodyHtml = true;
        mail.BodyEncoding = Encoding.UTF8;
        mail.BodyTransferEncoding = TransferEncoding.QuotedPrintable;
        mail.Attachments.Add(new Attachment(nonInlinefilePath));
    
        var imgCid = "img001.jpg"
        var bodyText = $"<html><body><img  src=\"cid:{imgCid}\" alt=\"Sample Image\" /></body></html>";
        var altView = AlternateView.CreateAlternateViewFromString(bodyText, Encoding.UTF8, MediaTypeNames.Text.Html);
    
        var inlineFileResource = new LinkedResource(imagePath, MediaTypeNames.Image.Jpeg)
        {
            TransferEncoding = TransferEncoding.Base64,
            ContentId = imgCid,
            ContentType =
            {
                Name = imgCid
            },
        };
    
        var inlineFileAttachment = new Attachment(imagePath, MediaTypeNames.Image.Jpeg)
        {
            ContentId = imgCid
        };
        inlineFileAttachment.ContentDisposition.Inline = true;
        inlineFileAttachment.ContentDisposition.DispositionType = DispositionTypeNames.Inline;
    
        altView.LinkedResources.Add(inlineFileResource);
        mail.AlternateViews.Add(altView);
        mail.Attachments.Add(inlineFileAttachment);
        smtpMail.Send(mail);
    }
    

    我对电子邮件协议或 iOS 电子邮件应用程序了解得不够多,不知道为什么需要这样做,但经过多次、多次、多次不同的尝试以使 iOS 邮件应用程序正确显示此内容,这个组合是唯一的组合那行得通。

    【讨论】:

      【解决方案2】:

      我在一个工作项目中遇到了类似的问题。使用 System.Net.Mail LinkedResource 嵌入到消息正文中的图像在大多数电子邮件客户端中看起来都很好,但在版本 10 期间进行版本升级后,iOS 电子邮件就不行了。 图像将具有零字节并添加大小为零的附件。我所做的是解决这个问题是定义媒体类型,而之前我没有。
      之前:

          LinkedResource logo = new LinkedResource(HttpContext.Current.Server.MapPath("/images/imgname.png"));
      

      之后:

          LinkedResource(HttpContext.Current.Server.MapPath("/images/imgname.png"), "image/png");
      

      【讨论】:

        【解决方案3】:

        作为一种可能的替代方法,您可以尝试使用 base64 编码您的图像。

        <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAADSCAMAAABThmYtAAAAXVB" alt="img" />
        

        我刚刚在 Outlook、Outlook for web 和 iOS Mail 中测试了我的图像。为我工作。

        您可以使用this tool(或任何base64 编码器)来生成base64 图像标签

        更多信息here

        another good此主题的信息来源

        【讨论】:

          猜你喜欢
          • 2019-11-01
          • 2014-01-27
          • 2022-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-21
          • 2018-02-02
          • 2014-12-05
          相关资源
          最近更新 更多