动态Django邮件配置

11 投票
3 回答
4598 浏览
提问于 2025-04-17 21:30

我不想在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 个回答

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的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 了。

2

上面的回答(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)

我不能在那个回答下评论,所以决定发一个新帖。请有权限的人把它移动到那里或者修正那个回答。

22

这个问题很有意思。看起来在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这个类。

撰写回答