Office365 使用OutlookServicesClient编写高效查询

Office365 使用OutlookServicesClient编写高效查询,office365,office365api,outlook-restapi,microsoft-graph-api,office365-restapi,Office365,Office365api,Outlook Restapi,Microsoft Graph Api,Office365 Restapi,我正在使用,我的目标是获得用户发送的电子邮件总数1。并收到2份。今天 为此,我首先在中创建并尝试运行一些查询: https://outlook.office.com/api/v2.0/me/mailfolders/sentitems/messages?$filter=sentdatetime%20ge%202015-12-10T08:00:00.000Z&$select=Subject、CreatedDateTime、ToRecipients https://outlook.office.com

我正在使用,我的目标是获得用户发送的电子邮件总数1。并收到2份。今天

为此,我首先在中创建并尝试运行一些查询:

https://outlook.office.com/api/v2.0/me/mailfolders/sentitems/messages?$filter=sentdatetime%20ge%202015-12-10T08:00:00.000Z&$select=Subject、CreatedDateTime、ToRecipients https://outlook.office.com/api/v2.0/me/messages?$count=true&$filter=receiveddatetime%20ge%202015-12-09T10:00:00.000Z&$select=Subject、CreatedDateTime、ToRecipients 现在,我正在努力用OutlookServicesClient API编写这些查询。我没有找到太多的例子,它们超出了非常简单的查询。。。到目前为止,我所拥有的:

var mailResults=await client.Me.MailFolders.Wheref=>f.DisplayName==Sent Items.ExecuteAsync;这还不只是返回消息并过滤当前日期的消息

var mailResults=await client.Me.Messages.Wherem=>m.ReceivedDateTime.Value==date.UtcDateTime.ExecuteAsync;没有返回任何结果,即使我收到许多电子邮件。此外,我想排除我在“群集”、“已删除邮件”和“垃圾邮件”文件夹中收到的电子邮件

一般来说,我不确定用英文文件夹名过滤是否是个好主意,因为我需要更改其他语言的代码。特殊Outlook文件夹是否有特殊ID,如已发送邮件、垃圾邮件、群集等

此外,为了解决我的两个请求,我可以自己获取所有电子邮件并处理过滤,但这并不高效,而且API已经支持过滤,正如在原始请求中可以看到的那样,我只是不确定如何使用编写它们。

通常,OutlookServicesClient使用LINQ构建查询,因此,您需要使用Where方法来构建$filter查询参数。例如,如果您想获得今天收到的所有邮件,您可以执行以下操作:

DateTimeOffset startOfDay = DateTimeOffset.Now.Date.ToUniversalTime();

client.Me.Messages.Where(m => m.ReceivedDateTime >= startOfDay).ExecuteAsync();
关于你的问题:

不要按文件夹的名称进行筛选。该API具有常量文件夹 收件箱、已删除邮件、已发送邮件和草稿的ID。所以要得到 “已发送邮件”文件夹,您可以执行以下操作:

client.Me.MailFolders.GetById("SentItems")
您的查询,其中m=>m.ReceivedDateTime.Value== date.UtcDateTime不会返回值,因为您正在测试datetime值是否等于常数,这几乎永远不会返回结果。比较会下降到秒级,因此,除非您在日期变量中的日期和时间接收到消息,否则不会得到匹配项。 我写了一些我认为符合你意图的问题:

DateTimeOffset startOfDay = DateTimeOffset.Now.Date.ToUniversalTime();

var receivedMessages = await client.Me.Messages
  // $orderby=ReceivedDateTime desc
  .OrderByDescending(m => m.ReceivedDateTime)
  // $filter=ReceivedDateTime ge 2015-12-11T05:00:00Z
  .Where(m => m.ReceivedDateTime >= startOfDay)
  // $top=10
  .Take(10)
  // $select=Subject,ReceivedDateTime,From
  .Select(m => new { m.Subject, m.ReceivedDateTime, m.From })
  .ExecuteAsync();

string resultMessage = "";
foreach (var message in receivedMessages.CurrentPage)
{
  resultMessage += "Received: " + message.ReceivedDateTime.ToString() + " from " + message.From.EmailAddress.Address
                   + ": " + message.Subject + "\n";
}

MessageBox.Show(resultMessage, "Received messages");

var sentMessages = await client.Me.MailFolders.GetById("SentItems").Messages
  // $orderby=SentDateTime desc
  .OrderByDescending(m => m.SentDateTime)
  // $filter=SentDateTime ge 2015-12-11T05:00:00Z
  .Where(m => m.SentDateTime >= startOfDay)
  // $top=10
  .Take(10)
  // $select=Subject,ReceivedDateTime,From
  .Select(m => new { m.Subject, m.SentDateTime, m.ToRecipients })
  .ExecuteAsync();

resultMessage = "";
foreach (var message in sentMessages.CurrentPage)
{
  resultMessage += "Sent: " + message.SentDateTime.ToString() + " to " + message.ToRecipients.Count
                 + " recipients: " + message.Subject + "\n";
}

MessageBox.Show(resultMessage, "Sent messages");

太棒了,非常感谢你,杰森!我不知道GetById的事。。方法和日期对我来说是个愚蠢的错误。是否也可以只对收件箱中的邮件进行计数?而且,如果我想得到每天发送的所有邮件的数量,我可以将Take方法更改为10000或其他。有没有更有效/更快的方法来实现这一点?我还注意到每页的最大值可能是500?再次感谢!我不确定您是否可以在.NET库中进行筛选计数。在client.Me.Messages之外有一个CountAsync方法,但一旦开始添加Where或Select之类的内容,它就不适用了。我会和开发人员核实一下,看看我是否遗漏了一些明显的东西。我也有同样的发现。谢谢你的检查!没问题。我刚刚检查了一下,现在的图书馆无法做到这一点。因此,您可能希望实现分页,并这样做以确保获得所有结果。感谢您的检查!我会的。你知道这是否在路线图上吗?500是我用Take500在一页上能得到的最高数量的项目吗?或者你会建议我使用默认的10吗?