2016-11-02 2 views
1

Так что я пытался 2 различные подходы к созданию встроенного изображения с помощью C#:Создать инлайн изображение, которое отображается правильно в IOS почты приложение

  1. с использованием AlternateView
  2. с использованием inline Attachement

вариант 2 хуже в том, что он не отображается в строке на одном из моих тестовых клиентов (Outlook 2010/2013, клиент электронной почты Samsung android, клиент электронной почты ios 10).

Вариант 1 почти идеальный, все клиенты правильно отображают встроенное изображение, пока нет других вложений. Однако, если вы добавите вложение файла к электронной почте, только в приложении электронной почты iOS вы получите странный побочный эффект. В iOS клиент отображает как встроенное изображение, так и вложение в виде вложений (встроенное изображение отображается как значок).

Я попытался понять это, написав электронное письмо в Outlook со встроенным изображением и вложением. Outlook генерирует то, что выглядит как два регулярных вложения (смотря на данные необработанных сообщений как с Outlook, так и сгенерированных электронной почты dotNet), причем изображение помечено как встроенное содержимое. И это работает на всех моих тестовых клиентах. За исключением случаев использования сообщения .Net Mail api для его тиражирования (вариант 2), он не работает. Я затрудняюсь понять, что здесь происходит.

Edit 1

Что интересно, что при использовании варианта 2, тело электронной почты доставляются кодируются как base64. Это отличается от того, как это делает клиент Outlook. Там тело находится в текстовом виде, а встроенное изображение привязки - единственное, что закодировано в bas64.

Edit 2 Установка следующих свойств при использовании Вариант 2 возвращает тело, чтобы быть простой текст снова:

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

ответ

0

Так, чтобы получить эту работу, я должен был сочетать оба подхода. Ниже приводится то, что сработало для меня, оно отображает изображение подписи, как предполагалось (встроенное/встроенное) изображение, а вложение - как значок (в iOS в любом случае). Это также правильно отображалось на телефоне Samsung 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, чтобы отобразить это правильно, это комбо было единственным, что сработало.

0

У меня была аналогичная проблема с рабочим проектом. Изображения, встроенные в тело сообщения с использованием System.Net.Mail LinkedResource, будут выглядеть нормально в большинстве почтовых клиентов, но не с электронной почтой iOS после обновления версии во время версии 10. Изображения будут иметь нулевые байты и добавлены вложения с нулевым размером. Я решил исправить это, чтобы определить тип медиа, тогда как раньше я этого не делал.
До:

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

После:

LinkedResource(HttpContext.Current.Server.MapPath("/images/imgname.png"), "image/png"); 
Смежные вопросы