解决方法
使用库:
http://mailsystem.codeplex.com/
以下是我的完整代码示例:
电子邮件存储库
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; } } }
[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("<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); } } } }
另一个例子,这次使用MailKit
public class MailRepository : IMailRepository { private readonly string mailServer,login,password; private readonly int port; private readonly bool ssl; public MailRepository(string mailServer,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,SearchQuery.NotSeen); foreach (var uniqueId in results.UniqueIds) { var message = inBox.GetMessage(uniqueId); messages.Add(message.HtmlBody); //Mark message as read //inBox.AddFlags(uniqueId,true); } client.Disconnect(true); } return messages; } }
[Test] public void GetAllEmails() { var mailRepository = new MailRepository("imap.gmail.com","YOUREMAILHERE@gmail.com","YOURPASSWORDHERE"); var allEmails = mailRepository.GetAllMails(); foreach(var email in allEmails) { Console.WriteLine(email); } Assert.IsTrue(allEmails.ToList().Any()); }