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

使用Django的EmailMultiAlternatives后页面渲染邮箱显示异常

解决Django中EmailMultiAlternatives导致模板渲染邮箱显示为对象的问题

问题原因

你在视图代码中犯了变量覆盖的错误:原本存储用户邮箱字符串的email变量,被重新赋值给了EmailMultiAlternatives的实例对象。当你把这个被覆盖后的email传入模板时,模板渲染的自然是邮件对象的字符串表示(也就是你看到的<django.core.mail.message.EmailMultiAlternatives object at ...>),而非原始的用户邮箱地址。

修复方案

只需要避免覆盖原始邮箱变量即可,两种简单实现方式:

方式1:重命名邮件对象变量

把EmailMultiAlternatives实例的变量名改成和原始邮箱变量不同的名称,比如email_msg:

# html email configuration
html_content = render_to_string("basecamp/html_email-inquiry.html", 
{'name': name, 'contact': contact, 'email': email, 
'message': message,})
text_content = strip_tags(html_content)
# 重命名邮件对象变量,避免覆盖原始邮箱
email_msg = EmailMultiAlternatives(
"Inquiry",
text_content,
'',
[email]  # 依然使用原始邮箱变量
)
email_msg.attach_alternative(html_content, "text/html")
email_msg.send()            

return render(request, 'basecamp/inquiry_details.html',
                {'name' : name, 'email': email, })  # 这里的email仍是原始邮箱字符串

方式2:提前保存原始邮箱到新变量

如果不想修改邮件对象变量名,可提前把原始邮箱存到新变量中:

# 提前保存原始邮箱
user_email = email

# html email configuration
html_content = render_to_string("basecamp/html_email-inquiry.html", 
{'name': name, 'contact': contact, 'email': user_email, 
'message': message,})
text_content = strip_tags(html_content)
email = EmailMultiAlternatives(
"Inquiry",
text_content,
'',
[user_email]
)
email.attach_alternative(html_content, "text/html")
email.send()            

return render(request, 'basecamp/inquiry_details.html',
                {'name' : name, 'email': user_email, })  # 返回保存好的原始邮箱

验证修改

修改后,模板中的{{ email }}会正确渲染为用户的邮箱地址,而非邮件对象的字符串表示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:11:31