2008-11-14 3 views
4

System.Net.Mail.AlternateView에서 AlternateView를 검색 할 수 없습니다.AlternateView를 이메일로 가져 오기

POP3를 통해 이메일을 가져 오는 응용 프로그램이 있습니다. 전송을위한 대체보기를 만드는 방법을 알고 있지만 전자 메일을 볼 때 대체보기를 선택하는 방법은 무엇입니까? System.Net.MailMessage 객체로받은 전자 메일을 가지고 있으므로 본문, 인코딩, 제목 줄 등을 쉽게 꺼낼 수 있습니다. AlternateViews를 볼 수 있습니다. 즉, 개수가 2이지만 원하는 것을 볼 수 있습니다. 시체를 요청할 때 현재 반환되는 HTML이 아닌 다른 것을 추출합니다.

희망 사항은 약간의 의미를 가지며 누군가가 이에 대해 밝힐 수 있기를 바랍니다. 결국, 나는 HTML 대신에 일반 텍스트를 꺼내려고하고 있으며, 그것을 직접 파싱하지 않을 것이다.

답변

1

System.Net.Mail 네임 스페이스에서 사용할 수있는 클래스로 이메일을 즉시 구문 분석 할 수 없습니다. 당신은 당신 자신의 MIME 해석기를 만들거나 제 3 자 라이브러리를 대신 사용해야한다.

Peter Huber SG가 작성한 위대한 Codeproject 기사 인 'POP3 Email Client with full MIME Support (.NET 2.0)'은 MIME 처리를 구현하는 방법과 관련 RFC 사양 기사를 제공합니다.

Codeproject 문서를 자신의 파서 작성을위한 시작으로 사용하거나 SharpMimeTools과 같은 라이브러리를 평가할 수 있습니다.이 라이브러리는 MIME 전자 메일을 구문 분석하고 디코딩 할 수있는 오픈 소스 라이브러리입니다. 이 도움이

http://anmar.eu.org/projects/sharpmimetools/

희망!

6

동일한 문제가 있었지만 스트림에서 읽어야합니다. 다음은 예입니다 :

public string ExtractAlternateView() 
    { 
     var message = new System.Net.Mail.MailMessage(); 
     message.Body = "This is the TEXT version"; 

     //Add textBody as an AlternateView 
     message.AlternateViews.Add(
      System.Net.Mail.AlternateView.CreateAlternateViewFromString(
       "This is the HTML version", 
       new System.Net.Mime.ContentType("text/html") 
      ) 
     ); 

     var dataStream = message.AlternateViews[0].ContentStream; 
     byte[] byteBuffer = new byte[dataStream.Length]; 
     return System.Text.Encoding.ASCII.GetString(byteBuffer, 0, dataStream.Read(byteBuffer, 0, byteBuffer.Length)); 
    } 
9

Mightytighty가 옳은 길 아래로 당신을 선도하고 있지만 인코딩의 유형을 추정하지 않아야합니다.

var dataStream = view.ContentStream; 
dataStream.Position = 0; 
byte[] byteBuffer = new byte[dataStream.Length]; 
var encoding = Encoding.GetEncoding(view.ContentType.CharSet); 
string body = encoding.GetString(byteBuffer, 0, 
    dataStream.Read(byteBuffer, 0, byteBuffer.Length)); 
+1

'view.ContentType'에는 CharSet이 없습니까? – scw

+1

@scw 코드 스 니펫은 MailMessage를 처리하기위한 유틸리티 메소드에서 코드를 실행하여 직접 생성됩니다. .NET 4 및 4.5에서 작동합니다. 희망이 도움이됩니다. –

+1

제 경우에는 encoding하기 전에 dataStream.Position을 0으로 설정해야합니다 .GetString()이 호출되었습니다. – jk7

1

이 간단한 방법이있다 :이 트릭을 할해야 그것은 일반적으로 발생하는 바와 같이, 제 1 대안보기, 일반 텍스트 버전의 경우

public string GetPlainTextBodyFromMsg(MailMessage msg) 
{ 
    StreamReader plain_text_body_reader = new StreamReader(msg.AlternateViews[0].ContentStream); 
    return(plain_text_body_reader.ReadToEnd()); 
} 

이 작동합니다.