1

我正在使用Office 365 Mail API,我的目标是获取用户今天发送(1.) 和接收(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

4

1 回答 1

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)不会返回值,因为您正在测试 datetime 值是否等于一个常数,这几乎永远不会返回结果。比较下降到秒级别,因此除非您在变量中的日期和时间准确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");
于 2015-12-11T15:53:32.197 回答