【问题标题】:Django sending email with dynamic SMTP settingsDjango 使用动态 SMTP 设置发送电子邮件
【发布时间】:2021-08-13 23:34:23
【问题描述】:

我正在尝试在管理员中配置 EMAIL_HOST 设置,我将创建一个包含必填字段的模型,例如:

  • EMAIL_HOST
  • EMAIL_HOST_USER
  • EMAIL_HOST_PASSWORD
  • EMAIL_PORT

但是如何使用 send_mail 在视图中使用这些字段?

【问题讨论】:

标签: python django django-models


【解决方案1】:

如果您想使用send_mail,您必须创建自己的email backend,它使用您的自定义设置,然后将其传递给connection 属性中的send_mail

【讨论】:

    【解决方案2】:

    这对我有用

    from django.core.mail import EmailMessage
    from django.core.mail.backends.smtp import EmailBackend
    
    config = Configuration.objects.get(**lookup_kwargs)
    
    try:
    
        backend = EmailBackend(
            host=config.host,
            port=config.port,
            password=config.password,
            username=config.username,
            use_tls=config.use_tls,
            fail_silently=config.fail_silently
        )
    
        mail = EmailMessage(
            subject="subject",
            body="body",
            from_email=config.username,
            to=["email@gmail.com"],
            connection=backend,
        )
        mail.send()
    
    except Exception as err:
        print(err)
    

    【讨论】:

      【解决方案3】:

      使用独立于 Django 设置的管理页面中的自定义配置的 SMTP 设置发送邮件:

      from django.core import mail
      from django.core.mail.backends.smtp import EmailBackend
      from <'Your SMTP setting in admin'> import <'Your model'>
      
      def send_mail(subject, contact_list, body): 
          try:
              con = mail.get_connection()
              con.open()
              print('Django connected to the SMTP server')
              mail_setting = <'Your model'>.objects.last()
              host = mail_setting.host
              host_user = mail_setting.host_user
              host_pass = mail_setting.host_pass
              host_port = mail_setting.host_port
              mail_obj = EmailBackend(
                  host=host,
                  port=host_port,
                  password=host_pass,
                  username=host_user,
                  use_tls=True,
                  timeout=10)
              msg = mail.EmailMessage(
                  subject=subject,
                  body=body,
                  from_email=host_user,
                  to=[contact_list],
                  connection=con)
              mail_obj.send_messages([msg])
              print('Message has been sent.')
              mail_obj.close()
              return True
      
          except Exception as _error:
              print('Error in sending mail >> {}'.format(_error))
              return False
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-24
        • 2018-01-24
        • 2011-07-30
        • 2016-04-17
        • 1970-01-01
        • 1970-01-01
        • 2019-02-11
        相关资源
        最近更新 更多