My application sends email using Microsoft Graph. We followed the documentation, this was working as expected for almost a year:
https://graph.microsoft.com/v1.0/users/me/microsoft.graph.sendmail
Run Code Online (Sandbox Code Playgroud)
Since 3/8/2019, the same code sendmail API in PROD started failing with the HTTP 400 - Bad Request:
{
"error": {
"code": "TargetIdShouldNotBeMeOrWhitespace",
"message": "Id is malformed.",
"innerError": {
"request-id": "0de5a4eb-dac4-4d98-a4b4-178e503a6657",
"date": "2019-03-19T17:16:20"
}
}
}
Run Code Online (Sandbox Code Playgroud)
As a part of the investigation, we found that the SendMail documentation has a different URL used in the examples than …
我们最近从本地交换迁移到 Microsoft 365,我想为所有用户打开 2FA(启用安全默认值)。但是,这会禁用我们一直用于从通讯组地址发送邮件的 SMTP 身份验证。(无法通过 EWS 实现,因为它没有物理邮箱)
据我所知,唯一的方法是设置 SMTP 中继或通过 Microsoft Graph 发送。
我尝试过使用 Microsoft Graph 路线,这是迄今为止我所得到的。
在 Azure Active Directory > 应用程序注册中创建应用程序
添加Mail.Send和User.Read.All(应用程序,未委派)API 权限并已授予管理员同意。
使用以下命令请求令牌
{ "grant_type": "authorization_code", "client_id": "AzureApi.ClientId", "client_secret": "AzureApi.ClientSecret", "code": "insert auth code", "redirect_uri": "insert redirect URL" }获取不记名令牌一旦我有了令牌,现在我执行发送一些邮件的请求
fromAddress当请求令牌的用户的电子邮件地址是时,这有效,但是当我尝试从不同的地址发送时,它会出现此错误{"error":{"code":"ErrorAccessDenied","message":"Access is denied. Check credentials and try again."}}SendAs我尝试发送的邮箱的令牌用户添加权限,但这没有任何区别。无论如何 - 我希望能够以任何用户身份发送,而无需向每个邮箱委派权限。很高兴有任何帮助。谢谢!!
我正在使用 Microsoft Graph 从邮箱中提取电子邮件数据。当我获取内容时,我发现嵌入的图像内容如下:
<img id="_x0000_i1029"
width="1366"
height="672"
data-outlook-trace="F:1|T:1"
src="cid:image005.png@01D4DE3D.90A3C410"
style="width:14.2291in; height:7.0in">
Run Code Online (Sandbox Code Playgroud)
当该属性hasAttachments为 true 时,我会查找匹配并替换内容的图像,效果很好。问题是我在消息上看到这样的嵌入图像标签,其中hasAttachments是错误的。
我在哪里可以获得图像数据 图表显示消息没有附件,但显然有嵌入图像?
请注意,图像在 Outlook 网页版 中呈现,带有如下标记:
<img data-imagetype="AttachmentByCid"
originalsrc="cid:image005.png@01D4DE3D.90A3C410"
data-custom="AAMkADY1YjgxM2Y4LTE5NTUtNDBjMy1iZDY0LWIzN..."
naturalheight="672"
naturalwidth="1366"
src="https://attachments.office.net/owa/mailboc@mydomain.onmicrosoft.com/service.svc/s/GetAttachmentThumbnail?id=AAMkADY1YjgxM2Y4LTE5NTUtNDBjMy1iZDY0LWIzN...&thumbnailType=2&owa=outlook.office365.com&scriptVer=2019031102.10&X-OWA-CANARY=kKWSUkiFW0WjlPXXXXXXXXX.&token=eyJhbGciOiJSU...&animation=true"
id="_x0000_i1029"
data-outlook-trace="F:1|T:1"
style="width: 1024.49pt; height: 504pt; cursor: pointer;"
crossorigin="use-credentials" >
Run Code Online (Sandbox Code Playgroud) 在搜索 Microsoft Graph API 文档时,我无法找到有关任何 API 的任何文档,这些文档允许我获取 Office 365 邮件用户的“发送方式”或“代表发送”设置。
我想在发送电子邮件之前获取这些内容,以便我的应用程序可以允许用户选择要发送的电子邮件。
任何人都可以了解此信息是否在任何 v1.0/beta 图形 API 背后,或者是否完全不可用。
以下是有关 Microsoft 如何通知用户如何设置发送别名的文档 https://learn.microsoft.com/en-us/office365/admin/add-users/give-mailbox-permissions-to-another-user? redirectSourcePath=%252farticle%252f从 Office-365-2B828C5F-41AB-4904-97B9-3B63D8129C4E&view=o365-worldwide#bkmk_sendemailanotheruser 中的另一个用户的邮箱发送电子邮件
当您从 Graph API 收到“UnknownError”时,有人知道该怎么做吗?或者问微软合适的网站?
谢谢
请求:https : //graph.microsoft.com/v1.0/users/[ USER_ID]/ messages?$select=id,receivedDateTime&$filter=receivedDateTime+ge+2016-09-13+and+receivedDateTime+lt+2019 -09-14&$orderby=receivedDateTime+asc&$skip=25651&$top=1
回复:
{
"error": {
"code": "UnknownError",
"message": "",
"innerError": {
"request-id": "1ea27a29-5491-44d2-824a-0aaee9280c40",
"date": "2019-09-13T19:48:30"
}
}
}
Run Code Online (Sandbox Code Playgroud) 我使用 GraphServiceClient 从 Outlook 获取消息。
var messages = await _graphServiceClient.Me.MailFolders[folderId].Messages.Request()
.Header("Prefer", "outlook.body-content-type=\"text\"")
.Filter($"createdDateTime gt {greaterDate} and createdDateTime lt {lessDate}")
.Top(int.MaxValue).GetAsync();
Run Code Online (Sandbox Code Playgroud)
请求最多获取 1000 个项目。
我想获取其他消息并遵循文档。
我的代码:
var pageIterator = PageIterator<Message>
.CreatePageIterator(
_graphServiceClient,
messages,
// Callback executed for each item in
// the collection
(m) =>
{
return true;
},
// Used to configure subsequent page
// requests
(req) =>
{
// Re-add the header to subsequent requests
req.Header("Prefer", "outlook.body-content-type=\"text\"");
return req;
});
await pageIterator.IterateAsync();
Run Code Online (Sandbox Code Playgroud)
但是当我调用我的代码时什么也没有发生。看起来像是pageIterator.IterateAsync();无限循环之后。
怎么了?
c# asp.net-core microsoft-graph-sdks microsoft-graph-mail microsoft-graph-api
我正在尝试使用 Postman 检索 Outlook 邮箱中最后收到的电子邮件。
为了实现这一目标,我已在应用程序门户中声明了我的应用程序。然后,我可以发出GET请求以从端点获取令牌:
https://login.microsoftonline.com/[tenantId]/oauth2/token
Run Code Online (Sandbox Code Playgroud)
接下来,我尝试使用收到的令牌来执行请求
https://graph.microsoft.com/v1.0/me/mailfolders/inbox/messages
Run Code Online (Sandbox Code Playgroud)
问题是 API 返回:
{
"code": "NoPermissionsInAccessToken",
"message": "The token contains no permissions, or permissions can not be understood.",
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序的权限中,我已授权与阅读电子邮件相关的所有操作。我错过了什么吗?
从本周开始gateway timeout,当我的邮件搜索找不到任何结果时,我突然从Graph中获取信息。
我正在使用这样的查询:
https://graph.microsoft.com/v1.0/users/shared@notreal.com/mailFolders/AllItems/messages?$search="participants:some.person@fake.com"&$select=from,subject,HasAttachments,Id,SentDateTime&$top=100
Run Code Online (Sandbox Code Playgroud)
这是一个图查询,它从shared@notreal.com发送者或接收者包括的Office 365邮箱中请求最多100封电子邮件some.person@fake.com。shared@notreal.com是与拨打电话的帐户共享的邮箱。
我的应用已通过oauth2身份验证代码流进行了身份验证,并已获得所有必要的权限。
This has been working for about a year. But starting a few days ago, this query only succeeds if results are found. When no results are found, the query takes 30 seconds, Graph returns UnknownError and the response is 504 with reasonphrase Gateway Timeout.
It seems as though something has changed in the Graph API - or perhaps in the Office 365 API, …
504, Gateway Timeout在过去一周左右的时间里,我们在从 MS Graph API 获取电子邮件时遇到了错误。在此之前的一个多月的运行中,同一应用程序没有遇到该错误,至少没有出现任何显着的频率。
我们正在使用 MS Graph API V1.0
我们的查询相当简单:
$top=100&$orderBy=lastModifiedDateTime desc&$filter=lastModifiedDateTime lt 2019-09-09T19:27:55Z and parentFolderId ne 'JunkEmail'
我们为拥有大量数据(> 100K 电子邮件)的用户设置超时,但偶尔也会为数据量较小(大约 18K 电子邮件)的用户设置超时。从系统工作时到现在我们看到很多超时,音量没有太大变化。
我们尝试过简化查询、减少我们请求的消息数量等,但这似乎只产生有限且间歇性的影响。
我的问题- 我们可以采取什么措施来消除/显着降低从 MS Graph API 获取 504、网关超时错误的可能性?
我怀疑,由于我们在没有文件夹过滤器的情况下请求消息,因此我们可能会给查询引擎带来压力。只是一种预感,如果有人真正了解 MS Graph API,我很想知道这是否可能。此外,任何有助于我们更好地了解幕后情况的信息将不胜感激。
更新 1(2019-09-13 15:44:00 EST) - 这是应用程序在 12 小时内(大约)发出的一组提取请求的可视化。粉红色条是成功获取的数量,浅蓝色条是失败的请求(全部都有 504、网关超时作为失败代码)。正如您所看到的,当应用程序启动时,它会出现许多故障,这些故障最终会减少并消失。然后从凌晨 4:30 到上午 9:30 左右,出现了多次故障,但最终都平息下来。几乎所有失败都发生在为一个用户提取消息时,该用户拥有一个非常大的邮箱(> 220K 消息)。我意识到这是一个很小的数据集,如果有帮助的话,我很乐意生成一个运行更长时间的数据集。此外,相关应用程序正在我们的 Azure 租户上运行,作为 Azure Function 应用程序的一部分,位于“美国东部”位置。
更新 2(2019 年 9 月 16 日,美国东部标准时间 09:32:00) - 我们在过去 3 天运行了系统,这里是应用程序在此期间发出的提取请求的可视化。蓝色条表示提取成功,粉红色条表示提取失败(均以 504、网关超时作为失败代码)。总结是,除了第一晚晚上 11 点到凌晨 2 点的一个小窗口外,对于拥有大邮箱的这个特定用户来说,没有任何请求成功。实际上,这意味着尽管有重试逻辑等,我们仍无法处理该用户的数据。
我想从控制台应用程序定期访问 Microsoft Graph,以便将邮件从 Outlook 邮箱复制到数据库。为了以编程方式进行身份验证,我必须使用 Microsoft Graph 的“客户端凭据流程”。
这些是我必须采取的步骤:
添加我需要的所有权限并授予他们访问权限:
让管理员通过首次访问来确认这些权限。这是使用以下 URL 完成的:
https://login.microsoftonline.com/{tenant}/v2.0/adminconsent
?client_id={app id}
&state=1234
&redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient
&scope=https://graph.microsoft.com/.default
Run Code Online (Sandbox Code Playgroud)
我收到以下回复:
admin_consent: True
tenant: ca566779-1e7b-48e8-b52b-68**********
state: 12345
scope**: scope: https://graph.microsoft.com/User.Read https://graph.microsoft.com/.default
Run Code Online (Sandbox Code Playgroud)
(作用域可能解释了这里稍后描述的问题:为什么我只有User.Read在配置了 13 个不同的权限时才得到?)
获取访问令牌(成功!):
尝试读取用户(成功):
尝试阅读我自己的电子邮件(没有成功):
尝试阅读其他人的电子邮件(用户被邀请以访客身份访问该应用程序,但仍然没有成功):
我不明白为什么我无法读取消息,但可以读取用户。看来权限被完全忽略了(我确认我不需要任何权限来读取用户)。
更新
这是我的租户姓名:
这些是添加到租户的用户:
重要提示:我的 Azure AD 中没有 Office 365 订阅。所有这些电子邮件都属于不同的 AD。
即使用户在用户端点上列出,上一个问题“租户 GUID 的租户不存在”?与我的类似,但我相信这不是重复的,因为我的问题略有不同,并且建议的解决方案使用 OAuth1 (我正在使用 OAuth2)。