Reading emails from Gmail in C#

匿名 (未验证) 提交于 2019-12-03 01:33:01

问题:

I am trying to read emails from Gmail. I have tried every API / open source project I can find, and can not get any of them working.

Does anyone have a sample of working code that will allow me to authenticate and download emails from a Gmail account?

Final working version posted below: https://stackoverflow.com/a/19570553/550198

回答1:

Using the library from: https://github.com/pmengal/MailSystem.NET

Here is my complete code sample:

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;         }     } } 

Usage

[TestMethod] public void ReadImap() {     var mailRepository = new MailRepository(                             "imap.gmail.com",                             993,                             true,                             "yourEmailAddress@gmail.com",                             "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); } } } }

Another example, this time using 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;     } } 

Usage

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


回答2:

You don't need any extra 3rd Party Libraries. You can read the data from API that Gmail has provided here: https://mail.google.com/mail/feed/atom

The response in XML format can be handled by the code below:

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"); } 


回答3:

Have you tried POP3 Email Client with full MIME Support ?

If you don't it's a very good example for you. As an alternativ;

OpenPop.NET

.NET class library in C# for communicating with POP3 servers. Easy to use but yet powerful. Includes a robust MIME parser backed by several hundred test cases. For more information, visit our project homepage.

Lumisoft



回答4:

You can also try Mail.dll IMAP client.

It supports all Gmail IMAP protocol extensions:

  • Thread ID,
  • Message ID,
  • Labels,
  • Localized folder names,
  • Google search syntax
  • OAuth authentication.

Please note that Mail.dll is a commercial product, I've developed.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!