【问题标题】:Dynamic Django Mail Configuration动态 Django 邮件配置
【发布时间】:2014-04-12 11:25:19
【问题描述】:

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

【问题讨论】:

    标签: python django email


    【解决方案1】:

    非常有趣的问题。似乎这已经在 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()
    

    Ofc 如果您想要 html 或文件附件,请改用 EmailMultiAlternatives

    【讨论】:

      【解决方案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)
      

      我无法添加答案并决定发布新的评论。请有权限的人把它移到那里或更正答案。

      【讨论】:

        【解决方案3】:

        我已经使用这种方法几年了,我很喜欢它。我刚刚发布了一个包 (django-des) 来使用此处其他答案中的方法来完成此操作。

        这个包安装了一个模型 (DynamicEmailConfiguration) 并使用django-solo 给你一个在 Django admin 中很好的编辑体验。然后它提供了一个电子邮件后端,您可以使用该后端以类似于 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了。

        【讨论】:

          猜你喜欢
          • 2022-07-26
          • 1970-01-01
          • 2018-11-18
          • 1970-01-01
          • 1970-01-01
          • 2018-04-18
          • 2013-05-05
          • 2017-02-22
          • 1970-01-01
          相关资源
          最近更新 更多