【问题标题】:How to send Email without using settings.py ? (smtp parameters in database)如何在不使用 settings.py 的情况下发送电子邮件? (数据库中的 smtp 参数)
【发布时间】:2022-01-10 10:09:18
【问题描述】:

我希望能够使用 django 发送电子邮件,但不使用 settings.py 中的电子邮件参数。 (EMAIL_HOST、EMAIL_USE_TLS、EMAIL_HOST_PASSWORD 等...)

这些参数存储在 db 中,因为它们可能因用户而异。 如何在 base 中使用这些参数而不是在 settings.py 中使用这些参数来发送电子邮件?

class EmailThread(threading.Thread):
    """
    Class email (Thread)
    """
    def __init__(self, subject, html_content, recipient_list):
        self.subject = subject
        self.recipient_list = recipient_list
        self.html_content = html_content
        threading.Thread.__init__(self)

    def run (self):
        msg = EmailMessage(self.subject,
                           self.html_content,
                           settings.EMAIL_HOST_USER,
                           self.recipient_list)
        msg.content_subtype = "html"
        msg.send()

def send_html_mail(subject, html_content, recipient_list):
    """
    send an email asynchronous
    """
    EmailThread(subject, html_content, recipient_list).start()

我可以使用:email_params = EmailParameter.objects.get(user=request.user)获取参数

class EmailParameter(models.Model):
    email_use_tls = models.BooleanField(_("email use tls"), default=True)
    email_use_ssl = models.BooleanField(_("email use tls"), default=False)
    email_host = models.URLField(_("email host"), max_length=200)
    email_host_user = models.CharField(_("email host user"), max_length=200)
    email_host_password = models.CharField(_("email host password"), max_length=200)
    email_port = models.PositiveIntegerField(_("email port"))
    default_from_email = models.EmailField(_("default from email"), max_length=200)
    signature = models.TextField(_("signature"))
    user = models.ForeignKey(
        User,
        verbose_name = _("user"),
        related_name = "user_email_parameter",
        on_delete=models.CASCADE
    ) 

【问题讨论】:

标签: django


【解决方案1】:

只需在类实例中移动所有必要的参数并使用它而不是settings.XXX

class EmailThread(threading.Thread):
    def __init__(self, subject, html_content, recipient_list, email_host_user):
        self.subject = subject
        self.recipient_list = recipient_list
        self.html_content = html_content
        # set parameter to instance
        self.email_host_user = email_host_user
        threading.Thread.__init__(self)

    def run (self):
        msg = EmailMessage(self.subject,
                           self.html_content,
                           # use instance parameter
                           self.email_host_user,
                           self.recipient_list)
        msg.content_subtype = "html"
        msg.send()

# add email_host_user to be able set it when call mail send process
def send_html_mail(subject, html_content, recipient_list, email_host_user):
    EmailThread(subject, html_content, recipient_list, email_host_user).start()

现在您可以使用自定义参数发送邮件了:

e_h_u = EmailParameter.objects.get(user=request.user).email_host_user
send_html_mail(subject, html_content, recipient_list, e_h_u)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 2013-12-08
    • 2020-02-20
    • 1970-01-01
    • 2023-03-26
    • 2011-08-19
    • 2013-06-23
    相关资源
    最近更新 更多