Leer el correo electrónico usando Pop3 en C #

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

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

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 avanzados de autenticación si no desea enviar una contraseña de texto claro a través de la red (y no puede usar el canal de comunicación encriptado SSL). Ver RFC 1939: Protocolo de la oficina postal – Versión 3 y RFC 1734: Mandato POP3 AUTHentication para más detalles.

La parte más difícil viene 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 el analizador MIME rápido y sucio en unas pocas horas o días y manejará el 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 por los clientes de correo más populares y mejorar el analizador para corregir los errores y las interpretaciones erróneas de RFC generadas por ellos.
  • Asegurarse de que los mensajes que violen RFC para los encabezados y el contenido de los mensajes no bloqueará su analizador y que podrá leer cada valor legible o adivinable del correo electrónico destruido.
  • manejo correcto de problemas de internacionalización (por ejemplo, idiomas escritos de derecha a izquierda, encoding correcta para un idioma específico, etc.)
  • UNICODE
  • Archivos adjuntos y árbol de elementos de mensaje jerárquico como se ve en “Mime torture email sample”
  • S / MIME (correos electrónicos firmados y encriptados).
  • y así

La depuración de 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 estaba escribiendo algunas pruebas de unidad también 😉

De vuelta a la pregunta original.

El siguiente código tomado de nuestra página Tutorial POP3 y enlaces lo ayudará a:

// // 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(); 
  • HOWTO: descargue los correos electrónicos de una cuenta de GMail en C # (blogpost)
  • Rebex Mail para .NET (componente de cliente POP3 / IMAP para .NET)
  • Rebex Secure Mail para .NET (componente cliente POP3 / IMAP para .NET – SSL habilitado)

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 pertenecen a otros autores, pero puede ver cómo encaja todo en mi aplicación.

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

Vea el archivo POP3Main.cs, POP3Client.cs e insert_bug.aspx

También puede probar el 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); } 

Puede 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 estaba misteriosamente devolviendo nulo. Depuré esto y descubrí que era un error de índice de cadena; consulte el parche que presenté 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á casi inactivo … el último lanzamiento fue en 2004.

Por ahora, seguimos usando OpenPOP, pero echaré un vistazo a algunos de los otros proyectos que las personas han recomendado aquí.

HigLabo.Mail es fácil de usar. Aquí hay 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 desde https://github.com/higty/higlabo o Nuget [HigLabo]

llámame old fashion pero por qué usar una biblioteca de terceros para un protocolo simple. Implementé lectores POP3 en aplicaciones ASP.NET basadas en web con System.Net.Sockets.TCPClient y System.Net.Security.SslStream para el cifrado y la autenticación. En cuanto a los protocolos, una vez que se abre la comunicación con el servidor POP3, solo hay un puñado de comandos con los que debe lidiar. Es un protocolo muy fácil de trabajar.

Acabo de probar SMTPop y funcionó.

  1. Descargué esto .
  2. Se smtpop.dll referencia smtpop.dll 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("", 110, "", ""); // 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(); } } }