2016-03-01 32 views
1

我們目前正在通過Amazon SES在C#中發送相對簡單的電子郵件。幾乎所有客戶的電子郵件看起來都正確,但Outlook並未顯示電子郵件,而是將其顯示爲附件。帶有嵌入式圖像的電子郵件在Outlook 2010和2016中顯示爲「預覽文檔」

電子郵件的建築規範:

LinkedResource logoResource = null; 
//Attach Logo 
if (!string.IsNullOrEmpty(emailMessage.Logo)) 
{ 
    messageHtml = messageHtml.Replace("{{Logo}}", emailMessage.Logo); 
    var imageData = Convert.FromBase64String(emailMessage.Logo.Split(Convert.ToChar(","))[1]); 

    logoResource = new LinkedResource(new MemoryStream(imageData)) 
    { 
     ContentId = "logo", 
     ContentType = new ContentType("image/png"), 
     TransferEncoding = TransferEncoding.Base64 
    }; 
} 
var htmlView = AlternateView.CreateAlternateViewFromString(messageHtml, null, MediaTypeNames.Text.Html); 

htmlView.LinkedResources.Add(logoResource); 

var message = new MailMessage { 
    IsBodyHtml = false, 
    Subject = emailMessage.Subject, 
    Body = string.IsNullOrEmpty(emailMessage.MessageText) ? emailMessage.Message : emailMessage.MessageText, 
    From = new MailAddress(emailMessage.From) 
}; 

message.AlternateViews.Add(htmlView); 

模板:

<tr style="margin-bottom:15px;/*logostyle*/"> 
    <td width="600" class="mobile" style="font-family: arial; font-size: 12px; padding: 10px;" align="center"> 
    <img src="cid:logo" style="width: 350px" /> 
    </td> 
</tr> 

讓我知道是否有其他任何你感興趣的。

outlook

+0

hotmail.com和outlook喜歡將圖像的src從http更改爲https。也許它也會改變你的情況下的src。然後Outlook不知道在哪裏顯示圖像,因此它將其顯示爲附件 –

+0

這是一個內嵌圖像?所以我們沒有引用服務器。 – Nix

+0

CreateAlternateViewFromString也停止正常工作。我所要做的就是SES將消息轉換爲原始內存流並以此方式發送。您可以使用SES SendRawEmail調用。我可以發送一個代碼片段。 – JAZ

回答

1

我認爲Outlook沒有不同的觀點,這就是爲什麼它不爲它工作。

創建郵件消息對象後,發送郵件的小片段。

RawMessage rawMessage; 

using (MemoryStream memoryStream = ConvertMailMessageToMemoryStream(gMessage)) 
{ 
    rawMessage = new RawMessage(memoryStream); 
} 

SendRawEmailRequest request = new SendRawEmailRequest(); 

request.RawMessage = rawMessage; 
request.Destinations.Add(MessageToSend.ToRecipient.Trim().ToLower()); 
request.Source = MessageToSend.SenderEmail; 

var ses = new Amazon.SimpleEmail.AmazonSimpleEmailServiceClient(UserName, sMailPassword, Amazon.RegionEndpoint.USEast1); 

SendRawEmailResponse response = ses.SendRawEmail(request); 

這是來自Amazon Support forum的ConvertMailMessageToMemoryStream。

/// <summary> 
/// Converts the mail message to memory stream. https://goo.gl/TrCqBu 
/// </summary> 
/// <param name="message">The message.</param> 
/// <returns>MemoryStream.</returns> 
public static MemoryStream ConvertMailMessageToMemoryStream(MailMessage message) 
{ 
    Assembly assembly = typeof(SmtpClient).Assembly; 
    Type mailWriterType = assembly.GetType("System.Net.Mail.MailWriter"); 
    MemoryStream fileStream = new MemoryStream(); 
    ConstructorInfo mailWriterContructor = mailWriterType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(Stream) }, null); 
    object mailWriter = mailWriterContructor.Invoke(new object[] { fileStream }); 
    MethodInfo sendMethod = typeof(MailMessage).GetMethod("Send", BindingFlags.Instance | BindingFlags.NonPublic); 

    if (sendMethod.GetParameters().Length == 2) 
     sendMethod.Invoke(message, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true }, null); 
    else 
     sendMethod.Invoke(message, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true, true }, null); 

    MethodInfo closeMethod = mailWriter.GetType().GetMethod("Close", BindingFlags.Instance | BindingFlags.NonPublic); 
    closeMethod.Invoke(mailWriter, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { }, null); 
    return fileStream; 
} 
+0

剛試過這個,得到了同樣的結果... – Nix

相關問題