有没有办法在Microsoft Graph API中解密Outlook消息ID?

问题描述:

如果A将电子邮件发送给B,然后连接到每个人的Microsoft Graph API,则存在一个问题:“internetMessageId”在A“发送邮件”和B“收件箱”中是相同的,但是Outlook ID(' Id')是不同的。有没有办法在Microsoft Graph API中解密Outlook消息ID?

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

这背后有一个简单的问题:如果我为公司的所有员工邮箱(让我们说1000人)订阅webhooks,并且1人向“all company”组发送电子邮件。然后我的服务器将收到有关此电子邮件的1001 POST。由于通知参数中唯一的信息是Outlook消息标识,因此我无法检测到它全部是关于相同的消息。唯一的方法是对图API进行1001次调用以获取internetMessageId,然后在此基础上进行筛选。它看起来非常重,耗费资源。有没有办法避免这种情况?无论是从webhook端,从通知内容还是从Outlook Message Id解码?

谢谢。

不,Id是不透明的。它不基于互联网消息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('[email protected]9955f5ef6')/Messages('AAMkAGZjYmY1ZTIwLWI1M2UtNGNkYS05MGQyLTQyMmNhOWI4MmE1MgBGAAAAAACiItQsBUn9QIuhejMqYpj5BwBk23L_AKqTR5R9JLmwxOUMAAAAAAEMAABk23L_AKqTR5R9JLmwxOUMAAC1vTIkAAA=')", 
     "ResourceData": { 
     "@odata.type": "#Microsoft.OutlookServices.Message", 
     "@odata.id": "https://outlook.office.com/api/beta/Users('[email protected]9955f5ef6')/Messages('AAMkAGZjYmY1ZTIwLWI1M2UtNGNkYS05MGQyLTQyMmNhOWI4MmE1MgBGAAAAAACiItQsBUn9QIuhejMqYpj5BwBk23L_AKqTR5R9JLmwxOUMAAAAAAEMAABk23L_AKqTR5R9JLmwxOUMAAC1vTIkAAA=')", 
     "@odata.etag": "W/\"CQAAABYAAABk23L+AKqTR5R9JLmwxOUMAAC131Ep\"", 
     "Id": "AAMkAGZjYmY1ZTIwLWI1M2UtNGNkYS05MGQyLTQyMmNhOWI4MmE1MgBGAAAAAACiItQsBUn9QIuhejMqYpj5BwBk23L_AKqTR5R9JLmwxOUMAAAAAAEMAABk23L_AKqTR5R9JLmwxOUMAAC1vTIkAAA=", 
     "InternetMessageId": "<[email protected]od.outlook.com>", 
     "Subject": "Testing this" 
     } 
    } 
    ] 
} 
+0

贾森,我试过但订阅不被接受,导致400“坏资源”。查询参数似乎不被支持,但将不胜感激!感谢您的支持,并让我知道您是否有其他想法。 – Sybic2001

+0

啊,是的,我的错误。 Graph中的资源不支持'$ select'。但是,如果直接使用Outlook端点,则可以注册包含此类数据的“丰富通知”。我会编辑我的答案。 –

+0

对不起,打扰你Jason,但一切工作完美的图端点。如果我尝试调用https://outlook.office.com/api/ ...端点,则会收到带有无效标记的401。我不明白的是如何改变这种情况:我的应用在apps.dev.microsoft上注册,并且我有管理员同意让它访问所有邮箱。因此,我没有指定它是我将使用的图形或Outlook休息端点。为什么令牌对于Outlook休息终点无效? – Sybic2001