zl程序教程

您现在的位置是:首页 >  后端

当前栏目

六、Python3自动化运维——电子邮件 smtplib模块

2023-09-11 14:16:24 时间

上一节要注意的点:
re.sub 第一个参数是指匹配的正则表达式。第二个参数是指匹配到的要换成什么,第三个参数是原字符串
destination_dir = re.sub(dir1,dir2,item)

功能简介

简介
信息交流的一种主要方式
通知的内容比较全面
模块
smtplib
组成:
smtp客户端 - python模块模拟的
smtp服务端 - 互联网上的邮件服务器
要点
在定制客户端的时候,需要与服务端进行信息的交流认证
- - 传统的方式: 用户名和密码
- - 现在的方式: 用户名和授权码

模块解析

常见的类
smtplib.SMTP(…)
模块作用:
创建SMTP客户端服务,与SMTP服务端连接
参数解析:
host 指的是smtp邮件服务器
port 指的是连接smtp服务器的端口号,默认是25号端口
常见方法
配置连接smtp服务器的地址信息
SMTP.connect(host,port)
设定远程连接smtp服务器的登录信息
SMTO.login(登录用户名,登录授权码)
设定发送邮件的内容
SMTP.sendmail(发送人列表,收件人列表,邮件内容,其他参数)
启动安全传输模式
SMTP.starttls(基本认证文件)
断开smtp服务器
SMTP.quit()
操作步骤
1 创建SMTP对象
2 配置连接信息
3 设定登录信息
4 设定邮件内容信息
5 断开连接

简单实践

准备工作-邮箱、登录用户名、登录授权码、smtp服务器地址:smtp.163.com、smtp服务器端口:25
	开启服务:

在这里插入图片描述
新增授权码:
注意: 授权码只显示一次,所以需要自己保存,授权码是需要通过短信的方式来进行申请的。
在这里插入图片描述
这是我们用到的smtp服务器地址
在这里插入图片描述
代码执行常见问题:
在这里插入图片描述
问题1 - python3没有String的join方法
解决方法:内容.join()
在这里插入图片描述
问题2 - 邮件发送方式
解决方法: 注释这一句

# server.starttls()

问题3 - 内容编码问题
在这里插入图片描述
解决方法:

不同ascii编码方式,改为utf-8

问题4 - 554 ,代表内容格式不对
在这里插入图片描述
解决方法:
1 定制标准的内容格式
From、To、Subject、空行、内容
2 定制标准的信息格式
信息的列表样式

# 导包
import smtplib
import string

# 0 基本信息定制
HOST = "smtp.163.com"
PORT = "25"
# 登录用户名
USER = "m******@163.com"
# 登录授权码
# AUTH_PASSWD = "JYY*********TUGH"
AUTH_PASSWD = "********"
FORM_LIST = "m******@163.com"
RECEIVE_LIST = "m******@163.com"

# 定制message的细节信息
# 标题
SUBJECT = "Python 邮件发送练习"
# 内容
TEXT = "这是我们测试的内容,请检查"
# MESSAGE_CONTENT = "\n".join((
#     "From:{},"
#     "To:{},"
#     "Subject:{},"
#     "发送内容:{},"
#     "\r\n"
# ).format(FORM_LIST,RECEIVE_LIST,SUBJECT,TEXT)).encode('utf-8')

MESSAGE_CONTENT = "\n".join([
    "From:{},".format(FORM_LIST),
    "To:{},".format(RECEIVE_LIST),
    "Subject:{},".format(SUBJECT),
    "",
    TEXT
])

# 1 创建SMTP对象
server = smtplib.SMTP()
# 2 配置连接信息
server.connect(HOST,PORT)
# server.starttls()
# 3 设定登录信息
server.login(USER,AUTH_PASSWD)
# 4 设定邮件内容
server.sendmail(FORM_LIST,RECEIVE_LIST,MESSAGE_CONTENT.encode("utf-8"))
# 5 断开连接
server.quit()

在这里插入图片描述

进阶实践

需求
学习 加密方式 传递数据信息

注意事项
1 基本配置
smtp服务器地址:smtp.163.com
smtp服务器端口: 465 (可以百度查,smtp.163.com tls 对外端口)
2 对象创建
smtplib.SMTP_SSL()
3 连接配置
创建对象的时候,直接配置连接地址,没有之前的connect方法

实践代码

# 导包
import smtplib
import string

# 0 基本信息定制
HOST = "smtp.163.com"
PORT = "465"
# 登录用户名
USER = "m18300663653@163.com"
# 登录授权码
AUTH_PASSWD = "WIMFZNENOXZMAOVQ"
FORM_LIST = "m18300663653@163.com"
RECEIVE_LIST = "m18300663653@163.com"

# 定制message的细节信息
# 标题
SUBJECT = "Python 邮件发送练习"
# 内容
TEXT = "这是我们测试-TLS 的内容,请检查"

MESSAGE_CONTENT = "\n".join([
    "From:{},".format(FORM_LIST),
    "To:{},".format(RECEIVE_LIST),
    "Subject:{},".format(SUBJECT),
    "",
    TEXT
])

# 1 创建SMTP对象
server = smtplib.SMTP_SSL(HOST,PORT)
# 2 配置连接信息
# server.connect(HOST,PORT)
# server.starttls()
# 3 设定登录信息
server.login(USER,AUTH_PASSWD)
# 4 设定邮件内容
server.sendmail(FORM_LIST,RECEIVE_LIST,MESSAGE_CONTENT.encode("utf-8"))
# 5 断开连接
server.quit()

在这里插入图片描述

定制格式

基础知识

需求
默认的邮件发送机制比较简单,内容和风格不太满足我们的需求
– 自定义邮件风格内容
结局思路
MIME - - 多用途互联网邮件扩展
目的: 传递数据的时候携带MIME的属性信息,然后浏览器在加载的时候,会根据属性信息,以针对性的样式进行加载和渲染。
常见样式:
MIMEMultipart 多资源体数据
MIMEAudio 音频数据
MIMEImage 图像数据
MIMEText 文本数据
请求属性:
Content_type

简单实践

基本格式:
每个MIME类型由两部分组成,
前面是数据的大类别,例如声音audio、图像image等,后面定义具体的种类样式:
text/html
text/plain
application/pdf
application/json ******

附加方式:
MIME信息头根据在邮件包中的位置,大体上分为MIME信息头和MIME段投
MIME信息头有:
Content-Type:
它定义了数据的类型,以便数据能被适当的处理。有效的类型由:text,image,
audio,video,applications,multipart和message。
在这里插入图片描述
在这里插入图片描述
就是告诉浏览器,以哪种样式来进行渲染

常见格式

功能简介

smtplib - 发送邮件用的
email - 邮件主体的使用(一般是扩展格式的属性解析使用)
关联:
smtplib中的sendmail已经包含了基本的email格式
email可以作为扩展的样式进行 组合使用
- 主要是MIME模块的子模块的使用
- 可以在sendmail 的基础上,扩展出html、附件、音频、图像等格式

报表格式

功能简介

通过email.mime.text导入MIMEText 类 实现 原有html格式的扩展

关键点
邮件内容的发送格式上
邮件内容 - - MIMEText对象(“html页面内容”,“html”,“utf-8”)
发件人 - - MIMEText对象['‘From"]
收件人 - - MIMEText对象[’‘To"]
主题 - - MIMEText对象[’'Subject"]
发送的内容是字符串
不用encode(‘utf-8’),而是使用as_string()

smtplib发送邮件的流程基本不变

简单实践

创建一个HTML,复制table标签的内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<table width="800",border="0",cellspacing="0",cellpading="4">
    <tr>
        <td bgcolor="#CECEFAD" height="20" style="font-size: 14px">**官网数据**<a href="www.baidu.com">更多</a></td>
    </tr>
    <tr>
        <td bgcolor="#CECEFAD" height="100" style="font-size: 13px">1)日访问量:152433 访问次数:23651 页面访问量:3432<br>
            2)状态码信息<br>
            &nbsp;&nbsp;500<br>
            3)访客浏览信息<br>
            &nbsp;&nbsp;yioljfjrnfnrnsfiuendf <br>
            2)页面信息<br>
            &nbsp;&nbsp;/index.html<br>
            &nbsp;&nbsp;/index.php<br>
            &nbsp;&nbsp;/login.html<br>
        </td>
    </tr>
</table>
</body>
</html>

邮件发送-报表样式,python代码

# 导包
import smtplib
from email.mime.text import MIMEText

# 0 基本信息定制
HOST = "smtp.163.com"
PORT = "465"
# 登录用户名
USER = "m18300663653@163.com"
# 登录授权码
# AUTH_PASSWD = "JYYVKIXQRHYCTUGH"
AUTH_PASSWD = "WIMFZNENOXZMAOVQ"
FORM_LIST = "m18300663653@163.com"
RECEIVE_LIST = "m18300663653@163.com"

# 定制message的细节信息
# 标题
SUBJECT = "Python 邮件发送练习TLS"
# 内容
TEXT = "这部分我们自己使用MIMEText 开始定制"

MESSAGE_CONTENT = MIMEText("""<table width="800",border="0",cellspacing="0",cellpading="4">
    <tr>
        <td bgcolor="#CECEFAD" height="20" style="font-size: 14px">**官网数据**<a href="www.baidu.com">更多</a></td>
    </tr>
    <tr>
        <td bgcolor="#CECEFAD" height="100" style="font-size: 13px">1)日访问量:152433 访问次数:23651 页面访问量:3432<br>
            2)状态码信息<br>
            &nbsp;&nbsp;500<br>
            3)访客浏览信息<br>
            &nbsp;&nbsp;yioljfjrnfnrnsfiuendf <br>
            2)页面信息<br>
            &nbsp;&nbsp;/index.html<br>
            &nbsp;&nbsp;/index.php<br>
            &nbsp;&nbsp;/login.html<br>
        </td>
    </tr>
</table>""","html","utf-8")
MESSAGE_CONTENT['From'] = FORM_LIST
MESSAGE_CONTENT['To'] = RECEIVE_LIST
MESSAGE_CONTENT['Subject'] = SUBJECT



server = smtplib.SMTP_SSL(HOST,PORT)
server.login(USER,AUTH_PASSWD)
server.sendmail(FORM_LIST,RECEIVE_LIST,MESSAGE_CONTENT.as_string())
server.quit()

结果:
在这里插入图片描述
把table部分换成表格的html代码就是表格样式。

图文格式

功能简介

通过email.mime导入MIMEText 类及MIMEImage类 实现 组合使用
但是组合使用又依赖于:
	MIMEMultipart类的使用

关键点
邮件内容的发送格式上
1 MIMEText的内容定制
2 嵌入方式增加图片
3 专用的增加图片方式

smtplib发送邮件的流程基本不变
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实践思路
1 准备图片
2 定制格式
3 定制图片方法
4 定制页面内容
5 增加图片内容
6 综合测试

简单实践

代码:

# 导包
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
# 0 基本信息定制
HOST = "smtp.163.com"
PORT = "465"
# 登录用户名
USER = "m18300663653@163.com"
# 登录授权码
# AUTH_PASSWD = "JYYVKIXQRHYCTUGH"
AUTH_PASSWD = "WIMFZNENOXZMAOVQ"
FORM_LIST = "m18300663653@163.com"
RECEIVE_LIST = "m18300663653@163.com"

# 定制message的细节信息
# 标题
SUBJECT = "Python 邮件发送练习 - 图片定制"
# 内容
TEXT = "这部分我们自己使用MIMEText 开始定制"

### 图片定制方法
def addimg(src,imgid):
    # 读取图片,然后创建MIMEImage对象
    with open(src,'rb') as f:
        msgImage = MIMEImage(f.read())
    # 为图片对象增加头信息
    msgImage.add_header('Content-ID',imgid)
    # 由于需要加载该图片对象到页面中,所以必须返回
    return msgImage

# 为了保证内容可以嵌套其他功能,必须更改msg的类型
msg = MIMEMultipart('related')



# 邮件内容格式改造
MESSAGE_CONTENT = MIMEText("""<table width="600",border="0",cellspacing="0",cellpading="4">
    <tr>
        <td bgcolor="#CECEFAD" height="20" style="font-size: 14px">**官网性能数据**<a href="www.baidu.com">更多</a></td>
    </tr>
    <tr bgcolor="#EFEBDE" height="100" style="font-size: 13px">
        <td><img src="cid:cpu"></td>
        <td><img src="cid:disk"></td>
    </tr>
    <tr bgcolor="#EFEBDE" height="100" style="font-size: 13px">
        <td><img src="cid:mem"></td>
    </tr>
</table>""","html","utf-8")
# 为txt内容附加图片数据
msg.attach(MESSAGE_CONTENT)
msg.attach(addimg("img/cpu.png",'cpu'))
msg.attach(addimg("img/disk.png",'disk'))
msg.attach(addimg("img/mem.png",'mem'))

msg['From'] = FORM_LIST
msg['To'] = RECEIVE_LIST
msg['Subject'] = SUBJECT

server = smtplib.SMTP_SSL(HOST,PORT)
server.login(USER,AUTH_PASSWD)
# 由于我们将原来的HTML内容封装到msg里了,所以使用msg,不再使用MESSAGE_CONTENT
server.sendmail(FORM_LIST,RECEIVE_LIST,msg.as_string())
server.quit()

结果
在这里插入图片描述

附件格式

简介
在图文样式的基础上,增加了一个附件的添加功能
模块
MIMEText类型定义一个Content-Disposition属性
关键点
1 图文样式的基础上进行的操作
2 附加对象的定制
3 添加附加文件

在这里插入图片描述
实践步骤
1 准备附件文件
2 定制附件对象
3 增加附件对象
4 查看效果

简单实践

# 导包
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
# 0 基本信息定制
HOST = "smtp.163.com"
PORT = "465"
# 登录用户名
USER = "m18300663653@163.com"
# 登录授权码
# AUTH_PASSWD = "JYYVKIXQRHYCTUGH"
AUTH_PASSWD = "WIMFZNENOXZMAOVQ"
FORM_LIST = "m18300663653@163.com"
RECEIVE_LIST = "m18300663653@163.com"

# 定制message的细节信息
# 标题
SUBJECT = "Python 邮件发送练习 - 附件"
# 内容

### 图片定制方法
def addimg(src,imgid):
    with open(src,'rb') as f:
        msgImage = MIMEImage(f.read())
    msgImage.add_header('Content-ID',imgid)
    return msgImage

# 为了保证内容可以嵌套其他功能,必须更改msg的类型
msg = MIMEMultipart('related')

# 邮件内容格式改造
MESSAGE_CONTENT = MIMEText("""<table width="600",border="0",cellspacing="0",cellpading="4">
    <tr>
        <td bgcolor="#CECEFAD" height="20" style="font-size: 14px">**官网性能数据**<a href="www.baidu.com">更多</a></td>
    </tr>
    <tr bgcolor="#EFEBDE" height="100" style="font-size: 13px">
        <td><img src="cid:cpu"></td>
    </tr>
</table>""","html","utf-8")
# 为txt内容附加图片数据
msg.attach(MESSAGE_CONTENT)
msg.attach(addimg('img/cpu.png','cpu'))

# 1 创建附件对象
attach = MIMEText(open("doc/杀毒结果对比.xlsx", 'rb').read(), "base64", "utf-8")
attach['Content-Type'] = "application/octet-stream"
# 这种写法,可以防止出现中文的乱码
attach.add_header('Content-Disposition', 'attachment', filename=('gbk', '', '对比.xlsx'))

# 2 附加附件对象
msg.attach(attach)

msg['From'] = FORM_LIST
msg['To'] = RECEIVE_LIST
msg['Subject'] = SUBJECT

server = smtplib.SMTP_SSL(HOST,PORT)
server.login(USER,AUTH_PASSWD)
# 由于我们将原来的HTML内容封装到msg里了,所以使用msg,不再使用MESSAGE_CONTENT
server.sendmail(FORM_LIST,RECEIVE_LIST,msg.as_string())
server.quit()

结果
在这里插入图片描述

批量添加附件

代码

# 导包
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
import os
# 0 基本信息定制
HOST = "smtp.163.com"
PORT = "465"
# 登录用户名
USER = "m18300663653@163.com"
# 登录授权码
# AUTH_PASSWD = "JYYVKIXQRHYCTUGH"
AUTH_PASSWD = "WIMFZNENOXZMAOVQ"
FORM_LIST = "m18300663653@163.com"
RECEIVE_LIST = "m18300663653@163.com"

# 定制message的细节信息
# 标题
SUBJECT = "Python 邮件发送练习 - 附件"
# 内容

### 图片定制方法
def addimg(src,imgid):
    with open(src,'rb') as f:
        msgImage = MIMEImage(f.read())
    msgImage.add_header('Content-ID',imgid)
    return msgImage

# 为了保证内容可以嵌套其他功能,必须更改msg的类型
msg = MIMEMultipart('related')

# 邮件内容格式改造
MESSAGE_CONTENT = MIMEText("""<table width="600",border="0",cellspacing="0",cellpading="4">
    <tr>
        <td bgcolor="#CECEFAD" height="20" style="font-size: 14px">**官网性能数据**<a href="www.baidu.com">更多</a></td>
    </tr>
    <tr bgcolor="#EFEBDE" height="100" style="font-size: 13px">
        <td><img src="cid:cpu"></td>
    </tr>
</table>""","html","utf-8")
# 为txt内容附加图片数据
msg.attach(MESSAGE_CONTENT)
msg.attach(addimg('img/cpu.png','cpu'))

# 1 批量添加附件
for file_name in os.listdir('doc'):
    file_lj = "doc/"+file_name
    attach = MIMEText(open(file_lj, 'rb').read(), "base64", "utf-8")
    attach['Content-Type'] = "application/octet-stream"
    attach.add_header('Content-Disposition', 'attachment', filename=('gbk', '', file_name))
    msg.attach(attach)

msg['From'] = FORM_LIST
msg['To'] = RECEIVE_LIST
msg['Subject'] = SUBJECT

server = smtplib.SMTP_SSL(HOST,PORT)
server.login(USER,AUTH_PASSWD)
# 由于我们将原来的HTML内容封装到msg里了,所以使用msg,不再使用MESSAGE_CONTENT
server.sendmail(FORM_LIST,RECEIVE_LIST,msg.as_string())
server.quit()

结果
在这里插入图片描述