使用 OutlookServicesClient 编写高效查询
Write efficient queries with the OutlookServicesClient
我正在使用 Office 365 Mail API,我的目标是获取用户 发送 的 电子邮件总数 ( 1.) 收到 (2.) 今天.
为此,我首先在 Office 365 API Playground:
中创建并尝试 运行 一些查询
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.Where(f => f.DisplayName == "Sent Items").ExecuteAsync();
这还 return 只是消息 并根据 当前日期[过滤它们=45=].
var mailResults = await client.Me.Messages.Where(m => m.ReceivedDateTime.Value == date.UtcDateTime).ExecuteAsync();
没有 return 任何结果 ,尽管我收到了很多电子邮件。此外,我想排除在文件夹 'Cluster'、'Deleted Items' 和 'Junk Email'.
中收到的电子邮件
一般来说,我不确定用英文文件夹名称过滤是否是个好主意,因为我需要更改其他语言的代码。特殊的 Outlook 文件夹是否有特殊的 ID,例如已发送邮件、垃圾邮件、群集等?
此外,为了解决我的两个请求,我可以只获取所有电子邮件并自己处理过滤,但这效率不高而且 API 已经支持过滤(可以在原始请求中看到) , 我只是不确定如何用 OutlookServicesClient 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")
- 您的查询
Where(m => m.ReceivedDateTime.Value ==
date.UtcDateTime)
不会 return 值,因为您正在测试日期时间值是否 等于 常量,这几乎是永远不会 return 结果。比较下降到秒级别,因此除非您在 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");
我正在使用 Office 365 Mail API,我的目标是获取用户 发送 的 电子邮件总数 ( 1.) 收到 (2.) 今天.
为此,我首先在 Office 365 API Playground:
中创建并尝试 运行 一些查询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.Where(f => f.DisplayName == "Sent Items").ExecuteAsync();
这还 return 只是消息 并根据 当前日期[过滤它们=45=].var mailResults = await client.Me.Messages.Where(m => m.ReceivedDateTime.Value == date.UtcDateTime).ExecuteAsync();
没有 return 任何结果 ,尽管我收到了很多电子邮件。此外,我想排除在文件夹 'Cluster'、'Deleted Items' 和 'Junk Email'. 中收到的电子邮件
一般来说,我不确定用英文文件夹名称过滤是否是个好主意,因为我需要更改其他语言的代码。特殊的 Outlook 文件夹是否有特殊的 ID,例如已发送邮件、垃圾邮件、群集等?
此外,为了解决我的两个请求,我可以只获取所有电子邮件并自己处理过滤,但这效率不高而且 API 已经支持过滤(可以在原始请求中看到) , 我只是不确定如何用 OutlookServicesClient 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")
- 您的查询
Where(m => m.ReceivedDateTime.Value == date.UtcDateTime)
不会 return 值,因为您正在测试日期时间值是否 等于 常量,这几乎是永远不会 return 结果。比较下降到秒级别,因此除非您在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");