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()
我正在使用 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()