python邮件发送哪个好_最全总结!聊聊 Python 发送邮件的几种方式
1. 前言
邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到
我们都知道 Python内置了对 SMTP 的支持,可以发送纯文本、富文本、HTML 等格式的邮件
本文将聊聊利用 Python 发送邮件的 3 种方式
2. 准备
以 126 邮箱为例,在编码之前,我们需要开启 SMTP 服务
然后,手动新增一个授权码
其中,账号、授权码和服务器地址用于连接登录邮箱服务器
3. 方式一:smtplib
smtplib是 Python 自带的依赖库,可以直接导入使用首先,通过邮箱账号、授权码、邮箱服务器地址初始化一个 SMTP 实例,然后进行连接
def __init__(self):
# 初始化
self.smtp = smtplib.SMTP()
# 连接邮箱服务器地址
self.smtp.connect('smtp.126.com')
# 加入主题和附件,邮件体
self.email_body = MIMEMultipart('mixed')
# 发件人地址及授权码
self.email_from_username = '**@126.com'
self.email_from_password = '授权码'
# 登录
self.smtp.login(self.email_from_username, self.email_from_password)
然后,将收件人列表、邮件标题、邮件正文内容、附件路径及附件文件名加入到上面定义的邮件体中
def generate_email_body(self, email_to_list, email_title, email_content, attchment_path, files):
"""
组成邮件体
:param email_to_list:收件人列表
:param email_title:邮件标题
:param email_content:邮件正文内容
:param attchment_path:附件的路径
:param files:附件文件名列表
:return:
"""
self.email_body['Subject'] = email_title
self.email_body['From'] = self.email_from_username
self.email_body['To'] = ",".join(email_to_list)
for file in files:
file_path = attchment_path + '/' + file
if os.path.isfile(file_path):
# 构建一个附件对象
att = MIMEText(open(file_path, 'rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
att.add_header("Content-Disposition", "attachment", filename=("gbk", "", file))
self.email_body.attach(att)
text_plain = MIMEText(email_content, 'plain', 'utf-8')
self.email_body.attach(text_plain)
接着,就可以使用 SMTP 实例对象,将邮件发送出去
# 收件人列表
email_to_list = ['收件人1地址','收件人2地址']
# 发送邮件
# 注意:此处必须同时指定发件人与收件人,否则会当作垃圾邮件处理掉
self.smtp.sendmail(self.email_from_username, email_to_list, self.email_body.as_string())
邮件发送完毕之后,退出服务即可
def exit(self):
"""
退出服务
:return:
"""
self.smtp.quit()
4. 方式二:zmail
Zmail 项目创建目的是,使邮件处理变得更简单使用 Zmail 发送接收邮件方便快捷,不需要手动添加服务器地址、端口以及适合的协议,可以轻松创建 MIME 对象和头文件注意:Zmail 仅支持 Python3,不支持 Python2首先,安装依赖库
# 安装依赖库
pip3 install zmail
然后,使用邮箱账号、授权码创建一个邮箱服务对象
class ZMailObject(object):
def __init__(self):
# 邮箱账号
self.username = '**@126.com'
# 邮箱授权码
self.authorization_code = '授权码'
# 构建一个邮箱服务对象
self.server = zmail.server(self.username, self.authorization_code)
接着,将邮件主题、邮件内容、包含的附件路径加入到一个字典中,组成邮件主体
# 邮件主体
mail_body = {
'subject': '测试报告',
'content_text': '这是一个测试报告', # 纯文本或者HTML内容
'attachments': ['./attachments/report.png'],
}
最后,将调用send_mail()函数,将邮件发送出去即可
# 收件人
# 可以指定一个人,字符串;也可以是多个人,列表
mail_to = "收件人1"
# 发送邮件
self.server.send_mail(mail_to, mail_body)
5. 方式三:yagmail
yagmail 只需要几行代码,就能实现发送邮件的功能
相比 zmail,yagmail 实现发送邮件的方式更加简洁优雅
首先,安装依赖库
# 安装依赖库
pip3 install yagmail
然后,通过账号、授权码和服务器地址连接邮箱服务器,返回一个服务对象
import yagmail
# 连接服务器
# 用户名、授权码、服务器地址
yag_server = yagmail.SMTP(user='**@126.com', password='授权码', host='smtp.126.com')
接着,通过 send() 函数,将邮件发送出去
# 发送对象列表
email_to = ['**@qq.com', ]
email_title = '测试报告'
email_content = "这是测试报告的具体内容"
# 附件列表
email_attachments = ['./attachments/report.png', ]
# 发送邮件
yag_server.send(email_to, email_title, email_content, email_attachments)
邮件发送完毕之后,关闭连接即可
# 关闭连接
yag_server.close()
6. 最后
上面总结了 Python 发送邮件的 3 种方式,实际项目中,更推荐使用后两种方式
我已经将文中全部源码上传到公众号「 AirPython 」后台,关注公众号后回复「 email 」即可获得全部源码
如果你觉得文章还不错,请大家 点赞、分享、留言下,因为这将是我持续输出更多优质文章的最强动力!
推荐阅读
相关文章:

数据库与操作系统时区更改
ORACLE 11G 新部署的环境,刚使用GOLDENGATE 进行完数据迁移和同步,发现ORACLE 自动收集的任务时间 并不是设定的晚上22点启动。检查AIX 时区发现设置的CDT ,数据库的TIMEZONE 是CST6CDT,与系统管理 员沟通,他答复…
Matlab数据的可视化 -- 三维表面图
本篇微信图文主要介绍Matlab数据可视化方面的内容。surf

为自定义控件添加页面响应事件
ascx:<asp:Button ID"Button1" runat"server" Text"Button" OnClick"Button1_Click" />ascx.cs:(1)public delegate void PostBackDelegate(); //定义委托类型public event PostBackDelegate PostBackEvent; //定义委托对象pr…

trogan连接不上_解决连接不上网(Connection not connected).doc
解决连接不上网(Connection not connected).doc解决连接不上网(Connection not connected)The computer doesnt connect to broadband and has a large collection of code problemsSome broadband connection error handlingBroadband connection error 691 (denied access du…

ASP.NET 3.5揭秘-读书笔记1
ASP.NET和.NET FrameworkASP.NET是微软.NET Framework的一部分。.NET Framework由两部分组成:框架类库(Framework Class Library)和公共语言运行库。框架类库:实现了各种各样功能的类的集合,使编程更简单。命名空间程序集(Assembly): 类在硬盘上的表现—…
【C#串口编程计划】串口编程简介
介绍C#串口编程的基本知识。

中国电信换将 三家运营商未来将如何争战
中国电信长期缺董事长的尴尬终于得到解脱,新任董事长走马上任,当然,也不是新人,已经代理工作很长时间的总经理而已。如此,新一代的电信运营商领导层再一次完整,下一步会怎么走呢? 对于资本市场来…

java hanoi_Hanoi问题java解法
用什么语言解法都差不多,思路都是一样,递归,这其中只要注重于开始和结果的状态就可以了,对于中间过程,并不需要深究。(我细细思考了一下,还是算了。_)代码其实很简单注重的是思路。问题描述:有一…

C#下载远程文件到本地
usingSystem;namespaceDownRemoteFile{ classDownFile { #region成员变量privatestringsavePath; privateboolnewName; #endregion#region属性publicstringSavePath { set{ savePathvalue.Replace("/"…

智慧城市锁定创新,智能AI助力智慧健康
近日,上海中医药大学的校园里出现了一台智能机器人,而在学校创新中心,这台名叫“大医”的智能机器人现场演示了健康咨询及判断结果显示等功能,则让师生产生了极大的兴趣。 上海中医药大学副校长季光教授表示,具备医疗思…
【C#串口编程计划】如何避免关闭串口时软件死锁
本文分析了关闭串口时软件死锁的原因并提出了解决方案。

java实现redis缓存_java实现redis缓存功能
一、安装redis1.mac安装,如果有安装brew 可以直接快捷安装:brew install redis2.linux下载安装wget http://download.redis.io/releases/redis-2.8.17.tar.gztar xzf redis-2.8.17.tar.gzcd redis-2.8.17make二、redis常用命令redis-cli // 进入命令行/u…

notepad++及Scintilla
notepad是一个不错的源代码编辑的软件, 其内部使用了 Scintilla 作为UI的实现, notepad源代码可在在http://notepad-plus.sourceforge.net/tw/site.htm下载, 里面已经有Scintilla 的源代码了Scintilla 的文档在http://www.scintilla.org/ScintillaDoc.html作为一个功能强大的源…
【C#串口编程计划】C#串口协议解析 -- 二进制数据
本文介绍了利用C#接收串口数据(二进制)并进行分析的常规过程。

网络电话如何营造成熟的通信商业模式
在现如今越来越多的手机用户大呼根本离不开微信等热门互联网即时通讯工具的今天,电话通信是否真正已经成为让人感到无奈的“昨日黄花”?最为直接和相对简单的两个例子:对于海量外出务工者来说,老家的父母和儿女并没办法用微信&…

java gettickcount_linux上的GetTickCount函数
#include // 返回自系统开机以来的毫秒数(tick)unsigned long GetTickCount(){struct timespec ts;clock_gettime(CLOCK_MONOTONIC, &ts);return (ts.tv_sec * 1000 ts.tv_nsec / 1000000);}int main(){struct timespec time1 { 0, 0 };clock_gettime(CLOCK_REALTIME, &a…

博问问题内容页面的前端优化
写前端优化的文章在博客园高手云集的地方有点班门弄斧的感觉,不过自己对有些地方的处理还是自我感觉良好,也的确看到了效果,好了,闲话少说,切入正题。 首先划分页面的重要区域,如图: 由上图可知…
【C#串口编程计划】C#串口协议解析 -- 文本数据
本文介绍了利用C#接收串口数据(文本)并进行分析的标准过程。

2017年7个主要的金融行业数据趋势
大数据预示着金融行业的一些巨大变化,而新技术正在推动行业发展的新趋势。任何人在金融领域甚至普通消费者都能从认识到他们中获益。任何金融界人士,甚至普通消费者,都可以从这些技术中受益。 2017年金融行业数据趋势 使用这些趋势来指导人们…

asp java 变量_ASP_用stack变量优化Java代码, java程序包含了大量的对象 - phpStudy...
用stack变量优化Java代码java程序包含了大量的对象,我们需要了解它们是从哪里被访问的,变量存储于何处对程序的性能有显著的影响--尤其是某些需要被频繁访问的变量。我们写一个Java类,在其内部方法中定义的局部变量或对…

Flex实现页面多态--state对象
在Flex 程序中,引入了状态设计的概念。在一个程序中,按照功能的需求,将界面切分成相对独立的部分。运行过程中,随着用户交互,界面在各个部分之间切换。比如在购物车程序中,登录界面、选购商品界面、购物车界…
【C#串口编程计划】通信协议解析 -- byte[]与常用类型的转换
刚刚完成一个串口通讯的系统。目前在把串口通信的代码整合到团队的类库中(把串口通信与网口Soket通讯整合起来,后面只需要配置参数,就可实现网络与串口通讯的转换),故C#串口编程计划的最后一篇图文“C#通讯类库框架”还…

聚焦OA品牌:OA产品影响力是选型关键
选择OA进行企业管理不论是对于企业还是政府来说都是大势所趋。如今OA产业发展得红红火火,呈现出一种百花齐放的局面。然而近年来,许多OA厂商在产品的建设过程中都遇到了瓶颈,如何在OA产品的竞争中脱颖而出成了大多数OA产商所关注的问题。 企业…

java sql编码_java+sql 编码 UTF-8、ISO-8859-1、GBK
java 编码 UTF-8、ISO-8859-1、GBKJava支持UTF-8、ISO-8859-1、GBK等各种字体编码,可笔者发现Java中字体编码的问题仍难倒了不少程序员,网上虽然也有不少关于在Java中如何正确显示中文的文章,但都不够全面,笔者特意总结如下。影响…

.NET三层架构
三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。 …
【C#串口编程计划】C#通讯类库构建
这篇图文是关于【串口编程计划】的最后一篇“C#通讯类库的构建”,也就是把这次所做的关于串口系统的代码集成到团队的类库中,做到代码的可复用(以后写串口的系统,只需要写数据的定义,协议的解析部分就好,通…

WhatsApp与Gmail用户数均突破10亿大关
北京时间2月2日早间消息,FacebookCEO马克-扎克伯格(Mark Zuckerberg)周一宣布,WhatsApp的用户数突破了10亿。今天,谷歌CEO桑德尔-皮查伊(Sundar Pichai)也在财报电话会议中披露,Gmail活跃用户数已突破10亿。 两年前,Fa…

linux 普通用户 mysql_Linux普通用户部署mysql
1、添加一个新用户,并设置密码user testpasswd test2、解压安装包,并重命名为mysqltar zxvf mysql-5.5.54-linux2.6-x86_64.tar.gz3、移除data目录数据rm -rf data/*4、拷贝配置文件cp support-files/my-medium.cnf my.cnf5、新建一个script目录作为启动…

JQUERY搞的相册导航DEMO教学,总有一款合心意
JQUERY搞的相册导航DEMO教学,总有一款合心意 偶然看到的,老外小结的,用jquery搞的相册导航,总有一款合心意,25款哦http://vandelaydesign.com/blog/web-development/jquery-image-galleries/posted on 2009-08-08 00:15 jackyrong的世界 阅读(...) 评论(...) 编辑 收…

ASP.NET Aries JSAPI 文档说明:AR.Form、AR.Combobox
AR.Form 文档 1:对象或属性: 名称 类型 说明 data 属性 编辑页根据主键请求回来的数据 method 属性 用于获取数据的函数指向,默认值Get objName 属性 用于拦截form表单的请求数据对象名,可以表名,视图名 t…