A. *_*ank 5 c# microsoft-graph-api
我编写了一个程序,它成功地使用 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);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经进行了一些搜索,并且正在查找使用 REST 来获取与 关联的数据的文档ItemAttachment,但我没有使用 REST,至少没有直接使用。这是一个 Windows 命令行应用程序,我使用 NuGet 下载了Microsoft.Graph和Microsoft.Graph.Core软件包。这些是我在代码中其他任何地方使用的库,用于验证和访问 Office 365 数据。
因此,我想知道是否有人对如何使用这些库访问和下载 ItemAttachment 对象有任何见解。谷歌搜索有关 Graph API 的信息几乎总是与 REST 有关。我找到了一些使用这些库的示例代码,但没有一个涉及 ItemAttachments。
可以像这样请求附加到消息的项目(文档):
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
Run Code Online (Sandbox Code Playgroud)
例子
演示如何获取附件并将其保存到文件(如果附件是文件)以及如何读取附加消息(如果附件是项目):
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)