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

时间:2012-11-27 18:18:25

标签: django email smtp

使用标准设置很好地解释了Django发送电子邮件的问题{/ 3}}。

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

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

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

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

5 个答案:

答案 0 :(得分:23)

如果您想覆盖提供的设置,您只需创建自己的连接并将其提供给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)

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

答案 1 :(得分:9)

我会略微修改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()

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

答案 2 :(得分:1)

查看django的电子邮件后端并创建自定义的后端可能是一个想法。

这是代码:https://github.com/django/django/blob/master/django/core/mail/backends/smtp.py

此示例显示了如何创建自定义的(这个使用SMTP_SSL而不是SMTP):

https://gist.github.com/jsummerfield/1486891

我分叉那个,将两者结合起来(所以我可以使用一个后端用于不同的邮件设置的不同网站):

https://gist.github.com/iamit/5415771

不确定这是否有效,但正如您所看到的那样,如果已经有连接,则会在打开连接时返回上面的所有代码... 所以也许你的解决方案已经开始了....不要这样做,关闭打开的连接并重新打开不同的设置......(不确定是否有效)。

答案 3 :(得分:1)

很抱歉,无法直接评论其余的答案,而不是代表。

只需添加一个:

connection = get_connection(host=my_host, 
                                port=my_port, 
                                username=my_username, 
                                password=my_password, 
                                user_tls=my_use_tls)

应该是

connection = get_connection(host=my_host, 
                                port=my_port, 
                                username=my_username, 
                                password=my_password, 
                                use_tls=my_use_tls)

如果你不使用TLS(你应该),这只是一个问题,因为它默认为True。

答案 4 :(得分:0)

为每个网站使用不同的配置。

除了settings.py之外,一种方法是为每个网站提供settings_SITENAME.py。 这些文件将具有自定义邮件服务器设置。 每个网站都会settings_local.py成为其自定义设置文件的符号链接

然后将此节放在settings.py的底部:

try:                                                                                                                                                                            
    from settings_local import *                                                                                                                                                
except ImportError:                                                                                                                                                             
    pass  

现在您有每个网站的自定义设置