簡體   English   中英

C#MailMessage流-編碼問題

[英]C# MailMessage to stream - encoding issue

我使用Amazon SES SendRawEmail API,因此我需要MailMessage作為Memorystream。

我在這里在stackoverflow上找到了MailMessage to MemoryStream問題的幾個答案。

解決方案1:使用一種使用私有方法的方法會導致部分電子郵件的錯誤編碼: https : //stackoverflow.com/a/8826833

解決方案2:使用此解決方案時,沒有編碼問題,您可以將其發送到提取目錄,然后在以下位置重新讀取它: https : //stackoverflow.com/a/14350088

我非常不喜歡需要寫入臨時文件以使其正常工作的事實。 有誰知道純MemoryStream解決方案如何弄亂某些編碼。

用iam測試的郵件消息是這樣的:

var mailMessage = new MailMessage();
mailMessage.Subject = "HEADER WITH SPECIAL ÆØÅ";
mailMessage.Body = "TEST";

Attachment att = new Attachment(@"C:\AttachmentWithSpecial ÆØÅ.pdf");
mailMessage.Attachments.Add(att);
mailMessage.From = new MailAddress("test@test.com", "NameÆØÅ");
mailMessage.To.Add(new MailAddress("test@test.com", "NameÆØÅ"));

總結一下:

  • 如果我使用標准SMTP發送此消息,它看起來不錯。
  • 如果我使用SendRawEmail發送它,如果我使用解決方案2生成了內存流,則看起來不錯
  • 如果我使用SendRawEmail發送它,如果我使用解決方案1生成了內存流,則它存在編碼問題。

對於編碼問題,我的意思是“ø”顯示為

在此處輸入圖片說明

您是否嘗試為主題/正文和MailAddress明確指定編碼?

我猜想當.NET將郵件寫入文件夾時,它可以以某種方式定義正確的編碼(或者File Reader可以以某種方式找到正確的編碼來轉換數據)。 並且在內存中,所有內容均采用默認編碼,這對您不起作用。

不幸的是,MailMessage對象是錯誤的,並且界面較差。

好的是,.NET 4.5使用Send()中的allowUnicode標志部分修復了它(不幸的是,Send方法仍然是私有的)

下面是修改的“解決方案1”。 它對主題的編碼方式與“解決方案2”相同。 僅限.NET Framework 4.5。

private static MemoryStream ConvertMailMessageToMemoryStream(MailMessage message)
{
    Assembly systemAssembly = typeof(SmtpClient).Assembly;
    Type mailWriterType = systemAssembly.GetType("System.Net.Mail.MailWriter");
    const BindingFlags nonPublicInstance = BindingFlags.Instance | BindingFlags.NonPublic;
    ConstructorInfo mailWriterContructor = mailWriterType.GetConstructor(nonPublicInstance, null, new[]  typeof(Stream) }, null);

    MethodInfo sendMethod = typeof(MailMessage).GetMethod("Send", nonPublicInstance);
    MethodInfo closeMethod = mailWriterType.GetMethod("Close", nonPublicInstance);
    using (MemoryStream memoryStream = new MemoryStream())
    {
        object mailWriter = mailWriterContructor.Invoke(new object[] { memoryStream });
        //AssertHelper.IsTrue(sendMethod.GetParameters().Length > 2, ".NET framework must be 4.5 or higher in order to properly encode email subject.");
        sendMethod.Invoke(message, nonPublicInstance, null,
            new[] { mailWriter, true, false },
            null);
        closeMethod.Invoke(mailWriter, nonPublicInstance, null, new object[] { }, null);
        return memoryStream;
    }
}
message.BodyEncoding = message.SubjectEncoding = message.HeadersEncoding = Encoding.UTF8;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM