创建在iOS邮件应用

时间:2016-11-02 18:31:45

标签: ios email c#-4.0

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

  1. 使用AlternateView
  2. 使用inline Attachement
  3. 选项2更糟糕的是它没有出现在我的任何测试客户端上(outlook 2010/2013,Samsung android email client,ios 10 email client)。

    选项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;
    

3 个答案:

答案 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邮件应用程序正确显示,这个组合是唯一一个那很有用。

答案 1 :(得分:0)

我在工作项目中遇到了类似的问题。使用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");

答案 2 :(得分:0)

作为一种可能的选择,您可以尝试对图像进行base64编码。

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

我刚刚在Outlook,Web的Outlook和iOS Mail中测试了我的图像。为我工作。

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

更多信息here

another good有关此主题的信息来源