Django入门教程

前言

第一章: django快速入门

第二章: django MTV架构

第三章: django视图

第四章: django模板

第五章: django模型

第六章: django后台管理系统

第七章: 项目实战-简易的博客系统

第八章:django表单

第九章:django用户认证系统

第十章:django中的会话

第十一章:django安全

第十二章:django性能优化

第十三章:django实用工具

首页 > Django入门教程 > 第十三章:django实用工具 > 13.2节:发送邮件

13.2节:发送邮件

薯条老师 2020-10-22 07:16:09 234273 0

编辑 收藏

系统地讲解Django开发的基础知识, 高级知识。关注公众号[薯条编程],领取该教程的PDF电子书:《Python web开发-Django从入门到项目实战》。

13.1.1 基于SMTP的邮件处理

在网络中向另一台计算机发送电子邮件,本质是网络中的计算机进行相互间的数据通信。让网络中的计算机实现通信,必须有一套通信协议, 协议约定了通信的数据格式,以及数据的交换方式。SMTP就是这样的一种数据通信协议。SMTP全称为Simple Mail Transfer Protocol,翻译过来,即为简单邮件传输协议,用于系统之间的邮件信息传递。

13.1.2 SMTP服务器的配置

邮件发送的逻辑很简单,先发送邮件至SMTP服务器,再由SMTP服务器进行中转。比如A发送邮件给B,那么邮件会先投递到SMTP服务器,SMTP服务器收到邮件以后,再将邮件转发给B。在django中发送邮件,需要先配置SMTP服务器。

这里的服务器配置是指,在项目的settings.py中配置SMTP服务器的主机,端口,用户名,密码等信息。

SMTP的主要配置:

配置变量

 

描述

EMAIL_HOST

SMTP服务器主机,默认为localhost

EMAIL_PORT

 

SMTP服务器端口,默认为25

EMAIL_HOST_USER

SMTP 服务器的登录名

EMAIL_HOST_PASSWORD

SMTP 服务器的登录密码

EMAIL_USE_TLS

是否使用TLS安全连接

EMAIL_USE_SSL

是否使用SSL安全连接。

对于SMTP服务器,我们可以使用邮件服务商所提供的邮件服务器,比如腾讯企业邮箱,网易的163邮箱等。现以腾讯企业邮箱为例,来演示如何进行SMTP服务器的配置。打开项目中的settings.py,并进行如下配置:

# 配置服务器主机,以下为腾讯企业邮箱的主机名
EMAIL_HOST = 'smtp.exmail.qq.com'
# 配置服务器端口,腾讯企业邮箱普通端口为25,如果使用SSL,端口号为465或587
EMAIL_PORT= 587
 
# 配置登录名,登录名即邮箱账号
EMAIL_HOST_USER = 'django@chipscoco.com'
# 配置登录密码,你邮箱的登录密码
EMAIL_HOST_PASSWORD = 'your_password'
 
EMAIL_USE_TLS = True

SMTP服务器进行配置以后,再导入django的内置模块django.core.mail来进行邮件的发送。

13.1.3 django.core.mail

(1) send_mail与send_mass_mail

django.core.mail的两个常用方法:send_mail(),send_mass_mail()。这两个方法都用来发送邮件,send_mass_mail与send_mail的主要区别在于:send_mail在每次与SMTP服务器的连接中,只投递一封邮件,而send_mass_mail可以同时投递多封邮件。

send_mail方法的常用参数:

参数名

 

描述

subject

字符串类型,表示邮件主题

message

 

字符串类型,表示邮件内容

from_email

字符串类型,表示发送方的邮箱账号

recipient_list

字符串列表,列表中的每一个字符串表示一个收件人的邮箱

html_message

如果传递了该参数,那么发出的邮件是一个 multipart/alternative类型的邮件。multipart/alternative类型表示纯文本与超文本共存。html就是一种超文本格式。

fail_silently

布尔类型,用来指定是否忽略smtplib.SMTPException的异常信息。True表示忽略异常信息,False表示会抛出异常信息。

send_mass_mail方法的常用参数:

参数名

 

描述

datatuple

二维元祖,(message, message...)。message的格式:(subject, message, from_email, recipient_list)。message中的参数同send_mail方法中的参数。

fail_silently

 

同send_mail方法中的参数fail_silently

django发送邮件的代码实例:

# 分别导入send_mail,send_mass_mail方法
from django.core.mail import send_mail,send_mass_mail
 
# 直接通过send_mail发送邮件
send_mail(
    # 邮件主题
    'Subject here',
    
    # 邮件内容
    'Here is the message.',
    
    # 邮件的发送方
    'django@chipscoco.com',
    
    # 可以在recipient_list列表中添加多个收件人
    ['haokaixin@chipscoco.com'],
    
    # 如果发送出错,则抛出异常信息
    fail_silently=False,
)
 
# message中的参数同send_mail方法中的参数
message1 = ('Subject here', 'Here is the message', 'happy@chipscoco.com', ['lohan@chipscoco.com', 'kitty@chipscoco.com'])
message2 = ('Another Subject', 'Here is another message', 'happy@example.com', ['Selina@chipscoco.com'])
 
# 通过send_mass_mail来发送多封邮件
send_mass_mail((message1, message2), fail_silently=False)

如果想要在邮件中发送html以及附件,可以通过EmailMultiAlternatives来实现这样的功能。

 (2) EmailMultiAlternatives

EmailMultiAlternatives是一个类类型,继承于EmailMessage类,通常我们使用EmailMultiAlternatives来发送html以及附件。EmailMultiAlternatives类型的主要构造参数:

参数名

 

描述

subject

邮件主题

body

 

邮件内容

from_email

发送方的邮箱

to

收件人列表

bcc

抄送列表

reply_to

“回复”标题中使用的收件人列表

headers

协议头,字典类型,可以在headers自定义消息字段

EmailMultiAlternatives对象的常用方法:

attach(filename=None, content=None,mimetype=None)

filename表示文件名,content参数用来传递文件的内容,mimetype表示mime类型。

常见的mime类型有text/plain,表示纯文本;text/html表示超文本,image/png,image/gif,image/jpeg则分别表示png格式,gif格式,jpeg格式的图片。

attach_file(path, mimetype=None)

参数path表示附件的文件路径,mimetype表示mime类型。

attach_alternative(content, mimetype)

参数content表示邮件内容,mimetype表示mime类型,通常使用 attach_alternative方法来发送html格式的邮件。

send(fail_silently=False)

执行send方法发送邮件。以下是通过EmailMultiAlternatives发送html及图片附件的代码实例:

# __desc__ = 通过 EmailMultiAlternatives来发送附件及html
 
# 导入EmailMultiAlternatives
from django.core.mail import EmailMultiAlternatives
 
# 发送html
subject, from_email, to = '你好', 'django@chipscoco.com', 'haokaixin@chipscoco.com'
text_content = '欢迎关注薯条编程'
html_content = '<p>关注微信公众号<strong>薯条编程</strong>,系统学习django</p>'
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
 
# 添加图片附件
msg.attach_file(os.path.join('images','chipscoco.png'),'image/png')
 
# 发送邮件
msg.send()

关注微信公众号:薯条编程,公众号后台回复"Python资料",免费领取Python电子书,以及学习Python视频课程。

小班授课,薯条老师一对一教学,火热报名中,点击了解线下就业培训。


欢迎 发表评论: