尽管Python提供smtplib 模块用于发送电子邮件,但Django在其上也提供了几个封装。源码:django.core.mail

这里我们使用其中的EmailMessage类来发送邮件,用模板来渲染HTML页面,并使用Python中的threading模块来完成多线程发送,这样在发邮件的时候并不会阻塞程序执行。

1. 代码

from django.core.mail import EmailMultiAlternatives
from django.template import loader
import threading

def send_email(to):
    '''
    异步发送邮件
    通过模板加载HTML正文

    :param to: 发送到地址列表
    '''
    subject = '这里是邮件主题'
    content = loader.render_to_string(      #渲染HTML模板
             '../templates/email.html',     #模板文件
             {
                'params': params,           #需要传入模板的参数
             }
       )
    from_email = '发件人Email'

    def send(*args, **kwargs):
        msg = EmailMultiAlternatives(*args, **kwargs)
        msg.content_subtype = "html"
        msg.send()
    threading.Thread(target=send,args=(subject, content, from_email, to)).start()

2. EmailMessage类

初始化参数:

  • subject:电子邮件的主题行。
  • body:正文。
  • from_email:发件人的地址。如果省略,则使用setting.DEFAULT_FROM_EMAIL
  • to:收件人地址的列表或元组。
  • bcc:发送电子邮件时在“密件抄送”标题中使用的地址列表或元组。
  • connection:电子邮件后端实例。如果要对多个消息使用相同的连接,请使用此参数。如果省略,send()调用时会创建一个新的连接。
  • attachments:放在消息上的附件列表。这些可以是email.MIMEBase.MIMEBase实例,也可以是三元组。(filename, content, mimetype)
  • headers:放置邮件的额外标题的字典。键是标题名,值是标题值。呼叫者必须确保邮件头名称和值是正确的电子邮件格式。相应的属性是extra_headers。
  • cc:发送电子邮件时在“Cc”头中使用的收件人地址的列表或元组。
  • reply_to:发送电子邮件时在“回复”标题中使用的收件人地址的列表或元组。

3. threading 模块 [1]

Thread 是threading模块中最重要的类之一,可以使用它来方便地创建线程。

param = '传入参数'
def send(param):
    print(param)
t = threading.Thread(target=send,args=(param,))
t.start()
  1. https://docs.python.org/3/library/threading.html "threading 模块文档 Python3"