Leggere le email da Gmail in C #

Sto cercando di leggere le email da Gmail. Ho provato ogni progetto API / open source che riesco a trovare e non riesco a far funzionare nessuno di loro.

Qualcuno ha un esempio di codice funzionante che mi permetterà di autenticare e scaricare le email da un account Gmail?

Versione operativa finale pubblicata qui sotto: https://stackoverflow.com/a/19570553/550198

Utilizzando la libreria da: https://github.com/pmengal/MailSystem.NET

Ecco il mio esempio di codice completo:

Email Repository

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 GetAllMails(string mailBox) { return GetMails(mailBox, "ALL").Cast(); } public IEnumerable GetUnreadMails(string mailBox) { return GetMails(mailBox, "UNSEEN").Cast(); } 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("

{0}: {1}

{2}

", email.From, email.Subject, email.BodyHtml.Text); if (email.Attachments.Count > 0) { foreach (MimePart attachment in email.Attachments) { Console.WriteLine("

Attachment: {0} {1}

", attachment.ContentName, attachment.ContentType.MimeType); } } } }

Un altro esempio, questa volta 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 GetUnreadMails() { var messages = new List(); 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 GetAllMails() { var messages = new List(); 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()); } 

Non hai bisogno di altre librerie di terze parti . Puoi leggere i dati dell’API forniti da Gmail qui: https://mail.google.com/mail/feed/atom

La risposta in formato XML può essere gestita dal seguente codice:

 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( @"", @""); //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"); } 

Hai provato POP3 Email Client con supporto MIME completo ?

Se non lo fai è un ottimo esempio per te. Come alternativa;

OpenPop.NET

Libreria di classi .NET in C # per comunicare con i server POP3. Facile da usare ma potente. Include un parser MIME robusto supportato da diverse centinaia di casi di test. Per maggiori informazioni, visita la homepage del nostro progetto.

Lumisoft

Puoi anche provare client IMAP Mail.dll .

Supporta tutte le estensioni del protocollo IMAP di Gmail :

  • ID discussione,
  • ID messaggio,
  • etichette,
  • Nomi delle cartelle localizzati,
  • Sintassi di ricerca di Google
  • Autenticazione OAuth.

Si noti che Mail.dll è un prodotto commerciale, che ho sviluppato.