8

Amazon SES SendRawEmail API を使用しているため、メモリストリームとして MailMessage が必要です。

Stackoverflow で、MailMessage から MemoryStream への問題に対するいくつかの回答を見つけました。

解決策 1:プライベート メソッドを使用するものを使用すると、電子メールの一部が間違ってエンコードされます: https://stackoverflow.com/a/8826833

解決策 2:ピックアップ ディレクトリに送信してから読み戻すこのソリューションを使用すると、エンコードの問題は発生しません: https://stackoverflow.com/a/14350088

これを正しく機能させるために一時ファイルに書き込む必要があるという事実は非常に嫌いです。純粋な MemoryStream ソリューションがエンコーディングの一部を台無しにする方法を知っている人はいますか?

メール メッセージ iam testing は次のとおりです。

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 を使用してメモリストリームを生成すると、エンコードの問題が発生します。

エンコーディングの問題により、「ø」が次のように表示されることを意味します

ここに画像の説明を入力

4

3 に答える 3

2

残念ながら、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;
    }
}
于 2014-11-24T17:53:53.357 に答える
1

Subject / Body および MailAddress のエンコーディングを明示的に指定しようとしましたか?

.NET がメールをフォルダーに書き込むときに、何らかの方法で適切なエンコーディングを定義できると思います (または、ファイル リーダーが適切なエンコーディングを見つけてデータを変換できる可能性があります)。また、メモリ内ではすべてがデフォルトのエンコーディングになっているため、うまくいきません。

于 2013-04-05T16:45:52.260 に答える
0
message.BodyEncoding = message.SubjectEncoding = message.HeadersEncoding = Encoding.UTF8;
于 2013-04-17T15:32:00.253 に答える