首页 生活 资讯 社会 财经 国内 国际 金融 理财 科技 文化 旅游 图片 教育
首页 > 综合 > 正文

Django笔记三十八之发送邮件|当前时讯

2023-05-08 21:43:39 博客园

本文首发于公众号:Hunter后端

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

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


(资料图)

在 Python 中,提供了 smtplib 的邮件模块,而 Django 在这个基础上对其进行了封装,我们可以通过 django.core.mail来调用。

以下是本篇笔记的目录:

邮件配置项send_mailEmailMessage复用邮件发送连接开发阶段调试设置1、邮件配置项

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

# hunter/settings.pyEMAIL_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 = TrueEMAIL_USE_TLS = False

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

EMAIL_BACKEND是我们指定的邮箱后端,在后面我们会介绍在开发调试阶段的时候可以设置的其他值

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

EMAIL_PORTEMAIL_HOST 使用的端口

EMAIL_HOST_USER发件人邮箱地址

EMAIL_HOST_PASSWORD163 邮箱开启了 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_mailsend_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="

html main body

")

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

发送批量邮件

如果有批量发送邮件的需求,可以使用 send_mass_mail方法。

from django.core.mail import send_mass_mailmessage_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 EmailMessageemail = 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 EmailMessageattachments = []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="

邮件主体

", 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 mailfrom django.core.mail import EmailMessageemail_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 mailconnection = 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.0Content-Transfer-Encoding: 8bitSubject: =?utf-8?b?6YKu5L2qCH6aKY?=From: hunterxiong04@163.comTo: 120460xxxx@qq.comDate: Fri, 17 Feb 2023 18:01:21 -0000Message-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>

邮件主体

-------------------------------------------------------------------------------
filebased

在调试阶段,我们还可以指定将邮件的内容输出到文件,同样的修改邮件后端配置:

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

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

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

如果想获取更多后端相关文章,可扫码关注阅读:

标签:

最新推荐

Django笔记三十八之发送邮件|当前时讯
山东赫达:2023年一季度建材级纤维素醚销量同比增长15%左右|环球观热点
茂名石化博贺港储运有限公司_关于茂名石化博贺港储运有限公司的简介-全球视讯
ITP HOLDINGS(08446)发行1315.79万股认购股份
空间站再传喜讯!我国首次在轨对导电环磨屑产生过程和团簇现象实现观测
日乒四美出现,对陈梦的挑战增加,国乒以不变应万变 环球热点评
汉森制药:碘海醇注射液通过仿制药一致性评价 今日热议
世界视讯!新乡市举行第八期“三个一批”项目建设活动
吕梁回应“民办博物馆称馆长被区长辱骂,推倒致伤”:正核实 环球热门
世界要闻:小摩减持招商银行(03968)约1767.77万股 每股作价约37.94港元
徐克版《射雕英雄传》官宣,肖战将出演郭靖|环球播报
仅三成百强房企还在拿地,土拍热度依赖市场回暖_环球今热点
全球讯息:w:这颗土豆就是伊内丝的头!明日方舟沙雕漫画
高颜值、创新核,长三角示范区描绘“最江南”生态画卷
2023年中考是哪一天 2023年中考改革内容
全球速讯:火车上被持刀杀害男子表哥发声:凶手有前科,工作人员错过抢救时机
ST德豪:公司将根据生产经营情况及市场情况制定整体战略规划,目前公司未开展人工智能业务
工业和信息化部、商务部组织开展今年“三品”全国行活动
每日热闻!交易异动!中钢国际:近3个交易日上涨24.94% 无未披露的重大信息
世界微速讯:中经资料:巴基斯坦证券市场一周回顾(2023.5.1-5.5)
观光型家庭农场的“职业经理人”,都要做些啥?_观点
麦克奥迪(300341)5月8日主力资金净买入1619.99万元 每日热门
【天天热闻】魅劫_关于魅劫简述
消息称华为计划推出MatePad Mini,定位中高端旗舰
赵长富、邱金、董雪峰、李超等被点名,辽宁通报9起破坏营商环境案例
22年天津退休养老金调整最新消息 2023年天津养老金上调公布了吗
警惕!孩子有这些表现可能是哮喘 全球微速讯
投资基金在高位被套了该怎么办?买基金被套住怎么办
银行卡挂失后会自动注销吗?银行卡挂失就是作废了吗
空换期货是什么意思?期货空换多换什么意思

豫狐网络 版权所有

声明:未经授权禁止建立镜像!转载、摘编、复制请注明文章出处!

京ICP备2022016840号-38

联系我们:920 891 263 @qq.com