2014-05-08 43 views
5

Próbuję wysłać wiadomość e-mail z aplikacji C# SharePoint, która zawiera niestandardowe style i załączniki. Korzysta ze struktury szablonu i pomyślnie skonfigurowałem wiadomość e-mail, aby używać nowych stylów i załączników do obrazów wstawianych, i wyświetla się dobrze dla klientów programu Outlook. Jednak gdy próbuję wyświetlić wiadomość e-mail na urządzeniu z systemem iOS, widzę obrazy dwukrotnie; raz inline i jeszcze raz na końcu e-maila.Wysyłanie wiadomości e-mail z C# do wyświetlania w systemie iOS

Najbliższe rozwiązanie, jakie udało mi się znaleźć, zostało napisane dla Django i nie udało mi się sprowadzić tego rozwiązania do C#. I okazało się, że odpowiedź tutaj: Displaying inline images on iPhone, iPad

skonfigurować załączniki w ten sposób:

System.Net.Mail.Attachment attachment = new System.Net.Mail.Attachment(new MemoryStream(imageBytes.Key), MediaTypeNames.Image.Jpeg); 
attachment.Name = imageBytes.Value; 
attachment.ContentDisposition.Inline = true; 
attachment.ContentId = imageBytes.Value; 

attachments.Add(attachment); 

Jak mogę iść o wyświetlaniu tych zdjęć tylko raz? Muszę móc wyświetlać je w taki sposób, aby były wyświetlane tylko w linii. Nie jestem pewien, czy to oznacza, że ​​powinienem korzystać z alternatywnych poglądów, a jeśli tak, to jak z nich korzystać.

EDIT:

Oto Pozostała część kodu, który używam do generowania e-maili:

public override System.Net.Mail.MailMessage GenerateMessage() 
{ 
var keys = new Dictionary<string, string>(); 
var fileBytes = new Dictionary<byte[], string>(); 
var attachments = new List<System.Net.Mail.Attachment>(); 

var message = new MailMessage(); 

//get the attachment images as html in a dictionary object, byte[] and string 
fileBytes = GetEmailAttachments(); 

foreach (var imageBytes in fileBytes) 
{ 
    System.Net.Mail.Attachment attachment = new System.Net.Mail.Attachment(new MemoryStream(imageBytes.Key), MediaTypeNames.Image.Jpeg); 
    attachment.Name = imageBytes.Value; 
    attachment.ContentDisposition.Inline = true; 
    attachment.ContentId = imageBytes.Value; 

    attachments.Add(attachment); 
} 

foreach (var attachment in attachments) 
{ 
    message.Attachments.Add(attachment); 
    string fileName = attachment.Name.Split('.')[0]; 

    switch (fileName) 
    { 
     case "img-approve": 
      keys.Add(fileName, String.Format("<a href={0} target=_top><img src='cid:{1}' alt={2} title={3}></a>", 
       innerMsg, attachment.ContentId, fileName, "test")); 
      break; 
     case "img-reject": 
      keys.Add(fileName, String.Format("<a href={0} target=_top><img src='cid:{1}' alt={2} title={3}></a>", 
       innerMsg1, attachment.ContentId, fileName, "test")); 
      break; 
     case "img-buyer": 
      keys.Add(fileName, String.Format("<a href={0} target=_top><img src='cid:{1}' height=100 alt=picture></a>", imageURL, attachment.ContentId)); 
      break; 
     case "img-env": 
      keys.Add(fileName, String.Format("<img src='cid:{0}' alt={1} style=vertical-aign: middle>", attachment.ContentId, "test")); 
      break; 
     case "img-computer": 
      keys.Add(fileName, String.Format("<img src='cid:{0}' alt={1} style=vertical-aign: middle>", attachment.ContentId, "test")); 
      break; 
     case "logo": 
      keys.Add(fileName, String.Format("<img src='cid:{0}' alt={1} style=vertical-aign: middle>", attachment.ContentId, "test")); 
      break; 
     default: 
      keys.Add(fileName, String.Format("<img src='cid:{0}' alt={1}>", attachment.ContentId, fileName)); 
      break; 
    } 
} 

//get the additional keys specific to this email 
GenerateAdditionalKeys(keys, message); 

//build the email 
var body = ReplaceTemplateKeys(keys, _template); 

if(!string.IsNullOrEmpty(toEmail)) 
{ 
    message.To.Add(toEmail); 
} 
if (!string.IsNullOrEmpty(ccEmail)) 
{ 
    message.CC.Add(ccEmail); 
} 

message.IsBodyHtml = true; 
message.Body = body; 

return message; 
} 
+0

To może być pomocne, aby zapewnić resztę kod używany do zbudowania MailMessage. – mason

+0

Czy sprawdziłeś to rozwiązanie: http://stackoverflow.com/questions/18358534/send-inline-image-inemail? –

+0

Przyjrzałem się rozwiązaniu powiązanemu z @Adriano, ale używając tej metody, wydaje się, że dodaje pliki .bin do wiadomości e-mail w programie Outlook i nie rozwiązuje problemów formatowania w systemie iOS. – awh112

Odpowiedz

4

Tak, myślę, że dowiedział się, co było moim problemem. To, co zrobiłem, było połączeniem wielu innych rozwiązań. Zamiast załączać pliki jako Załączniki, utworzyłem alternatywny widok i załączałem pliki jako LinkedResources. Wyglądał bardzo podobnie do linku, który @Adriano zamieścił w powyższym komentarzu, ale musiałem się upewnić i zrobić, aby przestać próbować używać zarówno Załączników, jak i Źródeł LinkedResources. Gdy przestałem polegać na Załącznikach, aby dostarczyć ContentID użyty w znacznikach, wszystko działa zgodnie z oczekiwaniami. Kod mam do pracy jest poniżej (I opuścił wykomentowane zamienne do jasności, co zostało zmienione):

public override System.Net.Mail.MailMessage GenerateMessage() 
{ 
var keys = new Dictionary<string, string>(); 
var fileBytes = new Dictionary<byte[], string>(); 
var attachments = new List<System.Net.Mail.Attachment>(); 

var message = new MailMessage(); 

//get the attachment images as html in a dictionary object, byte[] and string 
fileBytes = GetEmailAttachments(); 

var resourceList = new List<LinkedResource>(); 

foreach (var imageBytes in fileBytes) 
{ 
System.Net.Mail.Attachment attachment = new System.Net.Mail.Attachment(new MemoryStream(imageBytes.Key), MediaTypeNames.Image.Jpeg); 
attachment.Name = imageBytes.Value; 
attachment.ContentDisposition.Inline = true; 
attachment.ContentId = imageBytes.Value; 

//attachments.Add(attachment); 

var stream = new MemoryStream(imageBytes.Key); 
var newResource = new LinkedResource(stream, "image/jpeg"); 
newResource.TransferEncoding = TransferEncoding.Base64; 
newResource.ContentId = imageBytes.Value; 
resourceList.Add(newResource); 
} 

foreach (var attachment in resourceList) 
{ 
//message.Attachments.Add(attachment); 
//string fileName = attachment.Name.Split('.')[0]; 

string fileName = attachment.ContentId.Split('.')[0]; 

switch (fileName) 
{ 
    case "img-approve": 
     keys.Add(fileName, String.Format("<a href={0} target=_top><img src='cid:{1}' alt={2} title={3}></a>", 
      innerMsg, attachment.ContentId, fileName, "test")); 
     break; 
    case "img-reject": 
     keys.Add(fileName, String.Format("<a href={0} target=_top><img src='cid:{1}' alt={2} title={3}></a>", 
      innerMsg1, attachment.ContentId, fileName, "test")); 
     break; 
    case "img-buyer": 
     keys.Add(fileName, String.Format("<a href={0} target=_top><img src='cid:{1}' height=100 alt=picture></a>", imageURL, attachment.ContentId)); 
     break; 
    case "img-env": 
     keys.Add(fileName, String.Format("<img src='cid:{0}' alt={1} style=vertical-aign: middle>", attachment.ContentId, "test")); 
     break; 
    case "img-computer": 
     keys.Add(fileName, String.Format("<img src='cid:{0}' alt={1} style=vertical-aign: middle>", attachment.ContentId, "test")); 
     break; 
    case "logo": 
     keys.Add(fileName, String.Format("<img src='cid:{0}' alt={1} style=vertical-aign: middle>", attachment.ContentId, "test")); 
     break; 
    default: 
     keys.Add(fileName, String.Format("<img src='cid:{0}' alt={1}>", attachment.ContentId, fileName)); 
     break; 
} 
} 

//get the additional keys specific to this email 
GenerateAdditionalKeys(keys, message); 

//build the email 
var body = ReplaceTemplateKeys(keys, _template); 

if(!string.IsNullOrEmpty(toEmail)) 
{ 
    message.To.Add(toEmail); 
} 
if (!string.IsNullOrEmpty(ccEmail)) 
{ 
    message.CC.Add(ccEmail); 
} 

message.IsBodyHtml = true; 
//message.Body = body; 

return message; 
}