net leer form enviar electronicos desde correos correo como asp c# .net gmail imap

form - Leer correos electrónicos de Gmail en C#



leer correo outlook desde c# (4)

Estoy tratando de leer correos electrónicos de Gmail. He intentado cada API / proyecto de código abierto que puedo encontrar, y no puedo hacer que ninguno de ellos funcione.

¿Alguien tiene una muestra de código de trabajo que me permita autenticar y descargar correos electrónicos desde una cuenta de Gmail?

Versión de trabajo final publicada a continuación: https://stackoverflow.com/a/19570553/550198


¿Has probado el cliente de correo electrónico POP3 con soporte completo MIME ?

Si no lo haces, es un muy buen ejemplo para ti. Como una alternativa;

OpenPop.NET

Biblioteca de clases .NET en C # para comunicarse con servidores POP3. Fácil de usar pero potente. Incluye un robusto analizador MIME respaldado por varios cientos de casos de prueba. Para más información, visite nuestra página de inicio de proyecto.

Lumisoft


No necesitas bibliotecas de terceros adicionales. Puede leer los datos de la API que Gmail ha proporcionado aquí: https://mail.google.com/mail/feed/atom

La respuesta en formato XML puede ser manejada por el siguiente código:

try { System.Net.WebClient objClient = new System.Net.WebClient(); string response; string title; string summary; //Creating a new xml document XmlDocument doc = new XmlDocument(); //Logging in Gmail server to get data objClient.Credentials = new System.Net.NetworkCredential("Email", "Password"); //reading data and converting to string response = Encoding.UTF8.GetString( objClient.DownloadData(@"https://mail.google.com/mail/feed/atom")); response = response.Replace( @"<feed version=""0.3"" xmlns=""http://purl.org/atom/ns#"">", @"<feed>"); //loading into an XML so we can get information easily doc.LoadXml(response); //nr of emails nr = doc.SelectSingleNode(@"/feed/fullcount").InnerText; //Reading the title and the summary for every email foreach (XmlNode node in doc.SelectNodes(@"/feed/entry")) { title = node.SelectSingleNode("title").InnerText; summary = node.SelectSingleNode("summary").InnerText; } } catch (Exception exe) { MessageBox.Show("Check your network connection"); }


También puede probar el cliente IMAP Mail.dll .

Es compatible con todas las extensiones de protocolo IMAP de Gmail :

  • ID de hilo,
  • ID de mensaje,
  • Etiquetas,
  • Nombres de carpetas localizadas,
  • Sintaxis de búsqueda de Google
  • Autenticación OAuth.

Tenga en cuenta que Mail.dll es un producto comercial, que he desarrollado.


Uso de la biblioteca desde: https://github.com/pmengal/MailSystem.NET

Aquí está mi ejemplo de código completo:

Repositorio de correo electrónico

using System.Collections.Generic; using System.Linq; using ActiveUp.Net.Mail; namespace GmailReadImapEmail { public class MailRepository { private Imap4Client client; public MailRepository(string mailServer, int port, bool ssl, string login, string password) { if (ssl) Client.ConnectSsl(mailServer, port); else Client.Connect(mailServer, port); Client.Login(login, password); } public IEnumerable<Message> GetAllMails(string mailBox) { return GetMails(mailBox, "ALL").Cast<Message>(); } public IEnumerable<Message> GetUnreadMails(string mailBox) { return GetMails(mailBox, "UNSEEN").Cast<Message>(); } protected Imap4Client Client { get { return client ?? (client = new Imap4Client()); } } private MessageCollection GetMails(string mailBox, string searchPhrase) { Mailbox mails = Client.SelectMailbox(mailBox); MessageCollection messages = mails.SearchParse(searchPhrase); return messages; } } }

Uso

[TestMethod] public void ReadImap() { var mailRepository = new MailRepository( "imap.gmail.com", 993, true, "[email protected]", "yourPassword" ); var emailList = mailRepository.GetAllMails("inbox"); foreach (Message email in emailList) { Console.WriteLine("<p>{0}: {1}</p><p>{2}</p>", email.From, email.Subject, email.BodyHtml.Text); if (email.Attachments.Count > 0) { foreach (MimePart attachment in email.Attachments) { Console.WriteLine("<p>Attachment: {0} {1}</p>", attachment.ContentName, attachment.ContentType.MimeType); } } } }

Otro ejemplo, esta vez usando MailKit

public class MailRepository : IMailRepository { private readonly string mailServer, login, password; private readonly int port; private readonly bool ssl; public MailRepository(string mailServer, int port, bool ssl, string login, string password) { this.mailServer = mailServer; this.port = port; this.ssl = ssl; this.login = login; this.password = password; } public IEnumerable<string> GetUnreadMails() { var messages = new List<string>(); using (var client = new ImapClient()) { client.Connect(mailServer, port, ssl); // Note: since we don''t have an OAuth2 token, disable // the XOAUTH2 authentication mechanism. client.AuthenticationMechanisms.Remove("XOAUTH2"); client.Authenticate(login, password); // The Inbox folder is always available on all IMAP servers... var inbox = client.Inbox; inbox.Open(FolderAccess.ReadOnly); var results = inbox.Search(SearchOptions.All, SearchQuery.Not(SearchQuery.Seen)); foreach (var uniqueId in results.UniqueIds) { var message = inbox.GetMessage(uniqueId); messages.Add(message.HtmlBody); //Mark message as read //inbox.AddFlags(uniqueId, MessageFlags.Seen, true); } client.Disconnect(true); } return messages; } public IEnumerable<string> GetAllMails() { var messages = new List<string>(); using (var client = new ImapClient()) { client.Connect(mailServer, port, ssl); // Note: since we don''t have an OAuth2 token, disable // the XOAUTH2 authentication mechanism. client.AuthenticationMechanisms.Remove("XOAUTH2"); client.Authenticate(login, password); // The Inbox folder is always available on all IMAP servers... var inbox = client.Inbox; inbox.Open(FolderAccess.ReadOnly); var results = inbox.Search(SearchOptions.All, SearchQuery.NotSeen); foreach (var uniqueId in results.UniqueIds) { var message = inbox.GetMessage(uniqueId); messages.Add(message.HtmlBody); //Mark message as read //inbox.AddFlags(uniqueId, MessageFlags.Seen, true); } client.Disconnect(true); } return messages; } }

Uso

[Test] public void GetAllEmails() { var mailRepository = new MailRepository("imap.gmail.com", 993, true, "[email protected]", "YOURPASSWORDHERE"); var allEmails = mailRepository.GetAllMails(); foreach(var email in allEmails) { Console.WriteLine(email); } Assert.IsTrue(allEmails.ToList().Any()); }