Получение AlternateView из электронной почты - PullRequest
6 голосов
/ 15 ноября 2008

Не получается получить AlternateView из System.Net.Mail.AlternateView.

У меня есть приложение, которое получает почту через POP3. Я понимаю, как создать альтернативное представление для отправки, но как выбрать альтернативное представление при просмотре электронного письма. Я получил полученное письмо в виде объекта System.Net.MailMessage, чтобы я мог легко извлечь тело, кодировку, строку темы и т. Д. Я могу видеть AlternateViews, то есть я вижу, что счетчик равен 2, но я извлечь что-то кроме HTML, который в настоящее время возвращается, когда я запрашиваю тело.

Надеюсь, что это имеет смысл и что кто-то может пролить свет на это. В конце концов, я хочу вытащить открытый текст вместо HTML и предпочел бы не разбирать его сам.

Ответы [ 4 ]

11 голосов
/ 18 июля 2011

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));
6 голосов
/ 25 сентября 2009

У меня была такая же проблема, но вам просто нужно прочитать ее из потока. Вот пример:

    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));
    }
3 голосов
/ 17 ноября 2013

Есть более простой способ:

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

Это работает, если первое альтернативное представление - это текстовая версия, как обычно.

1 голос
/ 17 ноября 2008

Не возможно сразу проанализировать электронную почту с классами, доступными в пространстве имен System.Net.Mail; Вам нужно либо создать собственный анализатор MIME, либо использовать стороннюю библиотеку.

Эта замечательная статья Codeproject Питера Хубера С.Г., озаглавленная 'Почтовый клиент POP3 с полной поддержкой MIME (.NET 2.0)' , даст вам представление о том, как можно реализовать обработку MIME, и о соответствующей RFC технические условия статей.

Вы можете использовать статью Codeproject для начала написания своего собственного анализатора или оценить библиотеку, такую ​​как SharpMimeTools , которая является библиотекой с открытым исходным кодом для анализа и декодирования сообщений MIME.

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

Надеюсь, это поможет!

...