乐趣区

关于python:Django笔记三十八之发送邮件

这一篇笔记介绍如何在 Django 中发送邮件。

本文首发于微信公众号:【Django 笔记】

在 Python 中,提供了 smtplib 的邮件模块,而 Django 在这个根底上对其进行了封装,咱们能够通过 django.core.mail 来调用。

以下是本篇笔记的目录:

  1. 邮件配置项
  2. send_mail
  3. EmailMessage
  4. 复用邮件发送连贯
  5. 开发阶段调试设置

1、邮件配置项

在正式发送邮件前,咱们须要在 settings.py 里设置几个参数,如下:

# hunter/settings.py

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.163.com'     
EMAIL_PORT = 465   
EMAIL_HOST_USER = 'hunterxxxx04@163.com'  
EMAIL_HOST_PASSWORD = 'JBDMVIXSHYxxxxx' 
EMAIL_USE_SSL = True
EMAIL_USE_TLS = False

这些配置项在 log 日志记录那一篇笔记中有过介绍,那是咱们指定日志等级发送邮件的性能,这里再做一下简略的介绍。

EMAIL_BACKEND 是咱们指定的邮箱后端,在前面咱们会介绍在开发调试阶段的时候能够设置的其余值

EMAIL_HOST 发送邮箱的主机地址,这里咱们应用的是 163 邮箱的地址

EMAIL_PORT EMAIL_HOST 应用的端口

EMAIL_HOST_USER 发件人邮箱地址

EMAIL_HOST_PASSWORD 163 邮箱开启了 SMTP 服务提供的受权码

EMAIL_USE_SSL 与 SMTP 服务器对话时是否应用隐式 TLS 连贯,这种类型被称为 SSL,通常在 465 端口应用,这个字段与 EMAIL_USE_TLS 是相互排挤的,只能设置一个为 True

EMAIL_USE_TLS 与 SMTP 服务器对话是否应用 TLS 连贯,个别在 587 端口

以上就是在 Django 里应用 163 邮箱的一个配置项示例。

2、send_mail

配置好之后咱们就能够尝试发送一下邮件,最简略的应用示例如下:

from django.core.mail import send_mail

send_mail(
    subject="subject 主题",
    message="邮件主体",
    from_email="hunterxx@163.com",
    recipient_list=["120460xxxx@qq.com"],
)

在下面的调用中,subject 是发送的邮件的题目,

message 是邮件发送的注释内容。

from_email 是发送邮件的邮箱

recipient_list 是接管收件人列表,能够接管多个邮箱地址

对于 message 参数,接管的是纯文本信息,会将参数内容间接显示在邮件注释,如果是想对文本进行更多操作,比方加大字体,加粗,或者加上表格等操作,能够应用 html_message 参数来代替 message 参数。

比方:

send_mail(
    subject="subject 主题",
    from_email="hunterxx@163.com",
    recipient_list=["120460xxxx@qq.com"],
    html_message="<h1>html main body</h1>"
)

在这里,html_message 将参数内容当作一个 html 文本进行解析,发送邮件后就能够在接管邮箱看到大号的文本字体了。

发送批量邮件

如果有批量发送邮件的需要,能够应用 send_mass_mail 办法。

from django.core.mail import send_mass_mail

message_1 = ("邮件题目 1", "邮件注释 1", "hunterxxx@163.com", ["120460xxxx@qq.com"])
message_2 = ("邮件题目 2", "邮件注释 2", "hunterxxx4@163.com", ["120460xxx6@qq.com"])
send_mass_mail((message_1, message_2)

该办法接管列表参数,其中列表的每一个元素的参数和参数程序都是固定的,别离是邮件题目,注释,邮件发送人,和邮件接管人列表。

留神: 因为批量发送的参数是固定的,所以并不反对 send_mail 里的 html_message 参数。

3、EmailMessage

后面介绍的 send_mail() 办法简略可用,然而并不反对邮件里的附件、抄送等性能,接下来咱们应用 EmailMessage 这个类来实现这些额定的性能。

以下是应用 EmailMessage 实现发送邮件的简略示例:

from django.core.mail import EmailMessage

email = EmailMessage(
    subject="邮件题目",
    body="邮件主体",
    from_email="hunterxxx@163.com",
    to=["120460xxx@qq.com"],
)
email.send()

参数名称与 send_mail() 略有不同,这里的邮件注释是 body,接管人列表为 to。

这里在实例化 EmailMessage 之后,调用 send() 办法即可发送邮件。

除了下面的这些参数,还有 bcc,实现的是密送性能,也是邮件接管人列表,cc 是抄送人列表。

还有 attachments 参数,实现的是附件性能,接下来介绍几种发送附件的形式:

发送附件

1. attachments 参数

咱们能够间接在 EmailMessage() 中增加附件参数,attachments 参数接管一个列表,列表元素也是一个列表,内层的这个列表接管三个元素,第一个元素为文件名,第二个元素为文件内容,第三个元素为指定的附件的 MIME 类型,第三个参数省略的话就会参考附件的文件名主动抉择。

咱们在零碎根目录下创立两个文件 a.txt,b.txt,而后实现示例如下:

from django.core.mail import EmailMessage

attachments = []
for file_name in ["./a.txt", "./b.txt"]:
    with open(file_name, "r") as f:
        content = f.read()
        attachments.append((file_name, content))


email = EmailMessage(
    subject="邮件题目",
    body="邮件主体",
    from_email="hunterxxxx@163.com",
    to=["120460xxxx@qq.com"],
    attachments=attachments,
)
email.send()
2. attach() 办法

除了间接在 EmailMessage 实例中增加参数,咱们还能够应用 attach() 办法。

示例如下:

email = EmailMessage(
    subject="邮件题目",
    body="邮件主体",
    from_email="hunterxxxx@163.com",
    to=["120460xxxx@qq.com"],
)


file_name_1 = "./a.txt"
f = open(file_name_1, "r")
file_content_1 = f.read()
f.close()


email.attach(file_name_1, file_content_1)
email.send()
3. attach_file() 办法

还有一个形式是应用 attach_file() 办法,参数内容是文件门路 + 文件名,零碎会主动为咱们解析该文件:

email = EmailMessage(
    subject="邮件题目",
    body="邮件主体",
    from_email="hunterxxxx@163.com",
    to=["120460xxx@qq.com"],
)

email.attach_file("./b.txt")
email.send()

EmailMessage 发送 html 注释

后面介绍了在 send_mail() 办法能够通过 html_message 的参数发送 html 页面的邮件,在 EmailMessage 也能够实现,然而须要批改 content_subtype 属性。

默认状况下,EmailMessage.content_subtype 是 “plain”,咱们将其改为 “html” 即可发送 html 页面的邮件。

email = EmailMessage(
    subject="邮件题目",
    body="<h1> 邮件主体 </h1>",
    from_email="hunterxxxx@163.com",
    to=["120460xxx@qq.com"],
)
email.content_subtype = "html"
email.send()

4、复用邮件发送连贯

因为发送邮件波及到网络连接及可能存在的大量数据的传送,比方附件。

所以,如果是在接口中有发送邮件的需要,咱们能够通过 celery 的异步工作实现发送邮件的性能。

而邮件的发送会波及到 SMTP 连贯的创立和敞开,所以复用连贯也是一个好的形式。

这里介绍两种形式:

send_messages

send_messages() 办法接管 EmailMessage 实例列表,而后实现批量发送的性能:

from django.core import mail
from django.core.mail import EmailMessage

email_1 = EmailMessage(
    subject="邮件题目 1",
    body="邮件主体 1",
    from_email="hunterxxxx@163.com",
    to=["120460xxxx@qq.com"],
)
email_2 = EmailMessage(
    subject="邮件题目 2",
    body="邮件主体 2",
    from_email="hunterxxxx@163.com",
    to=["120460xxxx@qq.com"],
)


connection = mail.get_connection()
messages = [email_1, email_2]
connection.send_messages(messages)

手动管制 connection

咱们能够手动管制 connection 的创立和敞开。

from django.core import mail

connection = mail.get_connection()

email_1 = mail.EmailMessage(
    subject="邮件题目 1",
    body="邮件主体 1",
    from_email="hunterxxx@163.com",
    to=["120460xxx@qq.com"],
    connection=connection
)
email_1.send()


email_2 = mail.EmailMessage(
    subject="邮件题目 2",
    body="邮件主体 2",
    from_email="hunterxxxx@163.com",
    to=["120460xxxx@qq.com"],
)


email_3 = mail.EmailMessage(
    subject="邮件题目 3",
    body="邮件主体 3",
    from_email="hunterxxxx@163.com",
    to=["120460xxxx@qq.com"],
)
messages = [email_2, email_3]
connection.send_messages(messages)


connection.close()

在这里,email_1 的调用减少了 connection 参数,email_2 和 email_3 也是应用 connection 进行的批量发送

这个过程中,connection 始终没有敞开,所以复用的是同一个连贯,直到最初调用 close() 才算是手动敞开了这个 connection 连贯。

5、开发阶段调试设置

在开发阶段,咱们调试发送邮件性能的时候,有时候并不想每次都真的发送邮件给指定账户,只管可能是测试账号,咱们有时候只想看一下输入的内容,能够更改邮箱配置的后端

console

咱们能够在 settings.py 里设置:

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

这样,在调用咱们后面的 send 办法后,零碎就不会发送邮件给 to 的接管人列表了,而是会在控制台输入咱们的邮件信息:
相似如下:

Content-Type: text/html; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Subject: =?utf-8?b?6YKu5L2qCH6aKY?=
From: hunterxiong04@163.com
To: 120460xxxx@qq.com
Date: Fri, 17 Feb 2023 18:01:21 -0000
Message-ID: 
 <167665688132.1114.884170460108140763@1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa>


<h1> 邮件主体 </h1>
-------------------------------------------------------------------------------

filebased

在调试阶段,咱们还能够指定将邮件的内容输入到文件,同样的批改邮件后端配置:

EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = './emails_file'

这里设置了邮件后端为文件,EMAIL_FILE_PATH 则是指定了邮件内容放到零碎根目录下的 emails_file 文件中。

调用了发送邮件的函数后,在这个文件夹下就会多出一个文件,文件内容是咱们后面在 console 控制台输入的内容

本文首发于自己微信公众号:Django 笔记

原文链接:Django 笔记三十八之发送邮件

如果想获取更多相干文章,可扫码关注浏览:

退出移动版