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

如何让Django-all-auth默认使用EmailMultiAlternatives替代send_mail()

替换django-all-auth默认邮件发送方式为EmailMultiAlternatives

要让django-all-auth默认使用EmailMultiAlternatives发送带内联图片的邮件,核心是重写它的邮件适配器逻辑,具体步骤如下:

1. 自定义账户邮件适配器

django-all-auth的DefaultAccountAdapter负责处理注册确认等账户相关邮件,我们继承它并重写send_mail方法,改用EmailMultiAlternatives:

在你的Django应用下创建adapters.py文件,写入以下代码:

from django.core.mail import EmailMultiAlternatives
from allauth.account.adapter import DefaultAccountAdapter


class CustomAccountAdapter(DefaultAccountAdapter):
    def send_mail(self, template_prefix, email, context):
        # 渲染邮件主题、纯文本和HTML内容
        subject = self.render_mail(template_prefix, email, context, "subject.txt")
        from_email = self.get_from_email()
        text_content = self.render_mail(template_prefix, email, context, "message.txt")
        html_content = self.render_mail(template_prefix, email, context, "message.html")

        # 初始化EmailMultiAlternatives实例
        msg = EmailMultiAlternatives(subject, text_content, from_email, [email])
        msg.attach_alternative(html_content, "text/html")

        # (可选)添加内联图片,示例:
        # from django.core.files.storage import default_storage
        # with default_storage.open("emails/inline_logo.png") as img_file:
        #     msg.attach("inline_logo.png", img_file.read(), "image/png")

        msg.send()

2. 在settings.py中配置自定义适配器

告诉django-all-auth使用我们的适配器:

ACCOUNT_ADAPTER = '你的应用名.adapters.CustomAccountAdapter'

3. 适配密码重置邮件(可选)

如果密码重置邮件也需要支持内联图片,同样重写密码重置适配器:
在adapters.py中追加代码:

from allauth.account.adapter import DefaultPasswordResetAdapter
from allauth.utils import build_absolute_uri


class CustomPasswordResetAdapter(DefaultPasswordResetAdapter):
    def send_mail(self, template_prefix, email, context):
        # 构建重置链接(保持原逻辑)
        context['uri'] = build_absolute_uri(
            context['request'],
            self.get_password_reset_url(context)
        )
        # 渲染邮件内容
        subject = self.render_mail(template_prefix, email, context, "subject.txt")
        from_email = self.get_from_email()
        text_content = self.render_mail(template_prefix, email, context, "message.txt")
        html_content = self.render_mail(template_prefix, email, context, "message.html")

        # 使用EmailMultiAlternatives发送
        msg = EmailMultiAlternatives(subject, text_content, from_email, [email])
        msg.attach_alternative(html_content, "text/html")

        # (可选)添加内联图片
        # with open("path/to/your/image.png", "rb") as img_file:
        #     msg.attach("image.png", img_file.read(), "image/png")

        msg.send()

然后在settings.py中添加配置:

PASSWORD_RESET_ADAPTER = '你的应用名.adapters.CustomPasswordResetAdapter'

4. 模板中引用内联图片

在HTML邮件模板里,通过cid:前缀引用附加的图片,比如:

<img src="cid:inline_logo.png" alt="网站Logo">

这里的inline_logo.png要和msg.attach时指定的文件名完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:27:23