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

