32

使用标准设置很好地解释了让 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 或使用当前后端执行此操作的方法并没有产生任何令人满意的结果。

4

5 回答 5

43

如果您想覆盖提供的设置,您可以创建自己的连接并将其提供给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 语句自动关闭连接。

于 2013-01-18T11:38:19.257 回答
19

我会稍微修改 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

于 2014-04-28T20:50:35.250 回答
2

对不起,不能直接评论其余的答案,没有足够的代表。

只需添加一项:

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。

于 2014-06-03T08:12:24.463 回答
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

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

于 2013-04-18T20:14:06.953 回答
0

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

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

然后把这节放在下面settings.py

try:                                                                                                                                                                            
    from settings_local import *                                                                                                                                                
except ImportError:                                                                                                                                                             
    pass  

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

于 2012-11-27T19:18:58.913 回答