系统地讲解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 | 字符串类型,表示发送方的邮箱账号 |
字符串列表,列表中的每一个字符串表示一个收件人的邮箱 | |
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来实现这样的功能。
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视频课程。