EmailBackend通过多个SMTP在Django发送电子邮件(EmailBackend for

2019-07-04 04:45发布

获取的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 

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

如何过,如果你正在运行的多个网站,并且需要每个这些通过自己的SMTP服务器(或只是不同的登录在同一个SMTP服务器)发送电子邮件?

搜索这样的EmailBackend或方式与当前的后端没有产生任何令人满意的结果去做。

Answer 1:

如果要覆盖所提供的设置,你可以创建自己的连接并将其提供给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的回答显示了如何语句中使用自动关闭连接。



Answer 2:

我想稍微修改丹尼尔·贝克曼的回答像使用上下文管理要在文档。 它会照顾的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



Answer 3:

这可能是一个想法,看看Django的的电子邮件后台,并创建一个定制的一个。

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

这个例子说明了如何使自定义一个(这一个在SMTP代替使用SMTP_SSL):

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

我分叉那一个,这两个(这样我就可以使用不同的网站使用不同的邮件设置一个后端)相结合:

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

不知道是否会工作,但正如你看到以上所有返回代码在打开的连接,如果已经有一个连接...因此,也许有您的解决方案开始....不这样做密切,开放的连接,并使用不同的设置重新打开......(不知道是否可行)。



Answer 4:

抱歉,无法对答案的其余部分,没有足够的代表直接评论。

只需一个加法:

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。



Answer 5:

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

一种方法是有,除了你的settings.py ,一个settings_SITENAME.py为每个站点。 这些文件将具有自定义邮件服务器设置。 每个站点都会有settings_local.py是一个符号链接到它自己的自定义设置文件

然后把这个节在底部settings.py

try:                                                                                                                                                                            
    from settings_local import *                                                                                                                                                
except ImportError:                                                                                                                                                             
    pass  

现在你有每个站点自定义设置



文章来源: EmailBackend for sending email through multiple SMTP in Django