Django EmailMessage class 执行使网站变慢和呆滞

Django EmailMessage class execution makes the website slow and sluggish

我正在使用 Django 的 EmailMessage class 从视图发送自动邮件。然而,该网站实际上停止显示下一个呈现页面(在模态上),直到发送了电子邮件。如果我删除电子邮件发送内容,那么该网站会非常快并且可以正常运行。请指导如何在不强迫用户等待邮件发送过程的情况下发送邮件。我的部分视图代码如下,供参考:

email =EmailMessage(
                'Message received',
                'You received a message....',
                settings.DEFAULT_FROM_EMAIL,
                [request.user.email],
                reply_to=['noreply@example.com'])
email.content_subtype = "html"
email.send(fail_silently=True)

return JsonResponse({"instance": rendered,"valid":True}, status=200)

编辑:更新:

我也试过 async_to_sync 函数来调用 email.send 方法,正如 docs 中所建议的那样。但是主流程还是等待邮件发送过程。

所以我今天实现了同样的方法,只是用了另一种方法。我的工具还是很快的,所以也许这对你有帮助。

def sendMail():

   subject = "Automate Info"
   message = "Hello"
   email_from = settings.EMAIL_HOST_USER

   send_mail(
        subject,
        message,
        email_from,
        recipient_list
    )

return

settings.py:

EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.gmail.com"
EMAIL_USE_TLS = True
EMAIL_PORT = 25
EMAIL_HOST_USER = "yourEmail@example.com"
EMAIL_HOST_PASSWORD = "yourpassword"
EMAIL_USE_TLS = True
EMAIL_USE_SSL = False

您也可以使用电子邮件 .html 模板,有几种方法可以做到这一点。如果你想要这个,我可以搜索这个并将其添加到 Post。我今天看了这些东西,所以我可以快速找到它。 无论如何,这对我来说很好,而且速度非常快。

我用过线程,效果很好。我已经编辑了答案 here。 我在这里添加带有附加参数的代码以供参考。

import threading
from threading import Thread

class EmailThread(threading.Thread):
    def __init__(self, subject, html_content, recipient_list, replyto):
        self.subject = subject
        self.recipient_list = recipient_list
        self.html_content = html_content
        self.reply_to = replyto
        threading.Thread.__init__(self)

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

def send_html_mail(subject, html_content, recipient_list, replyto):
    EmailThread(subject, html_content, recipient_list, replyto).start()