链接的资源图像未显示在 Android 来自 C# 中生成的电子邮件的电子邮件中

Linked Resource Image not showing on Android EMail from email generated in C#

我一直在与 HTML 带有图片的电子邮件作斗争。我让他们在桌面 Thunderbird 和 Outlook 上工作,但是 Android 电子邮件显示损坏的图像。

我知道它可以工作,因为使用 Outlook 创建的电子邮件可以工作,并且与我创建的电子邮件结构非常相似。显然它不一样(否则我的就可以了!),但我看不出我错过了什么。

我没有减少太多代码,因为我希望有人会看到 LinkedResource 或 AlternateResource 的问题,但它可能更大。

HTML 视图中有图像标签,在桌面上可以正常工作。它在 Android 上显示替代文本,图像图标损坏。

如有任何帮助,我们将不胜感激。

        bool SendEmail()
        {
            string fullBody = GenerateHeader() + Body + GenerateFooter();
            string textBody = RemoveHTML(Body);

            AlternateView avHtml = AlternateView.CreateAlternateViewFromString(fullBody, Encoding.UTF8, MediaTypeNames.Text.Html);

            avHtml.TransferEncoding = TransferEncoding.QuotedPrintable;

            MailMessage message = new MailMessage();
            message.IsBodyHtml = true;
            message.Subject = BaseSubject + Subject;
            message.Body = textBody;
            message.AlternateViews.Add(avHtml);
            message.AlternateViews.Add(avText);
            message.Headers.Add("Message-Id",
                                    String.Format("<{0}@{1}>",
                                    Guid.NewGuid().ToString(),
                                    "company.com.au"));

            var assembly = Assembly.GetExecutingAssembly();
            string resourceName = "app.UI.EmbeddedItems.logo.png";

            using (Stream stream = assembly.GetManifestResourceStream(resourceName))
            {
                LinkedResource inline = new LinkedResource(stream, "image/png");
                inline.ContentId = LogoId;
                inline.ContentType.Name = "logo.png";
                inline.ContentLink = new Uri("cid:" + inline.ContentId);
                inline.TransferEncoding = TransferEncoding.Base64;
                inline.ContentType.MediaType = "image/png";

                avHtml.LinkedResources.Add(inline);


                foreach (var addr in ToAddresses)
                {
                    try
                    {
                        message.To.Add(addr);
                    }
                    catch (FormatException ex) // invalid email
                    {
                        error = ex.Message;
                    }
                }
                foreach (var att in Attachments)
                {
                    message.Attachments.Add(att.ToAttachment());
                }

                if (message.To.Count > 0) // we actually added something
                {
                    SmtpClient client = new SmtpClient();

                    try
                    {
                        client.Send(message);
                        return true;
                    }
                    catch (Exception exception)
                    {
                        error = exception.Message;
                        return false;
                    }
                }
                else
                {
                    return true;
                }
            }
        }
    }

    private string GenerateHeader()
    {
        var header = new StringBuilder();

        header.Append("<html xmlns = 'http://www.w3.org/1999/xhtml'>\n");
        header.Append("<head>\n");
        header.Append("<meta content='en-au' http-equiv='Content-Language' />\n");
        header.Append("<meta content='text/html; charset=utf-8' http-equiv='Content-Type' />\n");
        header.Append("<title>Email Notification</title>\n");
        header.Append("</head>\n");
        header.Append("<body>\n");
        header.Append("<img id='").Append(LogoName).Append("' alt='Logo' src='cid:").Append(LogoId).Append("' />\n");

        return header.ToString();
    }

原来问题不在于电子邮件的构造,而在于 HTML 本身。图片标签如下所示:

<img id='Logo.png' alt='Logo' src='cid:LogoId' />

这在桌面邮件客户端上运行良好,但不会在 Android 邮件应用程序或 Google Android 的邮件应用程序上显示图像。为了使其工作,需要将单引号替换为双引号。

这个有效:

<img id="Logo.png" alt="Logo" src="cid:LogoId" />

将 GenerateHeader 更改为在 img 标签中使用双引号而不是单引号解决了问题。对我来说毫无意义,但它有效。