MailKit
MailKit系列之---查询SearchQuery
对于邮件的唯一Id查询,由于MailKit提供了大量的方法,无法完全讲解完全,所以这里只选择几个来介绍。
MailKit通过方法folder.Search来查询邮件的唯一Id,参数是一个SearchQuery类型,SearchQuery提供:
一、DeliveredAfter(DateTime date)、DeliveredBefore(DateTime date)、DeliveredOn(DateTime date)方法,通过邮件发送时间来查询邮件列表。
二、BodyContains(string text)、BccContains(string text)、CcContains(string text)方法,通过包含字段来查询邮件列表。
三、And(SearchQuery expr)、Or(SearchQuery expr)、Not(SearchQuery expr)方法,组合条件语句来组合查询语法。
ImapClient client = new ImapClient(); string account = "admin"; string passWord = "123456"; client.Connect("imap.163.com", 993,true); client.Authenticate(account, passWord); var folder = client.GetFolder("INBOX"); folder.Open(MailKit.FolderAccess.ReadOnly); //组合查询语句 var uids = folder.Search(SearchQuery.DeliveredAfter(DateTime.Parse("2016-9-1")).And(SearchQuery.Flagged)); folser.Close();
状态更改和删除
当我们拉取邮件列表,并展示邮件后需要打开邮件,同时标识本邮件状态为已读状态,或者我们直接删除邮件。下面介绍基本的应用。
首先了解邮件的所有枚举状态:MailKit.MessageFlags包括:(None = 0,Seen = 1,Answered = 2,Flagged = 4,Deleted = 8,Draft = 16,Recent = 32,UserDefined = 64)。
要操作文件夹需做如下动作:
一、创建获取邮件客户端并连接到邮件服务器。
ImapClient client = new ImapClient(); client.Connect("mail.qq.com"); //带端口号和协议的连接方式 client.Connect("imap.126.com", 993, true);
二、验证登录信息,输入账号和密码登录。
1 string account = "admin"; 2 string passWord = "123456"; 3 client.Authenticate(account, passWord);
三、获取邮箱文件夹。默认的收件箱文件夹叫INBOX。
1 //获取所有的文件夹 2 List<IMailFolder> mailFolderList = client.GetFolders(client.PersonalNamespaces[0]).ToList(); 3 4 //只获取收件箱文件加 5 var folder = client.GetFolder("INBOX");
四、操作邮件状态或删除邮件。
//已读写的方式打开文件夹 folder.Open(FolderAccess.ReadWrite); //获取大于2016-9-1时间的所有邮件的唯一Id var uidss = folder.Search(SearchQuery.DeliveredAfter(DateTime.Parse("2016-9-1"))); //设置为已读状态 MessageFlags messageFlags = MessageFlags.Seen; //bool silent=false; //设置状态 mailFolder.SetFlags(uidss[0], mailFlags, silent); //或者删除邮件 mailFolder.RemoveFlags(uidss[0], mailFlags, silent); //主要针对Exchange 让删除指令执行 folder.Expunge(); //最后记得关闭文件夹 folder.Close();
获取邮件
MailKit是一个免费开源的邮箱类库,简单来说MailKit帮我们封装了有关邮箱的一些帮助类,提供方法让我们更容易使用邮箱的Smtp,Imap等邮箱协议。
现在的邮箱基本上都使用Imap协议从邮件服务器获取邮件到本地,原来的pop3协议已经很少使用了。这里只介绍Imap的方式。
从文件夹获取文件,获取文件允许两种方式:1、只获取邮件头;2、获取完整的邮件;
//打开文件夹并设置为读的方式 folder.Open(MailKit.FolderAccess.ReadOnly); //获取大于2016-9-1时间的所有邮件的唯一Id var uidss = folder.Search(SearchQuery.DeliveredAfter(DateTime.Parse("2016-9-1"))); //获取邮件头 folder.Fetch(uids, MessageSummaryItems.UniqueId | MessageSummaryItems.Full); //获取完整邮件 foreach (var item in uidss ) { MimeMessage message = folder.GetMessage(new UniqueId(item.Id)); }
五、不要忘记关闭打开的文件夹;
folder.close();
整合基本方法如下:
ImapClient client = new ImapClient(); string account = "admin"; string passWord = "123456"; client.Connect("imap.126.com", 993, true); client.Authenticate(account, passWord); var folder = client.GetFolder("INBOX"); folder.Open(MailKit.FolderAccess.ReadOnly); var uidss = folder.Search(SearchQuery.DeliveredAfter(DateTime.Parse("2016-9-1"))); var ss = folder.Fetch(uidss, MessageSummaryItems.UniqueId | MessageSummaryItems.Full); folser.close();