Как отправить 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)