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发送邮件接收邮件示例分享
Jan 21 Python
十分钟利用Python制作属于你自己的个性logo
May 07 Python
更换Django默认的模板引擎为jinja2的实现方法
May 28 Python
Flask框架使用DBUtils模块连接数据库操作示例
Jul 20 Python
对Python获取屏幕截图的4种方法详解
Aug 27 Python
Django发送邮件功能实例详解
Sep 02 Python
Python 实现try重新执行
Dec 21 Python
Python线程threading模块用法详解
Feb 26 Python
Django数据结果集序列化并展示实现过程
Apr 22 Python
python如何删除列为空的行
Jul 17 Python
Python Selenium自动化获取页面信息的方法
Aug 31 Python
解决Python中的modf()函数取小数部分不准确问题
May 28 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
全国FM电台频率大全 - 6 辽宁省
2020/03/11 无线电
PHP+MYSQL的文章管理系统(一)
2006/10/09 PHP
供参考的 php 学习提高路线分享
2011/10/23 PHP
Notice: Trying to get property of non-object problem(PHP)解决办法
2012/03/11 PHP
PHP 数组和字符串互相转换实现方法
2013/03/26 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
学习PHP的数组总结【经验】
2016/05/05 PHP
PHP实现一个简单url路由功能实例
2016/11/05 PHP
Laravel框架路由管理简单示例
2019/05/07 PHP
js 获取、清空input type="file"的值(示例代码)
2013/12/24 Javascript
javascript实现微信分享
2014/12/23 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
jQuery实现监控页面所有ajax请求的方法
2015/12/10 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
jQuery获取浏览器类型和版本号的方法
2016/07/05 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
easyui 中的datagrid跨页勾选问题的实现方法
2017/01/18 Javascript
详解微信小程序-canvas绘制文字实现自动换行
2019/04/26 Javascript
在Vue中创建可重用的 Transition的方法
2020/06/02 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
[38:39]完美世界DOTA2联赛循环赛 IO vs GXR BO2第二场 11.04
2020/11/05 DOTA
基于asyncio 异步协程框架实现收集B站直播弹幕
2016/09/11 Python
Python实现判断一行代码是否为注释的方法
2018/05/23 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
2020/02/26 Python
python3.9实现pyinstaller打包python文件成exe
2020/12/13 Python
浅谈h5自定义audio(问题及解决)
2016/08/19 HTML / CSS
Bose美国官网:购买Bose耳机和音箱
2019/03/10 全球购物
Stio官网:男女、儿童户外服装
2019/12/13 全球购物
护士实习生自我鉴定范文
2013/12/10 职场文书
竞选村长演讲稿
2014/04/28 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
个人股份转让协议书范本
2015/01/28 职场文书
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL
bose降噪耳机音能消除人声吗
2022/04/19 数码科技