购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.13 发送邮件实战

SMTP是一种简单的邮件传输协议、Python默认支持SMTP。使用SMTP可以构造纯文本的邮件和带附件的邮件。SMTP提供smtplib和email两个主要模块,其中smtplib负责发送邮件,email负责构造邮件。本节进行SMTP邮件发送实战。

2.13.1 纯文本的邮件实战

以QQ邮箱为例,首先设置QQ邮箱授权码。进入邮箱,单击“设置”→“账户”选项,开启POP3/SMTP服务。默认是关闭状态,单击“开启”按钮即可,如图2.39所示。

070-01.jpg

图2.39 POP3/SMTP服务设置界面

开启后,需要配置邮件客户端。编辑短信“配置邮箱客户端”到号码“1069 0700 69”,如图2.40所示。

070-02.jpg

图2.40 配置邮件客户端界面

发送信息完成,单击“我已发送”按钮,会出现如图2.41所示的界面。

070-03.jpg

图2.41 授权码生成界面

示例如下:

import smtplib               # 调用SMTP发件服务
from email.mime.text import MIMEText  # 导入做纯文本的邮件模板类
smtpsever = 'smtp.qq.com'         # QQ邮箱服务器
sender = 'qq邮箱账号@qq.com'      # 发送者邮箱
psw = "hcygozfxeassddhhb"         # 配置邮箱客户端生成的QQ邮箱授权码
receiver = '126邮箱账号@126.com'  # 接收者邮箱
port = 465                        # QQ邮箱服务器默认端口号

配置发送参数,如连接邮箱服务器,授权码,定义接收者、发送者邮箱账号和端口等。

msg = MIMEText(body,'html','utf-8')   # 邮件正文内容
msg['from'] = qq邮箱账号@qq.com'           # 发送者账号
msg['to'] = '126邮箱账号@qq.com'           # 接收者账号
msg['subject'] = "这个是纯文本发送的邮件示例"

编写正文内容到邮件中。

smtp = smtplib.SMTP_SSL(smtpsever,port)    # 调用发件服务
smtp.login(sender,psw)                           # 通过发送者的邮箱账号和授权码登录邮箱
smtp.sendmail(sender,receiver,msg.as_string())   # 发送邮件,信息以字符串方式保存
smtp.quit()                                      # 关闭邮件服务

QQ邮箱的SMTP服务在登录时使用授权码登录,登录采用SSL方式,最后关闭服务。邮件发送界面如图2.42所示。

071-01.jpg

图2.42 邮件发送界面

2.13.2 带附件的邮件实战

以QQ邮箱为例,向126邮箱发送带附件的邮件,这里需要用到MIMEMultipart类,示例如下:

import smtplib
from email.mime.text import MIMEText         # 导入做纯文本的邮件模板类
from email.mime.multipart import MIMEMultipart  # 导入MIMEMultipart类
# 发邮件相关参数
smtpsever = 'smtp.qq.com'      # QQ邮箱服务器
sender = '239xxxxx@qq.com'     # 发送者邮箱
psw = "xxxxxxxxxxxxxxxx"       # QQ邮箱授权码
receiver = 'xxxxx@126.com'     # 接收者邮箱账号
port = 465                     # QQ邮箱服务器默认端口号

定义发送邮件的相关参数设置。

filepath = r"./readme.txt"       # 编辑邮件的内容
with open(filepath,'rb') as fp:    # 读文件
    mail_body=fp.read()

open()方法用于打开readme.txt,并以read()方法读取所有内容。

# 主题
msg = MIMEMultipart()
msg["from"] = sender
msg["to"] = receiver
msg["subject"] = "带附件的邮件发送模板主题"

MIMEMultipart()方法表示构造的邮件由多个部分组成。

body = MIMEText(mail_body,"html","utf-8")
msg.attach(body)
att = MIMEText(mail_body,"base64","utf-8")
att["Content-Type"] = "application/octet-stream"
att["Content-Disposition"] = 'attachment;filename="test_report.xhtml"'
msg.attach(att)

application/octet-stream表明返回的是一个二进制的文件,客户端收到这个声明后,会根据文件扩展名来判断。test_report.html是以.html结尾的文件名。

try:
    smtp = smtplib.SMTP()
    smtp.connect(smtpsever)     # 连接QQ邮箱服务器
    smtp.login(sender,psw)     # 调用发件服务
except:
    smtp = smtplib.SMTP_SSL(smtpsever,port)
    smtp.login(sender,psw)     # 登录邮箱
smtp.sendmail(sender,receiver,msg.as_string())  # 发送邮件
smtp.quit()

查看生成的带附件的邮件,如图2.43所示。

072-01.jpg

图2.43 带附件的邮件界面

2.13.3 yagmail发送邮件实战

yagmail发送邮件相对SMTP服务更为简单和便捷。yagmail是Python的一个第三方库。使用前先安装yagmail模块,使用在线安装方式,通过pip命令安装。打开cmd命令提示符界面,输入“pip install yagmail”,如下所示表示安装成功:

C:\Users\23939>pip install yagmail
Collecting yagmail
  Usingcached https://files.pythonhosted.org/packages/bf/2e/66af8d975/yagmail-
0.11.214-py2.py3-none-any.whl
Installing collected packages: yagmail
Successfully installed yagmail-0.11.214

1. 使用yagmail发送带正文的邮件

示例如下:

import yagmail  # 导入yagmail模块
# 链接邮箱服务器
yagindex = yagmail.SMTP(user="xxxxxx@qq.com",password="qq邮箱授权码",
                          host='smtp.qq.com')
Yag_contents = ['这是一个yagmail发送邮件正文的实例']    # 邮箱正文
yagindex.send('xxxxxx@126.com','Yagmail主题实例',Yag_contents)    # 给单个接收者发送邮件

如果给多个接收者发送邮件,可以使用列表存储多个接收人。

# 给多个接收者发送邮件
yagindex.send(['aa@126.com','bb@qq.com','cc@gmail.com'],'subject',Yag_contents) 

导入yagmail模块,yagmail调用SMTP服务。定义发送者账号信息、客户端授权码,以及服务器的主机地址和邮件正文。最后调用send()方法发送给接收人,并传入邮件主题和内容。发送成功后,如图2.44所示。

073-01.jpg

图2.44 邮件正文内容界面

2. 使用yagmail发送带附件的邮件

示例如下:

import yagmail  # 导入yagmail模块
# 链接邮箱服务器
yagindex = yagmail.SMTP(user="xxxxxx@qq.com",password="qq邮箱授权码",host='smtp.qq.com')
# 邮箱正文
Yag_contents = ['这是一个yagmail发送邮件正文的实例']

查看发送结果:

# 发送带附件的邮件
yagindex.send('xxxxxx@126.com','Yagmail发送带附件主题',Yag_contents,["E://cnblogs.png"])

注意:如果发送多个附件,在列表内追加其他附件的所在路径即可。发送完成后,如图2.45所示。

074-01.jpg

图2.45 邮件中的附件界面 g1wVwGckRgvpChL+4MUgJuRYsKy+J6OJQdE/Dnip4uF9izr4s5IdYs42mq639p1I

点击中间区域
呼出菜单
上一章
目录
下一章
×