在 MailKit 中搜索电子邮件不是使用 SearchQuery 方法,而是使用简单的文本字符串条件

Posted

技术标签:

【中文标题】在 MailKit 中搜索电子邮件不是使用 SearchQuery 方法,而是使用简单的文本字符串条件【英文标题】:Search for emails in MailKit not with the SearchQuery method but with simple text string criterias 【发布时间】:2021-11-28 08:11:07 【问题描述】:

Mailkit.SearchQuery 提供了一个非常强大的搜索系统,用于查找具有各种参数的电子邮件。但我想进行一项研究,从一个简单的文本字符串中获取标准,让用户能够自己进行复杂的搜索。

所以我不想这样做:

var query = SearchQuery.DeliveredAfter(DateTime.Parse("2021-10-06"))
            .And(SearchQuery.FromContains("mailer-daemon@myprovider.it"));

但我想这样做:

string query = "SENTSINCE 2021-10-06 FROM mailer-daemon@myprovider.it";

问题在于收件箱是 ImailFolder 对象(它没有带有简单文本字符串参数重载的 Search 方法)而不是 ImapFolder 对象(它得到了它!)。 我该怎么办?

static void ReadMsgs(Options opts)
    
        using (var client = new ImapClient(new ProtocolLogger("imap.log")))
        
            client.Connect(opts.Host, opts.Port, opts.UseSSL);
            client.Authenticate(opts.UserName, opts.Password);

            var inbox = client.Inbox;
            inbox.Open(FolderAccess.ReadOnly);
            
            Console.WriteLine("Total messages: 0", inbox.Count);
            Console.WriteLine("Recent messages: 0", inbox.Recent);


            // let's try searching for some messages...
            Console.WriteLine("Search in progress...");

            // this is a functional query based on SearchQuery
            //var query = SearchQuery.DeliveredAfter(DateTime.Parse("2021-10-06"))
            //    .And(SearchQuery.FromContains("mailer-daemon@myprovider.it"));

            // this is the code I would like to integrate based on a IMAP UID SEARCH text string
            //string query = "SENTSINCE 2021-10-06 FROM mailer-daemon@myprovider.it";
            foreach (var uid in inbox.Search(query))
            
                var message = inbox.GetMessage(uid);
                Console.WriteLine("0|1|2|3|4", uid, message.Date, message.From, message.To,message.Subject);
            

            client.Disconnect(true);
        
    

【问题讨论】:

【参考方案1】:

您可以从IMailFolder 转换为ImapFolder

var inbox = (ImapFolder) client.Inbox;

ImapClient 返回的所有 IMailFolders 都是 ImapFolders。

【讨论】:

谢谢!有没有关于使用 ImapFolder.Search 方法的在线示例?如果我执行 SearchResults mailItems=inbox.Search("ALL") 它返回 0 个元素!我尝试了其他条件,但总是返回 0 个项目。 什么是 0? SearchResults.UniqueIds 列表?确保您没有检查 SearchResults.Count - 除非服务器使用 ESEARCH(扩展搜索结果)响应,否则并不总是设置。 你是对的!我犯了那个错误!该代码有效,并且电子邮件项目位于 UniqueIds 列表中。现在我可以使用 SearchResults.UniqueIds.Count 来获取找到的电子邮件的数量。谢谢!

以上是关于在 MailKit 中搜索电子邮件不是使用 SearchQuery 方法,而是使用简单的文本字符串条件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Mailkit 发送电子邮件

MailKit发送邮件

我可以使用 MailKit 通过电子邮件发送文件吗?

使用MailKit发送邮件

.Net Core 5 web api 使用 mimekit 和 mailkit 的电子邮件附件

使用 MailKit (C#) 转发电子邮件