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

如何在Django 2.1中覆盖settings里的发件邮箱账号与密码?

如何在Django 2.1中发送邮件时覆盖全局邮箱配置?

你现在直接在视图里重新赋值EMAIL_HOST_USER和EMAIL_HOST_PASSWORD是不会生效的——因为Django的邮件后端初始化时已经读取了settings里的全局配置,单纯修改局部变量根本不会影响邮件发送时实际使用的参数。

要解决这个问题,正确的姿势是手动创建带有自定义配置的邮件连接,然后让EmailMultiAlternatives使用这个连接发送邮件。具体来说,你可以用django.core.mail.get_connection()方法生成自定义连接,把当前用户的邮箱和应用密码传入其中。

修改后的视图代码如下:

from django.core.mail import EmailMultiAlternatives, get_connection
from django.conf import settings

# 获取当前用户的邮箱和Gmail应用密码
email_user = request.user.email
email_password = current_user.profile.gmail_app_pass

# 创建自定义邮件连接,覆盖settings里的账号密码配置
connection = get_connection(
    host=settings.EMAIL_HOST,
    port=settings.EMAIL_PORT,
    username=email_user,
    password=email_password,
    use_tls=settings.EMAIL_USE_TLS
)

# 初始化邮件对象时传入自定义连接
toaddr = 'to@email'
tocc = 'toCC@email'
user_bcc = 'toBCC@email'
subject = 'Test Email from Django'
msgHtml = '<p>This is an <strong>important</strong> message.</p>'

msg = EmailMultiAlternatives(
    subject, 
    msgHtml, 
    email_user, 
    [toaddr], 
    bcc=[user_bcc], 
    cc=[tocc],
    connection=connection  # 指定使用自定义连接发送
)
msg.attach_alternative(msgHtml, "text/html")
msg.send()

小提示:

  • 我把SMTP服务器的host、port、use_tls这些通用配置从settings里导入了,这样不用重复写死,后续修改settings时这里也能同步更新。
  • 这种方式只会影响当前这封邮件的发送配置,完全不会改动全局的settings,完美匹配你的需求。
  • 记得确认你的Gmail账号已经开启两步验证,否则无法使用应用密码登录SMTP服务哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:57:14