Python基础详解之邮件处理


Posted in Python onApril 28, 2021

一、发送电子邮件

Python标准库提供了smtplib,用于实现SMTP协议发送邮件。标准库还提供email模块帮助我们构建邮件格式。SMTP(Simple Mail Transfer Protocol,即简单邮件传输协议),是一组有源地址到目的地址传送邮件的规则,用来控制信件的中转方式。

  • 获取QQ邮箱密码(授权码)

Python基础详解之邮件处理 

二、发送纯文本格式的邮件

import smtplib

from email.mime.text import MIMEText
from email.header import Header

# 邮箱用户名
sender = 'dad@qq.com'(输入你的邮箱)
# 邮箱密码(部分邮箱为授权码)
password = '123456'(输入你的密码)
# 收件人邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
receiver = ['baby@qq.com', ](输入你要发送人的邮箱)
# 邮件正文
text = 'Hello,baby'
message = MIMEText(text, 'plain', 'utf-8')
# 发件人显式的名字
message['From'] = Header('拿头来坚持', 'utf-8')
# 收件人显式的名字
message['To'] = Header('baby', 'utf-8')
# 邮件标题
message['Subject'] = '爸爸来信,请接收!'

try:
    # 使用QQ企业邮箱服务器发送
    smtp = smtplib.SMTP('smtp.qq.com')
    # 登录
    smtp.login(sender, password)
    # 发送
    smtp.sendmail(sender, receiver, message.as_string())
    print('邮件发送成功!')
    # 退出服务器
    smtp.quit()
except smtplib.SMTPException as e:
    print('Error!邮件发送失败!', e)

发送纯文本格式的邮件执行结果:

Python基础详解之邮件处理

三、发送HTML格式的邮件

import smtplib

from email.mime.text import MIMEText
from email.header import Header

# 邮箱用户名
sender = 'dad@qq.com'(输入你的邮箱)
# 邮箱密码(部分邮箱为授权码)
password = '123456'(输入你的密码)
# 收件人邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
receiver = ['baby@qq.com', ](输入你要发送人的邮箱)
# 邮件正文
msg = '''
    <p><a href='https://blog.csdn.net/weixin_46382560?spm=1011.2124.3001.5343'>拿头来坚持</p>
          Life goes on, learning goes on
        </p> <!----></div></div> <div class="user-profile-head-info-b" data-v-d1dbb6f8><ul data-v-d1dbb6f8><li data-v-d1dbb6f8><div class="user-profile-statistics-num" data-v-d1dbb6f8>22,574</div> <div class="user-profile-statistics-name" data-v-d1dbb6f8>被访问量</div></li> <li data-v-d1dbb6f8><a href="javascript:;" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  data-v-d1dbb6f8><div class="user-profile-statistics-num" data-v-d1dbb6f8>24</div> <div class="user-profile-statistics-name" data-v-d1dbb6f8>原创文章</div></a></li> <li data-v-d1dbb6f8><a href="https://blog.csdn.net/rank/list/total" rel="external nofollow"  rel="external nofollow"  target="_blank" data-report-click="{&quot;spm&quot;:&quot;3001.5476&quot;}" data-report-query="spm=3001.5476" data-v-d1dbb6f8><div class="user-profile-statistics-num" data-v-d1dbb6f8>128,997</div> <div class="user-profile-statistics-name" data-v-d1dbb6f8>作者排名</div></a></li> <li data-v-d1dbb6f8><a href="javascript:;" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  data-v-d1dbb6f8><div class="user-profile-statistics-num" data-v-d1dbb6f8>762</div> <div class="user-profile-statistics-name" data-v-d1dbb6f8>粉丝数量</div></a></li></ul></div></div></div> <div class="user-profile-body" data-v-3f0fdf46 data-v-80922f46><div class="user-profile-body-inner" data-v-3f0fdf46><div class="user-profile-body-left" data-v-3f0fdf46><div class="user-profile-aside" data-v-d487ed78 data-v-3f0fdf46><div class="user-general-info single-general-info" data-v-d487ed78><ul data-v-d487ed78><!----> <!----> <li class="user-general-info-join-csdn" data-v-d487ed78><i data-v-d487ed78></i> <span data-v-d487ed78>于</span> <span class="user-general-info-key-word" data-v-d487ed78>2020-02-22</span> <span data-v-d487ed78>加入CSDN</span></li></ul></div> <!----> <div class="user-achievement user-profile-aside-common-box" data-v-d487ed78><div class="aside-common-box-head" data-v-d487ed78>获得成就</div> <div class="aside-common-box-bottom" data-v-d487ed78><div class="aside-common-box-content" data-v-d487ed78><ul data-v-d487ed78><li data-v-d487ed78>
        <i style="background-image: url(https://img-home.csdnimg.cn/images/20210114022819.png)"></i>
        <div>获得<span>212</span>次点赞</div>
      </li><li data-v-d487ed78>
        <i style="background-image: url(https://img-home.csdnimg.cn/images/20210114022831.png)"></i>
        <div>内容获得<span>111</span>次评论</div>
      </li><li data-v-d487ed78>
        <i style="background-image: url(https://img-home.csdnimg.cn/images/20210114022828.png)"></i>
        <div>获得<span>562</span>次收藏</div>
      '''
# 指定消息体使用HTML格式
message = MIMEText(msg, 'html', 'utf-8')
# 发件人显式的名字
message['From'] = Header('拿头来坚持', 'utf-8')
# 收件人显式的名字
message['To'] = Header('baby', 'utf-8')
# 邮件标题
message['Subject'] = '爸爸来信,请接收!'

try:
    # 使用QQ企业邮箱服务器发送
    smtp = smtplib.SMTP('smtp.qq.com')
    # 登录
    smtp.login(sender, password)
    # 发送
    smtp.sendmail(sender, receiver, message.as_string())
    print('邮件发送成功!')
    # 退出服务器
    smtp.quit()
except smtplib.SMTPException as e:
    print('Error!邮件发送失败!', e)

发送HTML格式的邮件的执行结果:

Python基础详解之邮件处理

四、发送带附件的邮件

import smtplib

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

# 邮箱用户名
sender = 'dad@qq.com'(输入你的邮箱)
# 邮箱密码(部分邮箱为授权码)
password = '123456'(输入你的密码)
# 收件人邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
receiver = ['baby@qq.com', ](输入你要发送人的邮箱)
# 指定消息体使用复合类型
message = MIMEMultipart()
# 发件人显式的名字
message['From'] = Header('拿头来坚持', 'utf-8')
# 收件人显式的名字
message['To'] = Header('baby', 'utf-8')
# 邮件标题
message['Subject'] = '爸爸来信,请接收!'
# 邮件正文
msg = '''
    <p><a href='https://blog.csdn.net/weixin_46382560?spm=1011.2124.3001.5343'>拿头来坚持</p>
          Life goes on, learning goes on
        </p> <!----></div></div> <div class="user-profile-head-info-b" data-v-d1dbb6f8><ul data-v-d1dbb6f8><li data-v-d1dbb6f8><div class="user-profile-statistics-num" data-v-d1dbb6f8>22,574</div> <div class="user-profile-statistics-name" data-v-d1dbb6f8>被访问量</div></li> <li data-v-d1dbb6f8><a href="javascript:;" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  data-v-d1dbb6f8><div class="user-profile-statistics-num" data-v-d1dbb6f8>24</div> <div class="user-profile-statistics-name" data-v-d1dbb6f8>原创文章</div></a></li> <li data-v-d1dbb6f8><a href="https://blog.csdn.net/rank/list/total" rel="external nofollow"  rel="external nofollow"  target="_blank" data-report-click="{&quot;spm&quot;:&quot;3001.5476&quot;}" data-report-query="spm=3001.5476" data-v-d1dbb6f8><div class="user-profile-statistics-num" data-v-d1dbb6f8>128,997</div> <div class="user-profile-statistics-name" data-v-d1dbb6f8>作者排名</div></a></li> <li data-v-d1dbb6f8><a href="javascript:;" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  data-v-d1dbb6f8><div class="user-profile-statistics-num" data-v-d1dbb6f8>762</div> <div class="user-profile-statistics-name" data-v-d1dbb6f8>粉丝数量</div></a></li></ul></div></div></div> <div class="user-profile-body" data-v-3f0fdf46 data-v-80922f46><div class="user-profile-body-inner" data-v-3f0fdf46><div class="user-profile-body-left" data-v-3f0fdf46><div class="user-profile-aside" data-v-d487ed78 data-v-3f0fdf46><div class="user-general-info single-general-info" data-v-d487ed78><ul data-v-d487ed78><!----> <!----> <li class="user-general-info-join-csdn" data-v-d487ed78><i data-v-d487ed78></i> <span data-v-d487ed78>于</span> <span class="user-general-info-key-word" data-v-d487ed78>2020-02-22</span> <span data-v-d487ed78>加入CSDN</span></li></ul></div> <!----> <div class="user-achievement user-profile-aside-common-box" data-v-d487ed78><div class="aside-common-box-head" data-v-d487ed78>获得成就</div> <div class="aside-common-box-bottom" data-v-d487ed78><div class="aside-common-box-content" data-v-d487ed78><ul data-v-d487ed78><li data-v-d487ed78>
        <i style="background-image: url(https://img-home.csdnimg.cn/images/20210114022819.png)"></i>
        <div>获得<span>212</span>次点赞</div>
      </li><li data-v-d487ed78>
        <i style="background-image: url(https://img-home.csdnimg.cn/images/20210114022831.png)"></i>
        <div>内容获得<span>111</span>次评论</div>
      </li><li data-v-d487ed78>
        <i style="background-image: url(https://img-home.csdnimg.cn/images/20210114022828.png)"></i>
        <div>获得<span>562</span>次收藏</div>
      '''
# 邮件附加html文件
message.attach(MIMEText(msg, 'html', 'utf-8'))
# 添加附件
attached_file = MIMEText(open(__file__, encoding='utf-8').read(), 'base64', 'utf-8')
# 指定附件的文件名和原先的文件不一样
attached_file['Content-Disposition'] = 'attachment;filename="mail.py"'
# 邮件附加附件
message.attach(attached_file)
try:
    # 使用QQ企业邮箱服务器发送
    smtp = smtplib.SMTP('smtp.qq.com')
    # 登录
    smtp.login(sender, password)
    # 发送
    smtp.sendmail(sender, receiver, message.as_string())
    print('邮件发送成功!')
    # 退出服务器
    smtp.quit()
except smtplib.SMTPException as e:
    print('Error!邮件发送失败!', e)

发送带附件的邮件执行结果:

Python基础详解之邮件处理

五、发送图片的邮件

import smtplib

from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.header import Header

# 邮箱用户名
sender = 'dad@qq.com'(输入你的邮箱)
# 邮箱密码(部分邮箱为授权码)
password = '123456'(输入你的密码)
# 收件人邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
receiver = ['baby@qq.com', ](输入你要发送人的邮箱)
# 利用related定义内嵌资源的邮件体
message = MIMEMultipart('related')
# 发件人显式的名字
message['From'] = Header('拿头来坚持', 'utf-8')
# 收件人显式的名字
message['To'] = Header('baby', 'utf-8')
# 邮件标题
message['Subject'] = '爸爸来信,请接收!'
# 邮件正文
content = MIMEMultipart('alternative')
# html内容
msg = '''
    <p><a href='https://blog.csdn.net/weixin_46382560?spm=1011.2124.3001.5343'>拿头来坚持</p>
          Life goes on, learning goes on
    <p>
    拿头来坚持的个人主页
    <img src='cid:img01'>
    </p>
      '''
# 邮件附加html文件
message.attach(MIMEText(msg, 'html', 'utf-8'))
# 添加图片
with open('csdn.png', 'rb') as f:
    img01 = MIMEImage(f.read())
# 定义资源的名字为img01
img01.add_header('Content-ID', 'img01')
# 邮件附加图片
message.attach(img01)
try:
    # 使用QQ企业邮箱服务器发送
    smtp = smtplib.SMTP('smtp.qq.com')
    # 登录
    smtp.login(sender, password)
    # 发送
    smtp.sendmail(sender, receiver, message.as_string())
    print('邮件发送成功!')
    # 退出服务器
    smtp.quit()
except smtplib.SMTPException as e:
    print('Error!邮件发送失败!', e)

发送图片的邮件执行结果:

Python基础详解之邮件处理

六、接收电子邮件

接受邮件有两种常用的协议:POP3和IMAP协议

POP3协议(Post Office Protocol-Version3,即邮局协议版本3):允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等)不会反馈到服务器上,比如通过客户端收取了邮箱的3封邮件并移动到其他文件夹,邮件服务器上的这些邮件不会被同步移动。

IMAP协议(Internet Mail Access Protocol,即Internet邮件访问协议):提供Webmail与电子邮件客户端之间的双向通信,任何在客户端做的改变都会同步到服务器上。在客户端对邮件进行了操作,服务器上的邮件也会进行相应的操作。

七、使用POP3协议下载邮件

import poplib

from email.parser import Parser

# 登录邮箱的用户名
username = 'baby@qq.com'(输入你的邮箱)
# 登录邮箱的密码(部分邮箱为授权码)
password = '123456'(输入你的密码)
# 连接邮箱服务器
pop_server = poplib.POP3('pop.qq.com')
# 打印出邮箱服务器的欢迎文字
print(pop_server.getwelcome())
# 登录邮箱服务器
pop_server.user(username)
pop_server.pass_(password)
# 打印出当前账号的状态,第一个返回值为邮件数,第二个返回值为占用空间
print('Server stat', pop_server.stat())
# 获取所以邮件列表
resp, mails, octets = pop_server.list()
print(mails)
# 获取最新的一封邮件(序列号最大的),邮件索引从1开始计数
index = len(mails)
resp, lines, octets = pop_server.retr(index)
content = b'\r\n'.join(lines).decode('utf-8')
# 解析出邮件
msg = Parser().parsestr(content)
# 可以根据邮件索引号直接从服务器删除邮件
# pop_server.dele(index)
# 关闭连接
pop_server.quit()

执行结果:

b'+OK XMail POP3 Server v1.0 Service Ready(XMail v1.0)'
Server stat (15, 50814)
[b'1 1255', b'2 1286', b'3 1310', b'4 1398', b'5 1458', b'6 1450', b'7 1602', b'8 1633', b'9 5001', b'10 2347', b'11 2371', b'12 2267', b'13 5033', b'14 5077', b'15 17326']

如果正确连接上服务器并且列出邮件数量,说明我们已经正确使用了POP3协议。

到此这篇关于Python基础详解之邮件处理的文章就介绍到这了,更多相关python邮件处理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python做文本按行去重的实现方法
Oct 19 Python
python 删除大文件中的某一行(最有效率的方法)
Aug 19 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
Apr 23 Python
python实现淘宝秒杀脚本
Jun 23 Python
python实现Excel文件转换为TXT文件
Apr 28 Python
介绍一款python类型检查工具pyright(推荐)
Jul 03 Python
利用Python实现kNN算法的代码
Aug 16 Python
使用Python为中秋节绘制一块美味的月饼
Sep 11 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
Oct 23 Python
python KNN算法实现鸢尾花数据集分类
Oct 24 Python
Python实现随机取一个矩阵数组的某几行
Nov 26 Python
Python的scikit-image模块实例讲解
Dec 30 Python
python实现黄金分割法的示例代码
Apr 28 #Python
Python 流媒体播放器的实现(基于VLC)
tensorflow+k-means聚类简单实现猫狗图像分类的方法
python实现三阶魔方还原的示例代码
python基于opencv批量生成验证码的示例
python基于tkinter制作下班倒计时工具
Apr 28 #Python
Python爬虫之爬取哔哩哔哩热门视频排行榜
You might like
PHP 开发工具
2006/12/06 PHP
可以在线执行PHP代码包装修正版
2008/03/15 PHP
PHP输出数组中重名的元素的几种处理方法
2012/09/05 PHP
Codeigniter操作数据库表的优化写法总结
2014/06/12 PHP
php实现xml转换数组的方法示例
2017/02/03 PHP
6个DIV 135或246间隔一秒轮番显示效果
2010/07/24 Javascript
js二级地域选择的实现方法
2013/06/17 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
基于jquery自定义的漂亮单选按钮RadioButton
2013/11/19 Javascript
让angularjs支持浏览器自动填表
2014/11/10 Javascript
实例分析js和C#中使用正则表达式匹配a标签
2014/11/26 Javascript
实例代码详解javascript实现窗口抖动及qq窗口抖动
2016/01/04 Javascript
浅谈javascript中的call、apply、bind
2016/03/06 Javascript
js从外部获取图片的实现方法
2016/08/05 Javascript
浅谈webpack下的AOP式无侵入注入
2017/11/12 Javascript
Vue自定义指令实现checkbox全选功能的方法
2018/02/28 Javascript
vuex页面刷新后数据丢失的方法
2019/01/17 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
NodeJS http模块用法示例【创建web服务器/客户端】
2019/11/05 NodeJs
javascript中闭包closure的深入讲解
2021/03/03 Javascript
[33:23]Secret vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
浅谈Python的异常处理
2016/06/19 Python
Python中的元组介绍
2019/01/28 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
python 模拟银行转账功能过程详解
2019/08/06 Python
Python三元运算与lambda表达式实例解析
2019/11/30 Python
如何基于python操作excel并获取内容
2019/12/24 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
2020/05/13 Python
CSS3 毛玻璃效果
2019/08/14 HTML / CSS
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
产品质量承诺范本
2014/03/31 职场文书
店铺转让协议书
2015/01/29 职场文书
资金申请报告范文
2015/05/14 职场文书
完美解决golang go get私有仓库的问题
2021/05/05 Golang
Pytest中skip和skipif的具体使用方法
2021/06/30 Python