如何通过Azure Function向Azure Service Principal发送电子邮件?
针对Graph API操作Azure服务主体邮件需求的实现方案
核心前提:Azure Service Principal(服务主体)是Azure AD中的身份授权实体,本身未绑定Exchange Online邮箱资源,不存在直接向服务主体自身发送邮件的能力。以下是两种常见对应需求的实现方案:
场景1:使用服务主体身份调用Graph API发送邮件
- 前置配置:为服务主体授予Graph API的应用权限
Mail.Send,并完成管理员同意
Python 实现示例代码:
from azure.identity import DefaultAzureCredential import requests # 基础参数配置 TENANT_ID = "你的Azure AD租户ID" CLIENT_ID = "服务主体的客户端ID" CLIENT_SECRET = "服务主体的客户端密钥" # 发件人需替换为租户内已激活Exchange服务的有效邮箱地址/ID SEND_ENDPOINT = "https://graph.microsoft.com/v1.0/users/{发件人邮箱地址}/sendMail" # 获取Graph API访问令牌 credential = DefaultAzureCredential( tenant_id=TENANT_ID, client_id=CLIENT_ID, client_secret=CLIENT_SECRET ) access_token = credential.get_token("https://graph.microsoft.com/.default").token # 构造邮件内容 mail_params = { "message": { "subject": "服务主体调用Graph API发送的测试邮件", "body": { "contentType": "Text", "content": "测试邮件内容" }, "toRecipients": [ { "emailAddress": { "address": "收件人邮箱地址" } } ] }, "saveToSentItems": "false" } # 发起发信请求 headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json" } resp = requests.post(SEND_ENDPOINT, headers=headers, json=mail_params) if resp.status_code == 202: print("邮件发送成功") else: print(f"发送失败,错误码:{resp.status_code},错误信息:{resp.text}")
场景2:给服务主体关联的通知联系人发邮件
如果你的需求是向服务主体的所有者、绑定的通知联系人推送邮件,可以先调用Graph API查询服务主体的关联通知邮箱,再复用场景1的发信逻辑发送。
查询服务主体通知邮箱的请求示例:
GET https://graph.microsoft.com/v1.0/servicePrincipals/{服务主体Object ID}?$select=notificationEmailAddresses,owners
返回结果中notificationEmailAddresses字段即为该服务主体预先配置的通知邮箱列表。
注意事项
- 所有应用级Graph权限必须由租户管理员完成权限同意后才可生效
- 若需要将发送的邮件保存到发件箱的已发送项目中,可将发信请求参数的
saveToSentItems字段设置为true - 服务主体的客户端密钥、租户ID等敏感信息禁止硬编码在业务代码中,建议通过Azure Key Vault等加密托管服务读取
内容的提问来源于stack exchange,提问作者azureLover
相关产品推荐
相关产品推荐

