Pregunta

Parece que no puedo recuperar el AlternateView de System.Net.Mail.AlternateView.

Tengo una aplicación que está enviando correo electrónico a través de POP3. Entiendo cómo crear una vista alternativa para enviar, pero cómo se selecciona la vista alternativa cuando se mira el correo electrónico. Recibí el correo electrónico recibido como un objeto System.Net.MailMessage para poder extraer fácilmente el cuerpo, la codificación, la línea de asunto, etc. Puedo ver las AlternateViews, es decir, puedo ver que el recuento es 2 pero quiero para extraer algo distinto del HTML que se devuelve actualmente cuando solicito el cuerpo.

Espero que esto tenga sentido y que alguien pueda arrojar algo de luz sobre esto. Al final, estoy buscando extraer el texto sin formato, en lugar del HTML, y prefiero no analizarlo yo mismo.

¿Fue útil?

Solución

No es posible analizar inmediatamente un correo electrónico con las clases disponibles en el espacio de nombres System.Net.Mail; necesita crear su propio analizador MIME o utilizar una biblioteca de terceros en su lugar.

Este excelente artículo de Codeproject de Peter Huber SG, titulado 'Cliente de correo electrónico POP3 con MIME completo El soporte (.NET 2.0) ' le dará una idea de cómo se puede implementar el procesamiento MIME y los artículos de especificación RFC relacionados.

Puede usar el artículo de Codeproject como comienzo para escribir su propio analizador, o evaluar una biblioteca como SharpMimeTools , que es una biblioteca de código abierto para analizar y decodificar correos electrónicos MIME.

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

¡Espero que esto ayude!

Otros consejos

Mightytighty te está guiando por el camino correcto, pero no debes presumir el tipo de codificación. Esto debería hacer el truco:

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));

Estaba teniendo el mismo problema, pero solo necesita leerlo de la transmisión. Aquí hay un ejemplo:

    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));
    }

Hay una manera más simple:

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

Esto funciona si la primera vista alternativa es la versión de texto plano, como suele suceder.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top