动态Django邮件配置
我不想在setting.py文件里使用电子邮件的配置字段,我想把它们放到一个模型里。
class Configuration(models.Model):
email_use_tls = models.BooleanField(_(u'EMAIL_USE_TLS'),default=True)
email_host = models.CharField(_(u'EMAIL_HOST'),max_length=1024)
email_host_user = models.CharField(_(u'EMAIL_HOST_USER'),max_length=255)
email_host_password = models.CharField(_(u'EMAIL_HOST_PASSWORD'),max_length=255)
email_port = models.PositiveSmallIntegerField(_(u'EMAIL_PORT'),default=587)
....
配置django.core.mail.send_mail的行为,最好的做法是什么?我应该把send_mail的代码复制到我的项目里吗?这不是我想要的。
3 个回答
我用了这个方法好几年了,觉得非常不错。最近我发布了一个包(django-des
),用来实现这里其他回答提到的方法。
这个包会安装一个模型(DynamicEmailConfiguration
),并使用 django-solo
让你在Django的管理后台有个很好的编辑体验。它还提供了一个邮件后端,可以从这个模型中提取设置,和Andrey Nelubin推荐的方法类似。此外,它在Django管理面板的右上角还提供了一个方便的测试邮件按钮。
安装步骤如下:
安装Django动态邮件设置:
$ pip install django-des
把它添加到你的 `INSTALLED_APPS` 中:
INSTALLED_APPS = ( ... 'django_des', ... )
在settings.py中添加动态邮件配置的邮件后端:
EMAIL_BACKEND = 'django_des.backends.ConfiguredEmailBackend'
为了启用测试邮件支持,添加Django DES的URL模式:
from django_des import urls as django_des_urls urlpatterns = [ ... url(r'^django-des/', include(django_des_urls)), ]
现在你可以访问 127.0.0.1:8000/admin/django_des/dynamicemailconfiguration/ 来配置你的邮件设置。你也可以从那里发送测试邮件。
完成这些后,你就可以正常使用 send_mail
了。
上面的回答(Andrey Nelubin的回答)有一点错误。其实不需要调用 get_connection(backend=backend)
。你应该把 backend 直接传给 EmailMessage
的构造函数,像这样:
backend = EmailBackend(host=config.host, port=congig.port, username=config.username,
password=config.password, use_tls=config.use_tls, fail_silently=config.fail_silently)
email = EmailMessage(subject='subj', body='body', from_email=from_email, to=to,
connection=backend)
我不能在那个回答下评论,所以决定发一个新帖。请有权限的人把它移动到那里或者修正那个回答。
这个问题很有意思。看起来在EmailMessage类里已经实现了这个功能。
首先,你需要设置电子邮件的后台配置。
from django.core.mail import EmailMessage
from django.core.mail.backends.smtp import EmailBackend
config = Configuration.objects.get(**lookup_kwargs)
backend = EmailBackend(host=config.host, port=congig.port, username=config.username,
password=config.password, use_tls=config.use_tls, fail_silently=config.fail_silently)
然后把连接传给EmailMessage。
email = EmailMessage(subject='subj', body='body', from_email=from_email, to=to,
connection=backend)
最后就可以发送电子邮件啦 :)
email.send()
当然,如果你想发送HTML格式的邮件或者文件附件,就要用EmailMultiAlternatives这个类。