2016-11-02 3 views
1

So habe ich zwei verschiedene Ansätze versucht, ein Inline-Bild unter Verwendung von C# zu erstellen:erstellen Inline-Bild, das richtig in iOS Mail-App zeigt

  1. eine AlternateView
  2. Verwendung Mit Hilfe eines inline Attachement

Option 2 ist schlimmer, da es auf keinem meiner Test-Clients inline angezeigt wird (Outlook 2010/2013, Samsung Android E-Mail-Client, IOS 10 E-Mail-Client).

Option 1 ist fast perfekt, alle Clients zeigen das Inline-Bild korrekt an, solange keine anderen Anhänge vorhanden sind. Wenn Sie jedoch einen Dateianhang zur E-Mail hinzufügen, erhalten Sie nur in der iOS-E-Mail-App einen seltsamen Nebeneffekt. Unter iOS zeigt der Client sowohl das eingebettete Bild als auch den Anhang als Anhang an (das eingebettete Bild wird als Symbol angezeigt).

Ich habe versucht, dies herauszufinden, indem Sie eine E-Mail in Outlook mit einem eingebetteten Bild und einem Anhang verfassen. Outlook erzeugt scheinbar zwei normale Anhänge (die rohen Nachrichtendaten aus Outlook- und dotNet-generierten E-Mails betrachten), wobei das Bild inline als Inhaltsdisposition markiert wird. Und das funktioniert bei allen meinen Testkunden. Außer bei Verwendung der .Net Mail-Nachricht api, um dies zu replizieren (Option 2), funktioniert es nicht. Ich verstehe nicht, was hier vor sich geht.

Edit 1

Was interessant ist, ist, dass, wenn eine Option mit 2, die E-Mail-Körper als Base64 codiert geliefert wird. Dies unterscheidet sich von der Vorgehensweise beim Outlook-Client. Dort ist der Text im Klartext und das Inline-Attachment-Bild ist das einzige, was in bas64 kodiert ist.

Edit 2 Einstellen der folgenden Eigenschaften, wenn sie wieder zu sein Klartext Option 2 kehrt der Körper mit:

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

Antwort

0

Also das bekommen ich beide Ansätze kombinieren arbeiten mussten. Unten ist, was für mich funktionierte, es zeigt das Signaturbild als beabsichtigtes (Inline/Embedded) Bild und den Anhang als Icon an (in iOS sowieso). Dies wird auch auf einem Samsung Android-Handy und im Outlook 2010/2013 korrekt angezeigt. Aus Gründen der Einfachheit werde ich nur das eingebettete Bild in dem Mail-Text als Beispiel umfasst:

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); 
} 

Ich weiß nicht genug über entweder E-Mail-Protokolle oder den iOS-E-Mail-App zu wissen, warum dies notwendig ist, Aber nach vielen, vielen, vielen verschiedenen Versuchen, die iOS-Mail-App richtig anzuzeigen, war diese Kombination die einzige, die funktionierte.

0

Ich hatte ein ähnliches Problem mit einem Arbeitsprojekt. Bilder, die mit System.Net.Mail LinkedResource in den Nachrichtentext eingebettet sind, würden in den meisten E-Mail-Clients gut aussehen, aber nicht mit iOS-E-Mails nach einem Versionsupgrade während Version 10. Die Bilder hätten null Byte und Anhänge mit der Größe null. Was ich getan habe, war, den Medientyp zu definieren, während ich es zuvor nicht getan hatte.
Vorher:

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

Nach:

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