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

如何在Django(结合Djoser)中集成Azure Communication Services邮件服务

如何在Django(结合Djoser)中集成Azure Communication Services邮件服务

我之前刚好折腾过Django + Djoser集成Azure通信服务(ACS)邮件的需求,踩过几个坑,给你一步步拆解怎么弄:

第一步:准备ACS的邮件凭据(关键!你之前的问题大概率出在这)

你之前用连接字符串或访问密钥当密码肯定不行,ACS的SMTP需要专门生成的凭据:

  • 登录Azure门户,找到你的ACS资源,进入「邮件」服务
  • 先完成域名验证(必须添加DNS记录让Azure确认你拥有该域名,不然发不了邮件)
  • 切换到「SMTP」选项卡,点击「生成SMTP凭据」,保存好系统生成的用户名和密码(这俩是专门给SMTP用的,和ACS的访问密钥/连接字符串不是一回事)
  • 记好SMTP服务器地址:smtp.azurecomm.net,端口固定是587

第二步:配置Django的邮件系统

在你的settings.py里修改邮件相关配置,替换成ACS的SMTP信息:

# 使用Django默认的SMTP后端
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# ACS的SMTP服务器地址
EMAIL_HOST = 'smtp.azurecomm.net'
EMAIL_PORT = 587
# 刚才生成的SMTP用户名
EMAIL_HOST_USER = '你的SMTP用户名'
# 刚才生成的SMTP密码
EMAIL_HOST_PASSWORD = '你的SMTP密码'
# 必须启用TLS
EMAIL_USE_TLS = True
# 发件人邮箱必须是你在ACS里验证过的域名下的邮箱,比如 no-reply@你的验证域名.com
DEFAULT_FROM_EMAIL = 'no-reply@your-verified-domain.com'
SERVER_EMAIL = DEFAULT_FROM_EMAIL

第三步:配置Djoser的邮件行为

Djoser默认会直接调用Django的邮件系统,所以只要上面的配置正确,注册激活、密码重置这些邮件就会自动通过ACS发送。你可以在settings.py里进一步定制Djoser的邮件逻辑:

DJOSER = {
    # 开启注册激活邮件
    'SEND_ACTIVATION_EMAIL': True,
    # 开启邮箱确认邮件
    'SEND_CONFIRMATION_EMAIL': True,
    # 密码修改后发送确认邮件
    'PASSWORD_CHANGED_EMAIL_CONFIRMATION': True,
    # 激活链接的路径(根据你的前端路由调整)
    'ACTIVATION_URL': 'activate/{uid}/{token}',
    # 自定义邮件模板(可选,如果你想改邮件样式)
    'EMAIL': {
        'activation': 'accounts/email/activation.html',
        'confirmation': 'accounts/email/confirmation.html',
        'password_reset': 'accounts/email/password_reset.html',
    }
}

如果要自定义邮件模板,就把对应的HTML文件放在指定路径里就行,模板里可以用Djoser提供的变量,比如{{ user.get_username }}、{{ url }}等。

第四步:测试邮件是否能正常发送

先在Django shell里测试一下,确保配置没问题:

python manage.py shell

然后执行:

from django.core.mail import send_mail

send_mail(
    '测试ACS邮件',
    '这是一封通过Azure通信服务发送的测试邮件',
    'no-reply@your-verified-domain.com',
    ['你的测试邮箱@example.com'],
    fail_silently=False,
)

如果没有报错,且测试邮箱收到了邮件,说明配置成功了!之后用户注册时Djoser就会自动发送激活邮件啦。


备选方案:用ACS Python SDK自定义邮件后端

如果你不想用SMTP,想直接调用ACS的API发送邮件,可以自定义一个Django邮件后端:

  1. 先安装ACS的Python SDK:
pip install azure-communication-email
  1. 在你的app里新建backends.py,写入自定义后端代码:
from django.core.mail.backends.base import BaseEmailBackend
from azure.communication.email import EmailClient
from django.conf import settings

class AzureCommunicationEmailBackend(BaseEmailBackend):
    def __init__(self, fail_silently=False, **kwargs):
        super().__init__(fail_silently=fail_silently)
        # 从settings里读取ACS的连接字符串
        self.client = EmailClient.from_connection_string(settings.AZURE_COMMUNICATION_CONNECTION_STRING)

    def send_messages(self, email_messages):
        sent_count = 0
        for message in email_messages:
            try:
                # 构建ACS需要的邮件参数
                email_content = {
                    'sender_address': message.from_email,
                    'recipients': {
                        'to': [{'address': to_email} for to_email in message.to]
                    },
                    'content': {
                        'subject': message.subject,
                        'plain_text': message.body,
                        # 如果有HTML内容,取第一个替代内容
                        'html': message.alternatives[0][0] if message.alternatives else None
                    }
                }
                # 发送邮件(ACS是异步发送,这里等待结果)
                poller = self.client.begin_send_email(email_content)
                poller.result()
                sent_count += 1
            except Exception as e:
                if not self.fail_silently:
                    raise e
        return sent_count
  1. 在settings.py里配置这个后端:
# 你的ACS连接字符串,从Azure门户获取
AZURE_COMMUNICATION_CONNECTION_STRING = '你的ACS连接字符串'
# 指定自定义的邮件后端
EMAIL_BACKEND = 'accounts.backends.AzureCommunicationEmailBackend'
DEFAULT_FROM_EMAIL = 'no-reply@your-verified-domain.com'

这种方式更适合需要复杂邮件功能(比如批量发送、跟踪邮件状态)的场景。


备注:内容来源于stack exchange,提问作者Samik Prakash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 13:38:09