我编写了一个程序,该程序成功使用Graph API来检查邮箱和检索消息。如果邮件包含标准附件(例如PDF,Word文档),则代码有效。我可以在调试中看到这些被认为是“ FileAttachment”类型。但是,如果邮件包含的附件是另一封电子邮件,或者.wav文件是语音邮件(这对我来说似乎很奇怪),则程序会阻塞,因为这些附件的类型为ItemAttachment
,并且转换失败。相关代码是这样的:
var msgTask = GraphClient.Me.MailFolders.Inbox.Messages.Request().Filter(filter).Expand("attachments").GetAsync();
IMailFolderMessagesCollectionPage messages = msgTask.Result;
foreach (Message msg in messages)
{
// ...
foreach (Attachment att in msg.Attachments)
{
FileAttachment attachment = (FileAttachment)att;
MsgFile.Attachments.Add(new System.IO.MemoryStream(attachment.ContentBytes), attachment.Name);
}
}
我已经做了一些搜索,正在寻找使用REST的文档以获取与ItemAttachment
关联的数据,但是我没有使用REST,至少不是直接使用。这是Windows命令行应用程序,我使用NuGet下载了Microsoft.Graph
和Microsoft.Graph.Core
软件包。这些是我在代码中的其他所有地方都用来验证和访问Office 365数据的库。
因此,我想知道是否有人对如何使用这些库访问和下载ItemAttachment对象有任何见解。谷歌搜索有关Graph API的信息几乎总是与REST有关。我已经找到了一些使用这些库的示例代码,但都没有涉及ItemAttachments。
答案 0 :(得分:0)
可以通过以下方式请求附加到邮件的项目(documentation):
var attachmentRequest = graphClient.Me.MailFolders.Inbox.Messages[message.Id]
.Attachments[attachment.Id].Request().Expand("microsoft.graph.itemattachment/item").GetAsync();
var itemAttachment = (ItemAttachment)attachmentRequest.Result;
var itemMessage = (Message) itemAttachment.Item; //get attached message
Console.WriteLine(itemMessage.Body); //print message body
示例
演示如何获取附件(如果附件是文件,则如何将其保存到文件中),以及如何在附件为项目时读取附件的消息:
var request = graphClient.Me.MailFolders.Inbox.Messages.Request().Expand("attachments").GetAsync();
var messages = request.Result;
foreach (var message in messages)
{
foreach(var attachment in message.Attachments)
{
if (attachment.ODataType == "#microsoft.graph.itemAttachment")
{
var attachmentRequest = graphClient.Me.MailFolders.Inbox.Messages[message.Id]
.Attachments[attachment.Id].Request().Expand("microsoft.graph.itemattachment/item").GetAsync();
var itemAttachment = (ItemAttachment)attachmentRequest.Result;
var itemMessage = (Message) itemAttachment.Item; //get attached message
//...
}
else
{
var fileAttachment = (FileAttachment)attachment;
System.IO.File.WriteAllBytes(System.IO.Path.Combine(downloadPath,fileAttachment.Name), fileAttachment.ContentBytes);
}
}
}