使用标准设置很好地解释了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或者使用当前后端进行搜索的方法并没有产生任何令人满意的结果。
答案 0 :(得分:23)
如果您想覆盖提供的设置,您只需创建自己的连接并将其提供给send_email
或EmailMessage
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
现在您有每个网站的自定义设置