You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django通过Office365通讯组发送邮件遇问题求助

Django通过Office365通讯组发送邮件解决方案

问题根源

django-o365mail默认调用Microsoft Graph的users/{user-id}/sendMail接口,但通讯组属于group资源而非user,直接使用默认配置会触发两类错误:

  • 404:将通讯组邮箱当作用户ID传入users接口,资源不存在
  • 403:权限不足,或未使用正确的group接口

解决步骤

1. 配置Azure AD应用权限

在Azure AD门户中,给你的应用注册添加应用权限:

  • 添加Group.SendMail(最小权限)或Group.ReadWrite.All
  • 点击「授予管理员同意」,确保权限生效

2. 自定义EmailBackend

由于django-o365mail原生不支持group资源,需要继承原后端重写邮箱获取逻辑:

创建your_project/backends.py:

from django_o365mail.backends import O365EmailBackend
from O365 import Account

class O365GroupEmailBackend(O365EmailBackend):
    def get_mailbox(self):
        # 优先使用配置的组ID,无则用DEFAULT_FROM_EMAIL
        group_identifier = self.settings.get('O365_MAIL_GROUP_ID') or self.settings['DEFAULT_FROM_EMAIL']
        
        account = Account(
            (self.client_id, self.client_secret),
            tenant_id=self.tenant_id,
            auth_flow_type='credentials',
        )
        
        # 获取通讯组对象并返回其邮箱实例
        group = account.directory.get_group(group_identifier)
        return group.mailbox()

3. 更新Django配置

修改settings.py:

DEFAULT_FROM_EMAIL = "distribution_list@example.com"
# 替换为自定义后端的路径
EMAIL_BACKEND = 'your_project.backends.O365GroupEmailBackend'
O365_MAIL_CLIENT_ID = env('O365_MAIL_CLIENT_ID')
O365_MAIL_CLIENT_SECRET = env('O365_MAIL_CLIENT_SECRET')
O365_MAIL_TENANT_ID = env('O365_MAIL_TENANT_ID')
O365_ACTUALLY_SEND_IN_DEBUG = True
# 可选:通讯组的GUID(比邮箱地址更可靠,避免重名问题)
O365_MAIL_GROUP_ID = 'xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'

4. 验证通讯组配置

确保你的通讯组:

  • 已启用邮件功能
  • 允许应用/服务账户代表其发送邮件(可在Exchange管理员中心配置)

错误排查

  • 若仍报404:检查O365_MAIL_GROUP_ID或DEFAULT_FROM_EMAIL是否为有效通讯组ID/邮箱
  • 若仍报403:确认Azure AD应用权限已授予管理员同意,且通讯组未限制发送权限

内容的提问来源于stack exchange,提问作者Bobort

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:15:20