2017-05-24 6 views
0

MailMessageをMIME文字列に変換する方法については、いくつかのStackOverflowの記事をたどってきました。これまでのところ、私はそれを働かせることができません。私はすべてのエラーと詳細については.NET 4.5で得ていますが、何らかの理由で私の文字列が空で、ストリームの長さが常に0になっています。関数へMailMessageからMIME Stringへ

コール:

MailMessage message = new MailMessage("[email protected]", "[email protected]", "Test", "Test"); 
Console.WriteLine(ConvertMailMessageToMemoryStream(message)); 

ファンクションコード:

private static string ConvertMailMessageToMemoryStream(MailMessage message) 
    { 
     BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic; 
     Assembly assembly = typeof(SmtpClient).Assembly; 
     Type mailWriterType = assembly.GetType("System.Net.Mail.MailWriter"); 
     MemoryStream stream = new MemoryStream(); 
     ConstructorInfo mailWriterConstructor = mailWriterType.GetConstructor(flags, null, new[] { typeof(Stream) }, null); 
     object mailWriter = mailWriterConstructor.Invoke(new object[] { stream }); 
     MethodInfo sendMethod = typeof(MailMessage).GetMethod("Send", flags); 
     sendMethod.Invoke(message, flags, null, new[] { mailWriter, true, true }, null); 
     var sr = new StreamReader(stream); 
     var str = sr.ReadToEnd(); 
     MethodInfo closeMethod = mailWriter.GetType().GetMethod("Close", flags); 
     closeMethod.Invoke(mailWriter, flags, null, new object[] { }, null); 
     return str; 
    } 
+0

なぜ実行時にMailWriterアセンブリをロードしようとしていますか? –

+0

私は研究からわかる限り、これは組み込みのMailMessageクラスから生のMIMEテキストを抽出する唯一の方法です。私の理解では、この仕組みはメールメッセージ内にプライベートメソッドがあり、それを生のフォーマットとしてストリームに保存できますが、プライベートでMicrosoftから公開されていないので、それを呼び出す唯一の方法は反映です。 – Kyle

+0

[MimeKit](http://www.mimekit.net/)を使用する方法もあります。ストリームに書き込むための簡単なメソッドがあります。 – Mats391

答えて

1

あなたはそれを読む前に最初にストリームを模索しなければなりません。 stream.Seek(0, SeekOrigin.Begin) sendMethodは、ポインタを最後に残すので、そこから何も読み取ることはできません。

関連する問題