如何在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邮件后端:
- 先安装ACS的Python SDK:
pip install azure-communication-email
- 在你的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
- 在
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
相关产品推荐
相关产品推荐

