【问题标题】:Is there a way to decrypt Outlook Message ID in Microsoft Graph API?有没有办法在 Microsoft Graph API 中解密 Outlook 邮件 ID?
【发布时间】:2017-06-14 07:56:21
【问题描述】:

如果 A 向 B 发送电子邮件,然后您连接到每个人的 Microsoft Graph API,则存在一个问题:A“已发送电子邮件”和 B“收件箱”中的“internetMessageId”相同,但 Outlook Id ( 'Id') 不同。

--> 有没有办法在 Outlook Id 中解码/检测它是同一封电子邮件但从不同邮箱看到的事实?

这背后有一个简单的问题:如果我为一家公司的所有员工邮箱(假设 1000 人)订阅 webhook,并且有一个人向“所有公司”组发送电子邮件。然后我的服务器将收到有关此电子邮件的 1001 POST。由于通知参数中的唯一信息是 Outlook 邮件 ID,因此我无法检测到它们都是关于同一条邮件的。唯一的方法是对图形 API 进行 1001 次调用以获取 internetMessageId,然后在此基础上进行过滤。它似乎真的很重且消耗资源。有没有办法避免这种情况?无论是来自 webhook 端,来自通知内容,还是来自 Outlook Message Id 解码?

谢谢。

【问题讨论】:

    标签: email webhooks microsoft-graph-api outlook-restapi


    【解决方案1】:

    不,Id 是不透明的。它不是基于 Internet 消息 ID。

    Microsoft Graph API 不支持向通知负载添加字段,但 Outlook REST API 本身支持。如果您直接使用 Outlook 端点 (https://outlook.office.com/api/),则可以使用 $select 获取通知负载中的其他字段,使用我们称为“丰富通知”的功能。

    这里的文档:https://msdn.microsoft.com/en-us/office/office365/api/notify-rest-operations#subscribe-to-changes-in-my-mail-calendar-contacts-or-tasks

    您的订阅请求如下所示:

    {
      "@odata.type": "#Microsoft.OutlookServices.PushSubscription",
      "Resource": "https://outlook.office.com/api/beta/me/mailfolders/Inbox/messages?$select=Subject,InternetMessageId",
      "NotificationURL": "https://mywebapp.contoso.com/notifications",
      "ChangeType": "Created,Deleted,Updated",
      "ClientState": "Message unread"
    }
    

    然后通知将包含一个带有请求字段的ResourceData 对象。

    {
      "value": [
        {
          "@odata.type": "#Microsoft.OutlookServices.Notification",
          "Id": null,
          "SubscriptionId": "NjkyM0MwM0MtREJERi00MUY5LTlCMkQtQkRFOTREOTlEQ0EwX0ZDQkY1RTIwLUI1M0UtNENEQS05MEQyLTQyMkNBOUI4MkE1Mg==",
          "SubscriptionExpirationDateTime": "2017-06-29T20:57:26.3294822Z",
          "SequenceNumber": 3,
          "ChangeType": "Created",
          "Resource": "https://outlook.office.com/api/beta/Users('1b1a2064-54a3-4f6e-b187-c1388c69fc0c@c4dd2789-1144-4832-bfaa-87f9955f5ef6')/Messages('AAMkAGZjYmY1ZTIwLWI1M2UtNGNkYS05MGQyLTQyMmNhOWI4MmE1MgBGAAAAAACiItQsBUn9QIuhejMqYpj5BwBk23L_AKqTR5R9JLmwxOUMAAAAAAEMAABk23L_AKqTR5R9JLmwxOUMAAC1vTIkAAA=')",
          "ResourceData": {
            "@odata.type": "#Microsoft.OutlookServices.Message",
            "@odata.id": "https://outlook.office.com/api/beta/Users('1b1a2064-54a3-4f6e-b187-c1388c69fc0c@c4dd2789-1144-4832-bfaa-87f9955f5ef6')/Messages('AAMkAGZjYmY1ZTIwLWI1M2UtNGNkYS05MGQyLTQyMmNhOWI4MmE1MgBGAAAAAACiItQsBUn9QIuhejMqYpj5BwBk23L_AKqTR5R9JLmwxOUMAAAAAAEMAABk23L_AKqTR5R9JLmwxOUMAAC1vTIkAAA=')",
            "@odata.etag": "W/\"CQAAABYAAABk23L+AKqTR5R9JLmwxOUMAAC131Ep\"",
            "Id": "AAMkAGZjYmY1ZTIwLWI1M2UtNGNkYS05MGQyLTQyMmNhOWI4MmE1MgBGAAAAAACiItQsBUn9QIuhejMqYpj5BwBk23L_AKqTR5R9JLmwxOUMAAAAAAEMAABk23L_AKqTR5R9JLmwxOUMAAC1vTIkAAA=",
            "InternetMessageId": "<DM5PR20MB1417BF6C48A2C62E529021BF9EDD0@DM5PR20MB1417.namprd20.prod.outlook.com>",
            "Subject": "Testing this"
          }
        }
      ]
    }
    

    【讨论】:

    • Jason,我试过了,但后来订阅不被接受,导致 400 "Bad resource"。查询参数似乎不受支持,但将不胜感激!感谢您的支持,如果您有其他想法,请告诉我。
    • 啊,是的,我的错。 Graph 中的资源不支持 $select。但是,如果您直接使用 Outlook 端点,则可以注册包含此类数据的“丰富通知”。我将编辑我的答案。
    • 很抱歉打扰你 Jason,但一切都与图形端点完美配合。如果我尝试调用 outlook.office.com/api... 端点,我会得到一个带有无效令牌的 401。我不明白如何改变它:我的应用程序已在 apps.dev.microsoft 上注册,并且我已获得管理员同意它可以访问所有邮箱。因此,我在任何地方都没有指定它是我将使用的图形或 Outlook 休息端点。为什么令牌对 Outlook 休息端点无效?
    • 没问题。若要获取与 Outlook 终结点兼容的令牌,您需要完全限定身份验证请求中的范围。例如,Graph 的Mail.Read 变为https://outlook.office.com/Mail.Read。有关更多有用信息,请参阅 docs.microsoft.com/en-us/outlook/rest/compare-graph-outlook
    • 但是在哪里呢? 1) 在apps.dev.microsoft 中,我无法手动修改范围。在清单中?但是范围没有清楚地显示。 2)或者只是在请求令牌时?在那种情况下,我尝试了但没有成功。我向login.microsoftonline.com{tenant_id}/oauth2/v2.0/token 发送了一个 POST,正文中有 4 个元素:grant_type 设置为“client_credentials”、client_id、secret_id,范围设置为“outlook.office.com/Mail.Read”。它发回“范围属性的无效值”。
    猜你喜欢
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多