如何使用Django发送异步电子邮件

27

这是我的代码:

class EmailThread(threading.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 = EmailMultiAlternatives(self.subject, self.html_content, EMAIL_HOST_USER, self.recipient_list)
        #if self.html_content:
        msg.attach_alternative(True, "text/html")
        msg.send()

def send_mail(subject, html_content, recipient_list):
    EmailThread(subject, html_content, recipient_list).start()

它没有发送电子邮件。我该怎么办?

4个回答

41

现在没问题了;

import threading
from threading import Thread

class EmailThread(threading.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, EMAIL_HOST_USER, self.recipient_list)
        msg.content_subtype = "html"
        msg.send()

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

有人确定 Django 中的线程是否按预期工作吗?这个相关的答案 https://dev59.com/vGvXa4cB1Zd3GeqPH1Kx 似乎暗示不是这样。如果有帮助的话,我使用 Mailgun 来解决这个问题。不需要 SDK。极其简单的 API。有免费层级可用。我与他们没有关联。 - Jonathan Berger
3
Mailgun并不是针对所提出问题的解决方案。他想要异步发送电子邮件。电子邮件将使用某些SMTP服务器发送,这可以是Mailgun,但需要使用线程/ celery或任何其他解决方案来进行异步发送。 - Muhammad Hassan
2
Celery绝对是仅仅发送电子邮件的杀手锏。这是一种更好的异步处理电子邮件发送的方式。 - Jayesh
1
这个救了我的一天!非常感谢,我一直在苦苦挣扎地使用Celery发送异步电子邮件,但这太棒了! - Mwibutsa Floribert
您也可以从pip中使用它作为应用程序:https://github.com/Jayesh-Mahato/DjangoAsyncMail - Jayesh
显示剩余2条评论

12

从长远来看,使用第三方Django应用程序,例如django-mailer,来处理各种异步电子邮件发送/管理要求可能是一个不错的决定。


我查看了django-mailer,它似乎没有提供任何立即发送电子邮件的功能,例如用于电子邮件验证。 - MrObjectOriented

3

在查阅了基于celery等更复杂的解决方案后,我发现django-post_office (https://github.com/ui/django-post_office)是一个非常简单的数据库+定时任务插件,只需5分钟即可轻松上手。它在我的本地开发机和Heroku上都能完美运行。


2
创建一个名为send_mail.py的新文件,并添加发送邮件的函数。
def send_html_mail (*args,**kwargs):
    
    subject = kwargs.get("subject")
    html_content = kwargs.get("html_content")
    recipient_list = kwargs.get("recipient_list")
    
  
    msg = EmailMultiAlternatives(subject, html_content, EMAIL_HOST_USER, recipient_list)
    msg.attach_alternative(True, "text/html")
    msg.send()

views.py 中调用此函数。

import threading
from send_mail import send_html_mail

def my_view (request):
   
    # .....

    threading.Thread (

        # call to send_html_mail
        target=send_html_mail,

        kwargs={

            "subject":"My super subject",
            "html_content":"My super html content",
            "recipient_list":["to@mail.com"]

            }).start()

    # .....
   



如何在上述方法中添加请求文件。 - user3877214

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接