EmailBackend用于通过Django中的多个SMTP发送电子邮件

Tom*_*and 21 email django smtp

让Django发送电子邮件在这里使用标准设置很好地解释,如下所示.

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = "mail.mysmtpserver.somewhere"
#EMAIL_PORT
EMAIL_HOST_USER = "my@login"
EMAIL_HOST_PASSWORD = "mypassword"
#EMAIL_USE_TLS = True
Run Code Online (Sandbox Code Playgroud)

然后使用django.core.mail.EmailMessage发送它.

但是,如果您运行多个站点并且需要每个站点通过自己的SMTP服务器(或者只是在同一SMTP服务器中的不同登录)发送电子邮件,该怎么办?

搜索这样的EmailBackend或者使用当前后端进行搜索的方法并没有产生任何令人满意的结果.

Dan*_*man 25

如果要覆盖提供的设置,只需创建自己的连接并将其提供给send_emailEmailMessage

from django.core.mail import get_connection, send_mail
from django.core.mail.message import EmailMessage
# TODO: Insert clever settings mechanism
my_host = ''
my_port = 587
my_username = ''
my_password = ''
my_use_tls = True
connection = get_connection(host=my_host, 
                            port=my_port, 
                            username=my_username, 
                            password=my_password, 
                            use_tls=my_use_tls) 

send_mail('diditwork?', 'test message', 'from_email', ['to'], connection=connection)
# or
EmailMessage('diditwork?', 'test message', 'from_email', ['to'], connection=connection).send(fail_silently=False)
Run Code Online (Sandbox Code Playgroud)

更新:确保在使用后关闭连接,@ michel.iamit回答指向显示连接缓存为smpt的代码.@dhackner答案显示了如何使用with语句自动关闭连接.

  • 您可能永远不应该尝试腌制“连接”,因为它可能在未来的任务中不可用。如果只是将数据传递给未来的任务并且在任务执行时构造 EmailMessage ,它应该可以工作...... (3认同)

dha*_*ner 12

我会略微修改Daniel Backman的答案,使用文档中的上下文管理器.它将自己处理open()和close()调用.

from django.core.mail import get_connection, send_mail
from django.core.mail.message import EmailMessage

with get_connection(
    host=my_host, 
    port=my_port, 
    username=my_username, 
    password=my_password, 
    use_tls=my_use_tls
) as connection:
    EmailMessage(subject1, body1, from1, [to1],
                 connection=connection).send()
Run Code Online (Sandbox Code Playgroud)

https://docs.djangoproject.com/en/dev/topics/email/#email-backends