动态Django邮件配置

时间:2014-03-09 11:56:14

标签: python django email

我不想在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代码复制到我的项目中吗?那不是我想要的。

4 个答案:

答案 0 :(得分:12)

非常有趣的问题。看起来这已经在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

答案 1 :(得分:2)

上面的答案几乎没有错误(Andrey Nelubin的回答)。无需致电get_connection(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)

我无法添加评论,回答并决定发布新评论。请有权限的人将其移至那里或更正答案。

答案 2 :(得分:0)

我已经使用这种方法几年并且喜欢它。我刚刚发布了一个包(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的网址格式:

    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

答案 3 :(得分:0)

您应该从EmailBackend创建一个对象:

我曾经是answer in the previous堆栈溢出帖子。