【问题标题】:Write efficient queries with the OutlookServicesClient使用 OutlookServicesClient 编写高效查询
【发布时间】:2015-12-10 22:02:26
【问题描述】:

我正在使用Office 365 Mail API,我的目标是获取用户发送 (1.) 和接收 的电子邮件的总数 strong> (2.) 今天

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

  1. https://outlook.office.com/api/v2.0/me/mailfolders/sentitems/messages?$filter=sentdatetime%20ge%202015-12-10T08:00:00.000Z&$select=Subject,CreatedDateTime,ToRecipients
  2. 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 编写这些查询。我没有找到很多示例,这些示例超出了非常简单的查询......到目前为止我所拥有的:

  1. var mailResults = await client.Me.MailFolders.Where(f => f.DisplayName == "Sent Items").ExecuteAsync(); 这还没有返回只返回消息并针对当前日期过滤它们。

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

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

另外,为了解决我的两个请求,我可以自己获取所有电子邮件并处理过滤,但这效率不高,API 已经支持过滤(如原始请求中所示),我只是不确定如何使用OutlookServicesClient API 编写它们。

【问题讨论】:

    标签: office365 office365api outlook-restapi microsoft-graph-api office365-restapi


    【解决方案1】:

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

    DateTimeOffset startOfDay = DateTimeOffset.Now.Date.ToUniversalTime();
    
    client.Me.Messages.Where(m => m.ReceivedDateTime >= startOfDay).ExecuteAsync();
    

    关于你的问题:

    1. 不要按文件夹名称过滤。 API 有常量文件夹 收件箱、已删除邮件、已发送邮件和草稿的 ID。所以要得到 你会做的已发送邮件文件夹:

      client.Me.MailFolders.GetById("SentItems")
      
    2. 您的查询Where(m => m.ReceivedDateTime.Value == date.UtcDateTime) 不会返回值,因为您正在测试日期时间值是否等于 到一个常数,而这几乎永远不会返回结果。比较会下降到秒级别,因此除非您在 date 变量中的日期和时间准确收到了消息,否则您将找不到匹配项。

    我写了一些我认为符合您意图的查询:

    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 方法,但是一旦你开始添加 WhereSelect 或类似的东西,它就不再适用了。我会和开发人员核实一下,看看我是否遗漏了一些明显的东西。
    • 我也有同样的发现。感谢您的检查!
    • 没问题。我刚刚检查过,目前的库无法使用它。所以你会想要实现分页并这样做以确保你得到所有的结果。
    • 感谢您的检查!我会去做的。你知道这是否在路线图上吗? 500 是我在一页上可以获得的最高数量的项目吗(使用 Take(500)?或者你会建议我使用默认值(10)吗?
    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 2013-07-08
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多