openpop c# email download email-attachments

c# - openpop - Descargar archivo adjunto de correo electrónico



email download (3)

Pruebe algo como esto

using(Pop3 pop3 = new Pop3()) { pop3.Connect("server"); pop3.UseBestLogin("user", "password"); foreach (string uid in pop3.GetAll()) { IMail email = new MailBuilder() .CreateFromEml(pop3.GetMessageByUID(uid)); Console.WriteLine(email.Subject); // save all attachments to disk email.Attachments.ForEach(mime => mime.Save(mime.SafeFileName)); } pop3.Close(); }

// aquí hay un enlace de referencia que puede usar también Cómo obtener adjuntos de correo electrónico

¿Cómo puedo navegar por el correo electrónico y descargar todos los archivos adjuntos?

public string Connect_Email () { string Res = ""; try { mailclient = new TcpClient("pop.orange.fr", Convert.ToInt16("110")); } catch ( SocketException ExTrhown ) { Res = "Unable to connect to server 1"; throw new Exception(ExTrhown.Message + "Unable to connect to server 1"); } ns = mailclient.GetStream(); sr = new StreamReader(ns); sw = new StreamWriter(ns); response = sr.ReadLine(); //Get opening POP3 banner sw.WriteLine("USER " + "[email protected]"); //Send username sw.Flush(); response = sr.ReadLine(); if ( response.Substring(0, 4) == "-ERR" ) { Res = "Unable to log into server 2"; } sw.WriteLine("PASS " + "xxxxx"); //Send password sw.Flush(); response = sr.ReadLine(); if ( response.Substring(0, 3) == "-ER" ) { Res = "Unable to log into server 3"; } return Res; } public void Get_Attacht () { string ClientName = ""; #region Chercher Attachment sw.WriteLine("STAT"); //Send stat command to get number of messages sw.Flush(); response = sr.ReadLine(); //find number of message string[] nummess = response.Split('' ''); totmessages = Convert.ToInt16(nummess[1]); //read emails for ( int i = 1; i <= totmessages; i++ ) { msg = null; sw.WriteLine("top " + i + " 0"); //read header of each message sw.Flush(); response = sr.ReadLine(); while ( true ) { response = sr.ReadLine(); if ( response == "." ) break; msg = msg + response + "/r/n"; } //read attachment attachment = null; if ( Regex.Match(msg, "multipart/mixed").Success ) { msg = null; sw.WriteLine("retr " + i.ToString()); //Retrieve entire message sw.Flush(); response = sr.ReadLine(); while ( true ) { response = sr.ReadLine(); if ( response == "." ) break; msg = msg + response + "/r/n"; } int End = msg.IndexOf(".csv"); string LeFile = msg.Substring(End - 9, 9); if ( Regex.Match(msg, LeFile + ".csv").Success ) { data = msg.Split(''/r''); startindex = 0; index = 0; lastindex = 0; x = null; ms = null; fs = null; while ( true ) { attachment = null; while ( !Regex.Match(data[index].Trim(), "filename").Success ) { index++; } if ( index == data.Length - 1 ) break; FileName_Email = data[index].Trim().Substring(42).Replace("/"", ""); //find start of attachment data index++; while ( data[index].Length != 1 ) { index++; } if ( index == data.Length - 1 ) break; startindex = index + 1; //find end of data index = startindex + 1; while ( ( !Regex.Match(data[index].Trim(), "--0").Success ) && ( data[index].Length != 1 ) && ( index < data.Length - 1 ) ) { index++; } if ( index == data.Length ) break; lastindex = index - 2; for ( int j = startindex; j <= lastindex; j++ ) { attachment = attachment + data[j]; } attachment = attachment + "/r/n"; if ( Regex.Match(FileName_Email.ToLower(), "csv").Success ) { byte[] filebytes = Convert.FromBase64String(attachment); FileStream LeFS = new FileStream(filePath + "//testDEC.csv", FileMode.Create, FileAccess.Write, FileShare.None); LeFS.Write(filebytes, 0, filebytes.Length); LeFS.Close(); break; } } } } } sw.WriteLine("quit"); //quit sw.Flush(); #endregion }

No funciona, ¿tienes otra idea simple?


Si intentas leer un correo electrónico a través de POP3, te recomendaría usar la biblioteca OpenPOP.NET en lugar de crear la tuya propia. Es bastante fácil de usar.


Gracias a todos por su contribución. Finalmente uso POP3:

public string Connect_Email() { string Res = ""; try { Pop3Client email = new Pop3Client("login", "password", "server"); email.OpenInbox(); while (email.NextEmail()) { if (email.IsMultipart) { IEnumerator enumerator = email.MultipartEnumerator; while (enumerator.MoveNext()) { Pop3Component multipart = (Pop3Component) enumerator.Current; if (multipart.IsBody) { //Console.WriteLine("Multipart body:" + multipart.Name); } else { //Console.WriteLine("Attachment name=" + multipart.Name); // ... etc byte[] filebytes = Convert.FromBase64String(multipart.Data); //Search FileName int Begin = multipart.ContentType.IndexOf("name="); string leFileNale = multipart.ContentType.Substring(Begin + 5, 12); FileStream LeFS = new FileStream(filePath + "//" + leFileNale, FileMode.Create, FileAccess.Write, FileShare.None); LeFS.Write(filebytes, 0, filebytes.Length); LeFS.Close(); } } } } email.CloseConnection(); } catch (Pop3LoginException) { Res = "Vous semblez avoir un problème de connexion!"; } return Res; }

Funciona bien, pero aún tengo que encontrar y descargar el adjunto yo mismo.

byte[] filebytes = Convert.FromBase64String(multipart.Data); //Search FileName int Begin = multipart.ContentType.IndexOf("name="); string leFileNale = multipart.ContentType.Substring(Begin + 5, 12); FileStream LeFS = new FileStream(filePath + "//" + leFileNale, FileMode.Create, FileAccess.Write, FileShare.None); LeFS.Write(filebytes, 0, filebytes.Length); LeFS.Close();