问题描述
在我们的应用程序中,我们需要通过电子邮件向用户发送各种事件触发器的通知。
如果我以"我"的身份发送当前用户,则可以发送电子邮件,但尝试以另一个用户帐户发送会返回错误消息,如果通知不是用户自己发送的,并且可能包含我们不希望在已发送文件夹中四处漂浮的信息,我更希望如此。
有效方式:
await graphClient.Me.SendMail(email, SaveToSentItems: false).Request().PostAsync();
什么不起作用:
string FromUserEmail = "notifications@contoso.com";
await graphClient.Users[FromUserEmail].SendMail(email, SaveToSentItems: false).Request().PostAsync();
还尝试直接使用用户对象ID:
await graphClient.Users["cd8cc59c-0815-46ed-aa45-4d46c8a89d72"].SendMail(email, SaveToSentItems: false).Request().PostAsync();
我的应用程序具有由所有者/管理员启用并授予Graph API"Send mail as any user
"的权限。
接口返回的错误信息:
代码:ErrorFolderNotFound消息:指定的文件夹无法 在商店找到的。
我认为此错误可能是因为通知帐户没有已发送文件夹,所以我将SaveToSentItems
值设置为False,但仍然收到相同的错误。
我需要检查帐户本身是否有任何设置才能允许应用使用此帐户发送邮件,或者此操作是否有效?
我已在此处签出文档: https://developer.microsoft.com/en-us/graph/docs/api-reference/v1.0/api/user_sendmail它似乎支持我正在尝试执行的操作,但没有引用除"已发送邮件"文件夹之外的任何文件夹,我告诉API无论如何不要将其保存到该文件夹。
我们不打算在这里模拟任何实际用户,只是从应用程序内部通过此特定帐户发送通知电子邮件(我知道这在技术上是模拟的,但不是真正的实体)。
推荐答案
只要您使用委派权限(即当用户登录时),即使您的管理员已同意Mail.Send.Shared,它也不会授予对租户中所有邮箱的访问权限。这些OAuth权限不会覆盖用户的现有权限(和限制)。
如果用户尚未配置能够"以"Notify@contoso.com用户的身份"发送"的权限,则您将看到此错误。
若要使其正常工作,您需要将"发送为"权限实际授予将使用您的应用程序的所有用户。
这是一件微妙的事情,诚然有点令人困惑。在Azure门户中,权限的描述略有不同,具体取决于您查看的是应用程序权限还是委派权限。
- 应用:
Send mail as any user
- 委托:
Send mail on behalf of others
由于您使用的是"委派",因此权限不允许您以任何用户身份发送,只能代表登录用户有权以身份发送的任何人员发送。
您可以在这里使用另一种方法来避免将这些权限授予所有用户(这将允许他们通过Outlook等进行发送)将是让您的后端应用程序使用客户端凭据流来获取仅应用程序令牌。在这种情况下,应用程序本身将拥有以任何用户身份发送的权限。这篇关于Microsoft Graph API-以其他用户身份发送电子邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!