【问题标题】:Django EmailMessage class execution makes the website slow and sluggishDjango EmailMessage 类执行使网站缓慢而缓慢
【发布时间】:2020-09-04 11:11:26
【问题描述】:

我正在使用 Django 的 EmailMessage 类从视图中发送自动邮件。但是,该网站实际上会停止显示下一个渲染页面(在模式上),直到发送了电子邮件。如果我删除电子邮件发送的东西,那么网站会非常快并且可以正常工作。请指导如何发送邮件,同时不要强迫用户等待邮件发送过程。我的部分视图代码如下供参考:

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 函数来调用docs 中建议的 email.send 方法。但是,主要流程仍然等待邮件发送过程。

【问题讨论】:

    标签: django email django-views bootstrap-modal


    【解决方案1】:

    我使用过线程,它工作正常。我已经编辑了答案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()
    

    【讨论】:

      【解决方案2】:

      所以我今天实现了相同的方法,只是使用了另一种方法。我的工具仍然很快,所以也许这可以帮助你。

      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 模板,有几种方法可以做到这一点。如果你想要这个,我可以搜索这个并将它添加到帖子中。我今天看了这些东西,所以我可以很快找到它。 无论如何,这对我来说很好,而且速度很快。

      【讨论】:

      • 这也会让服务器等待函数 sendMail 被执行。为了实现快速,我认为函数或类需要在不停止主控制流的情况下并行运行。
      • 顺便说一句,sendMail 函数是一个瘦包装器,并且在其内部使用相同的 EmailMessage 类。
      • 是的……我现在也看到了。对不起!
      • 不是问题。如果您还有其他事情,请告诉我。
      • 我已经添加了答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多