如何让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
相关产品推荐
相关产品推荐

