Pregunta

Estoy buscando un método para leer correos electrónicos usando Pop3 en C# 2.0.Actualmente, estoy usando el código que se encuentra en Proyecto de código.Sin embargo, esta solución no es ideal.El mayor problema es que no admite correos electrónicos escritos en Unicode.

¿Fue útil?

Solución

He utilizado con éxito OpenPop.NET para acceder a correos electrónicos a través de POP3.

Otros consejos

descargar el correo electrónico a través del protocolo POP3 es la parte fácil de la tarea.El protocolo es bastante simple y la única parte difícil podrían ser los métodos de autenticación avanzados si no desea enviar una contraseña de texto claro a través de la red (y no puede utilizar el canal de comunicación cifrado SSL).Ver RFC 1939:Protocolo de oficina de correos - Versión 3 y RFC 1734:Comando de autenticación POP3 para detalles.

La parte difícil llega cuando tienes que analizar el correo electrónico recibido, lo que significa analizar el formato MIME en la mayoría de los casos.Puede escribir un analizador MIME rápido y sucio en unas pocas horas o días y manejará más del 95% de todos los mensajes entrantes.Mejorar el analizador para que pueda analizar casi cualquier correo electrónico significa:

  • obtener muestras de correo electrónico enviadas desde los clientes de correo más populares y mejorar el analizador para corregir errores y malas interpretaciones de RFC generadas por ellos.
  • Asegurarse de que los mensajes que violan el RFC para los encabezados y el contenido de los mensajes no bloquearán su analizador y que podrá leer todos los valores legibles o adivinables del correo electrónico dañado.
  • Manejo correcto de cuestiones de internacionalización (p. ej.idiomas escritos de derecha a izquierda, codificación correcta para un idioma específico, etc.)
  • UNICODIO
  • Archivos adjuntos y árbol jerárquico de elementos de mensajes como se ve en "Muestra de correo electrónico de tortura de mimo"
  • S/MIME (correos electrónicos firmados y cifrados).
  • etcétera

Depurar un analizador MIME robusto lleva meses de trabajo.Lo sé, porque estaba viendo a mi amigo escribir uno de esos analizadores para el componente que se menciona a continuación y también estaba escribiendo algunas pruebas unitarias para él ;-)

De vuelta a la pregunta original.

Siguiente código tomado de nuestra página de tutorial POP3 y los enlaces te ayudarán:

// 
// create client, connect and log in 
Pop3 client = new Pop3();
client.Connect("pop3.example.org");
client.Login("username", "password");

// get message list 
Pop3MessageCollection list = client.GetMessageList();

if (list.Count == 0)
{
    Console.WriteLine("There are no messages in the mailbox.");
}
else 
{
    // download the first message 
    MailMessage message = client.GetMailMessage(list[0].SequenceNumber);
    ...
}

client.Disconnect();

Mi aplicación de código abierto BugTracker.NET Incluye un cliente POP3 que puede analizar MIME.Tanto el código POP3 como el código MIME son de otros autores, pero puedes ver cómo encaja todo en mi aplicación.

Para el análisis MIME, utilizo http://anmar.eu.org/projects/sharpmimetools/.

Consulte los archivos POP3Main.cs, POP3Client.cs e insert_bug.aspx.

También puedes probar Componente de correo Mail.dll, tiene soporte SSL, Unicode y soporte de correo electrónico multinacional:

using(Pop3 pop3 = new Pop3())
{
    pop3.Connect("mail.host.com");           // Connect to server and login
    pop3.Login("user", "password");

    foreach(string uid in pop3.GetAll())
    {
        IMail email = new MailBuilder()
            .CreateFromEml(pop3.GetMessageByUID(uid));
          Console.WriteLine( email.Subject );
    }
    pop3.Close(false);      
}

Puedes descargarlo aquí en https://www.limilabs.com/mail

Tenga en cuenta que este es un producto comercial que he creado.

No recomendaría OpenPOP.Acabo de pasar unas horas depurando un problema: POPClient.GetMessage() de OpenPOP misteriosamente devolvía un valor nulo.Depuré esto y descubrí que era un error de índice de cadena; consulte el parche que envié aquí: http://sourceforge.net/tracker/?func=detail&aid=2833334&group_id=92166&atid=599778.Fue difícil encontrar la causa ya que hay bloques catch{} vacíos que tragan excepciones.

Además, el proyecto está mayoritariamente inactivo...el último lanzamiento fue en 2004.

Por ahora todavía usamos OpenPOP, pero echaré un vistazo a algunos de los otros proyectos que la gente ha recomendado aquí.

HigLabo.Mail es fácil de usar.A continuación se muestra un uso de muestra:

using (Pop3Client cl = new Pop3Client()) 
{ 
    cl.UserName = "MyUserName"; 
    cl.Password = "MyPassword"; 
    cl.ServerName = "MyServer"; 
    cl.AuthenticateMode = Pop3AuthenticateMode.Pop; 
    cl.Ssl = false; 
    cl.Authenticate(); 
    ///Get first mail of my mailbox 
    Pop3Message mg = cl.GetMessage(1); 
    String MyText = mg.BodyText; 
    ///If the message have one attachment 
    Pop3Content ct = mg.Contents[0];         
    ///you can save it to local disk 
    ct.DecodeData("your file path"); 
} 

puedes obtenerlo de https://github.com/higty/higlabo o Nuget [HigLabo]

Llámame anticuado, pero ¿por qué utilizar una biblioteca de terceros para un protocolo simple?Implementé lectores POP3 en una aplicación ASP.NET basada en web con System.Net.Sockets.TCPClient y System.Net.Security.SslStream para el cifrado y autenticación.En lo que respecta a los protocolos, una vez que abre la comunicación con el servidor POP3, sólo hay un puñado de comandos con los que tiene que lidiar.Es un protocolo muy fácil de trabajar.

Probé SMTPop y funcionó.

  1. yo descargué este.
  2. Agregado smtpop.dll referencia a mi proyecto C# .NET

Escribió el siguiente código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;    
using SmtPop;

namespace SMT_POP3 {

    class Program {
        static void Main(string[] args) {
            SmtPop.POP3Client pop = new SmtPop.POP3Client();
            pop.Open("<hostURL>", 110, "<username>", "<password>");

            // Get message list from POP server
            SmtPop.POPMessageId[] messages = pop.GetMailList();
            if (messages != null) {

                // Walk attachment list
                foreach(SmtPop.POPMessageId id in messages) {
                    SmtPop.POPReader reader= pop.GetMailReader(id);
                    SmtPop.MimeMessage msg = new SmtPop.MimeMessage();

                    // Read message
                    msg.Read(reader);
                    if (msg.AddressFrom != null) {
                        String from= msg.AddressFrom[0].Name;
                        Console.WriteLine("from: " + from);
                    }
                    if (msg.Subject != null) {
                        String subject = msg.Subject;
                        Console.WriteLine("subject: "+ subject);
                    }
                    if (msg.Body != null) {
                        String body = msg.Body;
                        Console.WriteLine("body: " + body);
                    }
                    if (msg.Attachments != null && false) {
                        // Do something with first attachment
                        SmtPop.MimeAttachment attach = msg.Attachments[0];

                        if (attach.Filename == "data") {
                           // Read data from attachment
                           Byte[] b = Convert.FromBase64String(attach.Body);
                           System.IO.MemoryStream mem = new System.IO.MemoryStream(b, false);

                           //BinaryFormatter f = new BinaryFormatter();
                           // DataClass data= (DataClass)f.Deserialize(mem); 
                           mem.Close();
                        }                     

                        // Delete message
                        // pop.Dele(id.Id);
                    }
               }
           }    
           pop.Quit();
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top