通过 Microsoft Graph 作为应用程序发送邮件(任何用户)
Send mail via Microsoft Graph as Application (Any User)
我们最近从本地交换迁移到 Microsoft 365,我想为所有用户启用 2FA(启用安全默认值)。但是,这会禁用我们一直用于从通讯组地址发送邮件的 SMTP 身份验证。 (无法通过 EWS 实现,因为它没有物理邮箱)
据我所知,唯一的方法是设置 SMTP 中继或通过 Microsoft Graph 发送。
我已经尝试沿着 Microsoft Graph 路线走下去,这就是我到目前为止所得到的。
在 Azure Active Directory > 应用程序注册中创建应用程序
添加 Mail.Send
和 User.Read.All
(应用程序,未委派)API 权限并已授予管理员同意。
使用以下方式请求令牌
- 通过https://login.microsoftonline.com/{AzureApi.TenantId}/oauth2/v2.0/authorize?response_type=code&client_id={AzureApi.ClientId}&redirect_uri={WebUtility.UrlEncode(RedirectUrl)}&scope=offline_access%20Mail.Send%20User.Read.All[使用管理员凭据]生成授权码
- Post 使用以下请求正文请求 https://login.microsoftonline.com/{AzureApi.TenantId}/oauth2/v2.0/token。
{ "grant_type": "authorization_code", "client_id": "AzureApi.ClientId", "client_secret": "AzureApi.ClientSecret", "code": "insert auth code", "redirect_uri": "insert redirect URL" }
获取不记名令牌
获得令牌后,现在我执行发送邮件的请求
- https://graph.microsoft.com/v1.0/users/{fromAddress}/sendMail
- 当
fromAddress
是请求令牌的用户的电子邮件地址时,这有效,但是当我尝试从不同的地址发送时,它会出现此错误 {"error":{"code":"ErrorAccessDenied","message":"Access is denied. Check credentials and try again."}}
- 我什至尝试为我尝试发送的邮箱的令牌用户添加
SendAs
权限,但这没有任何区别。无论如何 - 我希望能够以任何用户的身份发送邮件,而无需将权限委派给每个邮箱。
很高兴得到任何帮助。谢谢!!
您得到的行为是预期的,因为您使用的是委派权限 - authorization code flow。此流程不允许您的应用以任何用户身份发送电子邮件,但已登录/“请求令牌”的用户除外。
在您的情况下,您可以将权限添加为应用程序权限,然后使用 Client Credentials flow with either secret or certificate(more secure). Your token request will look like the Get Access Token Section。请注意,这意味着两件事:
- 您的应用需要在服务器端进行保护以保护凭据。
- 管理员需要同意 Azure AD 的权限
- 您的应用程序将能够以租户中的任何用户身份发送电子邮件,因此它非常敏感。
- 有了应用权限你只需要Mail.Send
我们最近从本地交换迁移到 Microsoft 365,我想为所有用户启用 2FA(启用安全默认值)。但是,这会禁用我们一直用于从通讯组地址发送邮件的 SMTP 身份验证。 (无法通过 EWS 实现,因为它没有物理邮箱)
据我所知,唯一的方法是设置 SMTP 中继或通过 Microsoft Graph 发送。
我已经尝试沿着 Microsoft Graph 路线走下去,这就是我到目前为止所得到的。
在 Azure Active Directory > 应用程序注册中创建应用程序
添加
Mail.Send
和User.Read.All
(应用程序,未委派)API 权限并已授予管理员同意。使用以下方式请求令牌
- 通过https://login.microsoftonline.com/{AzureApi.TenantId}/oauth2/v2.0/authorize?response_type=code&client_id={AzureApi.ClientId}&redirect_uri={WebUtility.UrlEncode(RedirectUrl)}&scope=offline_access%20Mail.Send%20User.Read.All[使用管理员凭据]生成授权码
- Post 使用以下请求正文请求 https://login.microsoftonline.com/{AzureApi.TenantId}/oauth2/v2.0/token。
{ "grant_type": "authorization_code", "client_id": "AzureApi.ClientId", "client_secret": "AzureApi.ClientSecret", "code": "insert auth code", "redirect_uri": "insert redirect URL" }
获取不记名令牌
获得令牌后,现在我执行发送邮件的请求
- https://graph.microsoft.com/v1.0/users/{fromAddress}/sendMail
- 当
fromAddress
是请求令牌的用户的电子邮件地址时,这有效,但是当我尝试从不同的地址发送时,它会出现此错误{"error":{"code":"ErrorAccessDenied","message":"Access is denied. Check credentials and try again."}}
- 我什至尝试为我尝试发送的邮箱的令牌用户添加
SendAs
权限,但这没有任何区别。无论如何 - 我希望能够以任何用户的身份发送邮件,而无需将权限委派给每个邮箱。
很高兴得到任何帮助。谢谢!!
您得到的行为是预期的,因为您使用的是委派权限 - authorization code flow。此流程不允许您的应用以任何用户身份发送电子邮件,但已登录/“请求令牌”的用户除外。
在您的情况下,您可以将权限添加为应用程序权限,然后使用 Client Credentials flow with either secret or certificate(more secure). Your token request will look like the Get Access Token Section。请注意,这意味着两件事:
- 您的应用需要在服务器端进行保护以保护凭据。
- 管理员需要同意 Azure AD 的权限
- 您的应用程序将能够以租户中的任何用户身份发送电子邮件,因此它非常敏感。
- 有了应用权限你只需要Mail.Send