python3使用smtplib实现发送邮件功能


Posted in Python onMay 22, 2018

在之前的工作中,业务方做了一些调整,提出了对一部分核心指标做更细致的拆分并定期产出的需求。出于某些原因,这部分数据不太方便在报表上呈现,因此就考虑通过邮件的方式定期给业务方发送数据。

当时本来使用的是linux自带的mail命令来实现,然而某一天开始,突然发现服务器上的邮件服务不可用了,于是就将脚本迁移到本地,并准备使用Python3中的smtplib搭配crontab来实现。

首先,我们需要导入Python3标准库中的smtplib包和email包来实现邮件的构造和发送。

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

然后,我们需要配置邮件内容:

message = MIMEText('邮件测试', 'plain', 'utf-8')
message['From'] = 'qixizhuang@126.com'
message['To'] = 'qixizhuang@126.com,751718003@qq.com'
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')

一个完整的邮件需要包括主题(subject)、正文、发件人和收件人:

message = MIMEText('邮件测试', 'plain', 'utf-8')用于设置邮件正文,email.mime.text.MIMEText的三个参数中,第一个是邮件正文,第二个是设置文本格式,第三个则用于设置文本编码。

message['From'] = 'qixizhuang@126.com'用于设置发件人一栏。

message['To'] ='qixizhuang@126.com,751718003@qq.com'则用于设置收件人一栏。多个收件人之间直接用英文逗号隔开即可。

message['Subject'] = Header(subject, 'utf-8')则用于设置邮件的主题。

python3使用smtplib实现发送邮件功能

此次邮件发送,我们以网易的126邮箱为例,因此我们需要配置一些服务器和账号信息:

sender = 'qixizhuang@126.com'
receivers = ['qixizhuang@126.com', '751718003@qq.com']
mail_host = 'smtp.126.com'
mail_user = 'qixizhuang@126.com'
mail_pass = '********'

我们需要配置服务器、邮件账号及密码、以及发件人和收件人信息。

  • sender = 'qixizhuang@126.com'是用于配置发件人信息,注意此处的发件人与message[‘from']部分含义不同,message中的信息用于在邮箱中显示,而此处则是使用sendmail方法时所需要的一个参数。即sender这一变量名并不重要,你甚至可以直接在sendmail中填入邮箱地址的字符串。
  • receivers = ['qixizhuang@126.com', '751718003@qq.com']则用于配置收件人信息,如果收件人只有一个,那么我们可以直接用一个字符串来赋值;如果收件人有多个的话,那么sendmail需要接收一个列表。跟上一条类似,此处的含义与message[‘to']部分不同。
  • mail_host, mail_user, mail_pass则是用于设置邮件发送服务器以及邮箱的账号密码,跟上边类似,变量名并不重要,不设置这几个变量直接在sendmail中输入字符串也是可以的。

最后,我们使用smtplib来发送邮件。

try:
 smtpObj = smtplib.SMTP() 
 smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
 smtpObj.login(mail_user,mail_pass)
 smtpObj.sendmail(sender, receivers, message.as_string())
 print("邮件发送成功!")
except smtplib.SMTPException:
 print("邮件发送失败!")
  • smtpObj = smtplib.SMTP(); smtpObj.connect(mail_host, 25);也可以直接改成smtpObj = smtplib.SMTP(mail_host, 25) ,这是为了构建一个SMTP对象。
  • smtpObj.login(mail_user,mail_pass)用于登录邮箱。需要注意的是,这里的mail_pass不一定是你的邮箱密码,很多邮箱服务包括网易邮箱提供了授权码的功能,如果开启了此项功能,则此处需要将邮箱密码改为授权码。
  • smtpObj.sendmail(sender, receivers, message.as_string())则是使用SMTP对象的sendmail方法来发送邮件。

到此为止,我们已经实现了一个简单的邮件发送案例。

然而,在很多场景下,我们需要为邮件添加附件,则此种情况下,我们需要先创建MIMEMultipart()实例,然后构造一个或多个附件,最终使用smtplib来发送。完整示例代码如下:

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

# 配置邮箱账户及收发人信息
sender = 'qixizhuang@126.com'
receivers = ['qixizhuang@126.com', '751718003@qq.com']
mail_host = 'smtp.126.com'
mail_user = 'qixizhuang@126.com'
mail_pass = 'password or authorization code here'

# 构建MIMEMultipart对象,并在其中添加邮件内容信息
message = MIMEMultipart()
message.attach(MIMEText('邮件测试', 'plain', 'utf-8'))
message['From'] = 'qixizhuang@126.com'
message['To'] = 'qixizhuang@126.com,751718003@qq.com'
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')

# 构建附件内容
attr = MIMEText(open('./test.txt', 'r').read())
attr['Content-Type'] = 'application/octet-stream'
attr['Content-Disposition'] = 'attachment; filename = ' + 'test.txt'
message.attach(attr)

# 发送邮件
try:
 smtpObj = smtplib.SMTP() 
 smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
 smtpObj.login(mail_user,mail_pass)
 smtpObj.sendmail(sender, receivers, message.as_string())
 print("邮件发送成功!")
except smtplib.SMTPException:
 print("邮件发送失败!")

至此,我们已经实现了带附件的邮件发送,接下来通过crontab等工具即可完成定时发送邮件的任务,在这里就不赘述了,需要的同学可以自行查阅crontab的使用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python切换pip安装源的方法详解
Nov 18 Python
Python3 replace()函数使用方法
Mar 19 Python
TensorFlow Session会话控制&Variable变量详解
Jul 30 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
Aug 02 Python
Python循环中else,break和continue的用法实例详解
Jul 11 Python
python如何将多个PDF进行合并
Aug 13 Python
python 并发编程 阻塞IO模型原理解析
Aug 20 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
Oct 17 Python
Python中bisect的使用方法
Dec 31 Python
用python介绍4种常用的单链表翻转的方法小结
Feb 24 Python
python自动点赞功能的实现思路
Feb 26 Python
Python reversed反转序列并生成可迭代对象
Oct 22 Python
python抓取网站的图片并下载到本地的方法
May 22 #Python
Python3实现的字典、列表和json对象互转功能示例
May 22 #Python
python3.5 email实现发送邮件功能
May 22 #Python
python模块smtplib实现纯文本邮件发送功能
May 22 #Python
python邮件发送smtplib使用详解
Jun 16 #Python
Python3多线程操作简单示例
May 22 #Python
Python3基于sax解析xml操作示例
May 22 #Python
You might like
php中运用http调用的GET和POST方法示例
2014/09/29 PHP
php实现用于计算执行时间的类实例
2015/04/18 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
原生js和jQuery随意改变div属性style的名称和值
2014/10/22 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
继续学习javascript闭包
2015/12/03 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
2016/12/08 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
微信小程序 支付功能(前端)的实现
2017/05/24 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
深究AngularJS中ng-drag、ng-drop的用法
2017/06/12 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
简单快速的实现js计算器功能
2017/08/17 Javascript
深入了解query和params的使用区别
2019/06/24 Javascript
js实现无缝轮播图效果
2020/03/09 Javascript
浅谈python socket函数中,send与sendall的区别与使用方法
2017/05/09 Python
Python对象与引用的介绍
2019/01/24 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
Python搭建HTTP服务过程图解
2019/12/14 Python
Cython编译python为so 代码加密示例
2019/12/23 Python
python图片剪裁代码(图片按四个点坐标剪裁)
2020/03/10 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
2021/02/22 Python
CSS3轻松实现圆角效果
2017/11/09 HTML / CSS
前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)
2018/07/12 HTML / CSS
捷克时尚网上商店:OTTO
2018/03/15 全球购物
软件测试工程师结构化面试题库
2016/11/23 面试题
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
《诺贝尔》教学反思
2014/02/17 职场文书
旅游与环境专业求职信
2014/06/05 职场文书
淮海战役观后感
2015/06/11 职场文书
初中语文教学研修日志
2015/11/13 职场文书
2016年“我们的节日·端午节”活动总结
2016/04/01 职场文书
同学会演讲稿
2019/04/02 职场文书