首页 > 解决方案 > 发送带有大附件的邮件?

问题描述

我希望使用图形 API 发送带有大附件(最大 20MB)的电子邮件。有什么方法可以发送带有大附件的电子邮件吗?

之前对 Graph 的尝试导致发现 4MB 的上传限制。我也曾考虑将文件上传到 OneDrive 并通过引用附加它,但我相信这会遇到相同的 4MB 限制。

此限制排除了 Microsoft Graph。

我听说旧版 Outlook REST API 能够处理大文件上传,但是,我今天找不到任何访问 Outlook REST API 的方法,看起来它已被弃用。此外,我从 Microsoft 阅读的所有文档都很快鼓励您转而使用新的 Graph API。

查看 Azure 门户,似乎无法让我的应用程序通过 Outlook API 的身份验证,这在任何地方都不是一个选项。

作为参考,这里是我一直在使用 Graph API 的相关片段。

$mailBody = ...
'attachments' => [
    [
        '@odata.type' => '#microsoft.graph.fileAttachment',
        'Name' => 'file.docx',
        'ContentBytes' => $localFile
    ]
 ]
     ...

$response = $this->getGraph()->createRequest("POST", "/users/{primary-user}/sendMail")
                ->attachBody($mailBody)
                ->execute();

标签: phpmicrosoft-graph-api

解决方案


您可以使用上传会话将大于 4MB 的文件上传到 OneDrive 。上传会话允许您以块的形式发送文件,而不是一次发送整个文件。上传整个文件后,会话关闭,文件在 Drive 上可用。

将文件上传到 OneDrive 后,您可以将其作为referenceAttachment.

您还需要使用不同的Create MessageUpdate MessageSend Message方法而不是简化的sendMail. 因此,您的工作流程将如下所示:

  1. 创建消息( POST /users/{id}/messages):
  2. 添加附件( POST /users/{id}/messages/{id}/attachments)
  3. 发送消息( POST /users/{id}/messages/{id}/send)

人们普遍认为 Outlook REST API 是与 Microsoft Graph 完全不同的 API。虽然 Outlook REST API 的某些功能还没有在 Graph 上公开,但它们在幕后是相同的 API。

Microsoft Graph 实际上是一个 API 聚合器,而不是 API 本身(无用的琐事:Graph 通常由首字母缩写词 AGS 来表示“聚合器服务”)。对于基本调用,Graph 只需将调用路由到底层 API 并以规范化的 OData 格式重写响应。Graph 有趣的地方在于更复杂的调用,它可以做一些事情,比如将调用路由到多个底层 API,然后将结果合并在一起。

如果您对它在做什么感到好奇,您可以添加?whatif到您的调用中,Graph 也将返回它正在路由的底层工作负载,而不是实际结果(即https://graph.microsoft.com/v1.0/me?whatif)。


推荐阅读