how to send asynchronous email using django

Question:

This is my code:

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()

It doesn’t send email. What can I do?

Asked By: zjm1126

||

Answers:

it is ok now ;

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()
Answered By: zjm1126

In the long run, it may prove to be a good decision to use a third-party Django application, such as django-mailer, to handle all sorts of asynchronous email sending/management requirements.

Answered By: ayaz

After checking out more complex solutions based around celery, etc. I found django-post_office (https://github.com/ui/django-post_office) It’s a very simple database + cron job plugin that took 5 mins to get up and running. Works perfectly on both my local dev machine and Heroku.

Answered By: user2916527

create new file named send_mail.py and add
the function to send the mail

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()

call a this function in the 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":["[email protected]"]

            }).start()

    # .....
   


Answered By: Raul Cobiellas
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.