Как отправить Email без использования settings.py? (параметры smtp в базе данных)

Я хотел бы иметь возможность отправлять электронные письма с помощью django, но без использования параметров электронной почты в settings.py. (EMAIL_HOST, EMAIL_USE_TLS, EMAIL_HOST_PASSWORD, etc ...)

Эти параметры хранятся в db, потому что они могут быть разными в зависимости от пользователя. Как использовать эти параметры в базе для отправки писем, а не те, что в 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
    ) 

Просто переместите все необходимые параметры внутрь экземпляра класса и используйте его вместо 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)
Вернуться на верх