使用OutlookServicesClient编写高效查询

时间:2015-12-10 22:02:27

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

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

Todo,我首先创建并尝试在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
  3. 现在,我正在努力用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(); 不会返回任何结果,即使我收到了很多电子邮件。此外,我还要排除我在文件夹中收到的电子邮件'群集'删除的项目'和'垃圾邮件'。

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

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

1 个答案:

答案 0 :(得分:3)

通常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变量的日期和时间收到完全的消息,否则您将无法获得匹配。
  3. 我写了一些我认为符合您意图的查询:

    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");