メールのAlternateViewの取得
質問
System.Net.Mail.AlternateViewからAlternateViewを取得できないようです。
POP3経由でメールをプルするアプリケーションがあります。送信用の代替ビューを作成する方法は理解していますが、電子メールを見たときに代替ビューを選択する方法を理解しています。受信したメールをSystem.Net.MailMessageオブジェクトとして取得しているため、本文、エンコード、件名などを簡単に取り出すことができます。AlternateViewsを確認できます。つまり、カウントが2であるが、本文をリクエストしたときに現在返されているHTML以外の何かを抽出します。
これがある程度の意味を持ち、誰かがこれに何らかの光を当てることができることを願っています。最終的には、HTMLの代わりにプレーンテキストを引き出したいので、自分で解析したくないでしょう。
解決
System.Net.Mail名前空間で利用可能なクラスを持つ電子メールをすぐに解析することはできません。独自のMIMEパーサーを作成するか、代わりにサードパーティのライブラリを使用する必要があります。
'POP3 Email Client with full MIMEサポート(.NET 2.0) 'により、MIME処理の実装方法と関連するRFC仕様の記事を理解できます。
Codeprojectの記事は、独自のパーサーを記述するための開始点として使用したり、のようなライブラリを評価したりできます。 SharpMimeTools 。MIMEメールを解析およびデコードするためのオープンソースライブラリです。
http://anmar.eu.org/projects/sharpmimetools/
これがお役に立てば幸いです!
他のヒント
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));
同じ問題が発生していましたが、ストリームから読み取る必要があります。次に例を示します。
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));
}
もっと簡単な方法があります:
public string GetPlainTextBodyFromMsg(MailMessage msg)
{
StreamReader plain_text_body_reader = new StreamReader(msg.AlternateViews[0].ContentStream);
return(plain_text_body_reader.ReadToEnd());
}
最初の代替ビューがプレーンテキストバージョンである場合、これは通常行われるように機能します。