有没有办法在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
来获取通知负载中的其他字段,并使用我们称之为“丰富通知”的功能。
您的订阅要求将类似于:
{
"@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"
}
}
]
}
贾森,我试过但订阅不被接受,导致400“坏资源”。查询参数似乎不被支持,但将不胜感激!感谢您的支持,并让我知道您是否有其他想法。 – Sybic2001
啊,是的,我的错误。 Graph中的资源不支持'$ select'。但是,如果直接使用Outlook端点,则可以注册包含此类数据的“丰富通知”。我会编辑我的答案。 –
对不起,打扰你Jason,但一切工作完美的图端点。如果我尝试调用https://outlook.office.com/api/ ...端点,则会收到带有无效标记的401。我不明白的是如何改变这种情况:我的应用在apps.dev.microsoft上注册,并且我有管理员同意让它访问所有邮箱。因此,我没有指定它是我将使用的图形或Outlook休息端点。为什么令牌对于Outlook休息终点无效? – Sybic2001