2017-05-24 11 views
0

MailMessage를 MIME 문자열로 변환하는 방법에 대한 몇 가지 StackOverflow 게시물을 읽었습니다. 지금까지는 작동하지 않습니다. .NET 4.5에 대한 모든 오류와 세부 사항을 살펴 보았습니다. 그러나 어떤 이유로 든 문자열이 비어 있고 스트림 길이가 항상 0입니다. 도움이 될만한 점이 있습니다. 기능에MailMessage to 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은 끝에서 포인터를 남겨 둠으로써 아무 것도 읽을 수 없도록합니다.