Python实现自动发送邮件功能


Posted in Python onMarch 02, 2021

简单邮件传输协议(SMTP)是一种协议,用于在邮件服务器之间发送电子邮件和路由电子邮件。Python提供smtplib模块,该模块定义了一个SMTP客户端会话对象,可用于使用SMTP或ESMTP侦听器守护程序向任何互联网机器发送邮件。

SMTP通讯的基本流程可以概括为以下几点:

1.连接SMTP服务器

2.登陆用户名和密码

3.发送指定邮件内容

4.退出SMTP连接

一、发送纯文本格式邮件

#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import smtplib
from smtplib import SMTP
from email.mime.text import MIMEText
from email.header import Header

#构造纯文本邮件内容
msg = MIMEText('hello,send by Python.....','plain','utf-8')

#发送者邮箱
sender = 'xxxxx@XXXXX.com.cn'

#发送者的登陆用户名和密码
user = 'xxxxx@XXXX.com.cn'
password = 'xxxxxx'

#发送者邮箱的SMTP服务器地址
smtpserver = 'xxxx'

#接收者的邮箱地址
receiver = ['xxxxxx@qq.com','xxxxxx@outlook.com'] #receiver 可以是一个list

smtp = smtplib.SMTP() #实例化SMTP对象
smtp.connect(smtpserver,25) #(缺省)默认端口是25 也可以根据服务器进行设定
smtp.login(user,password) #登陆smtp服务器
smtp.sendmail(sender,receiver,msg.as_string()) #发送邮件 ,这里有三个参数
'''
login()方法用来登录SMTP服务器,sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文
是一个str,as_string()把MIMEText对象变成str。
'''
smtp.quit()

运行之后就会收到邮件:

Python实现自动发送邮件功能

但是仔细观察会发现:

1.邮件没有主题

2.看不到收件人的信息

这是因为邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发给MTA,而是包含在发给MTA的文本中的,所以,我们必须把From、To和Subject添加到MIMEText中,才是一封完整的邮件:

msg = MIMEText('hello,send by Python.....','plain','utf-8')
msg['From'] = Header('Python测试','utf-8')
msg['To'] = Header('管理员','utf-8')
subject = 'python SMTP 测试邮件'
msg['Subject'] = Header(subject,'utf-8')

二、发送HTML格式的邮件

如果我们要发送HTML邮件,而不是普通的纯文本文件怎么办?方法很简单,在构造MIMEText对象时,把HTML字符串传进去,再把第二个参数由plain变为html就可以了:

msg = MIMEText('<html><h1>你好!<h1><html>','html','utf-8') 
#发送HTML格式邮件就只需要把对应的第二个参数改为html即可

三、发送带附件的邮件

发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。

#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

#发送邮件服务器
smtpserver = 'xxxxx'
#发送邮箱用户名和密码
user = 'xxxxxx'
password = 'xxxxxx'
#发送邮箱
sender = 'xxxxx'
#接受邮箱
receiver = 'xxxxxxx'

#创建一个带附件的实例
message = MIMEMultipart()
message['From'] = Header('Python 测试','utf-8')
message['To'] = Header('测试','utf-8')
subject = 'Python SMTP邮件测试'
message['Subject'] = Header(subject,'utf-8')

#邮件正文内容
message.attach(MIMEText('这是测试Python发送附件功能....','plain','utf-8'))

#构造附件1,传送当前目录下的test.txt文件
att1 = MIMEText(open('123.txt','rb').read(),'base64','utf-8')
att1['Content-Type'] = 'application/octet-stream'
#这里的filename可以任意写,写什么名字 邮件中就显示什么名字
att1['Content-Disposition'] = 'attachment;filename:"123.txt"'
message.attach(att1)

smtp = smtplib.SMTP()
smtp.connect(smtpserver,25)
smtp.login(user,password)
smtp.sendmail(sender,receiver,message.as_string())
smtp.quit()

小结

使用Python的smtplib发送邮件十分简单,只要掌握了各种邮件类型的构造方法,正确设置好邮件头,就可以顺利发出。

构造一个邮件对象就是一个Messag对象,如果构造一个MIMEText对象,就表示一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。它们的继承关系如下:

Message
+- MIMEBase
   +- MIMEMultipart
   +- MIMENonMultipart
      +- MIMEMessage
      +- MIMEText
      +- MIMEImage

这种嵌套关系就可以构造出任意复杂的邮件。你可以通过email.mime文档查看它们所在的包以及详细的用法。

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

Python 相关文章推荐
python 算法 排序实现快速排序
Jun 05 Python
Python单链表简单实现代码
Apr 27 Python
python 中random模块的常用方法总结
Jul 08 Python
利用python实现微信头像加红色数字功能
Mar 26 Python
python爬取淘宝商品销量信息
Nov 16 Python
python3.5安装python3-tk详解
Apr 26 Python
Python pandas DataFrame操作的实现代码
Jun 21 Python
tf.concat中axis的含义与使用详解
Feb 07 Python
Python如何脚本过滤文件中的注释
May 27 Python
使用python matploblib库绘制准确率,损失率折线图
Jun 16 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
Feb 16 Python
python脚本框架webpy的url映射详解
Nov 20 Python
django站点管理详解
Dec 12 #Python
Django 生成登陆验证码代码分享
Dec 12 #Python
python+django加载静态网页模板解析
Dec 12 #Python
Django入门使用示例
Dec 12 #Python
django使用html模板减少代码代码解析
Dec 12 #Python
Python使用三种方法实现PCA算法
Dec 12 #Python
Java分治归并排序算法实例详解
Dec 12 #Python
You might like
程序员编程十条戒律
2009/07/09 PHP
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
再推荐十款免费的php开发工具
2015/11/09 PHP
php无限级评论嵌套实现代码
2018/04/18 PHP
yii2.0框架场景的简单使用示例
2020/01/25 PHP
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
2011/08/09 Javascript
javascript打印大全(打印页面设置/打印预览代码)
2013/03/29 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
javascript/jquery获取地址栏url参数的方法
2014/03/05 Javascript
javascript框架设计读书笔记之数组的扩展与修复
2014/12/02 Javascript
JS采用绝对定位实现回到顶部效果完整实例
2016/06/20 Javascript
javascript表单正则应用
2017/02/04 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
Nginx 配置多站点vhost 的方法
2018/01/07 Javascript
vue-cli脚手架的安装教程图解
2018/09/02 Javascript
基于ssm框架实现layui分页效果
2019/07/27 Javascript
Element InputNumber计数器的使用方法
2020/07/27 Javascript
利用信号如何监控Django模型对象字段值的变化详解
2017/11/27 Python
python下解压缩zip文件并删除文件的实例
2018/04/24 Python
Python使用numpy模块创建数组操作示例
2018/06/20 Python
Python简易版停车管理系统
2019/08/12 Python
使用opencv中匹配点对的坐标提取方式
2020/06/04 Python
python七种方法判断字符串是否包含子串
2020/08/18 Python
Python实现冒泡排序算法的完整实例
2020/11/04 Python
LightInTheBox西班牙站点:全球商品在线采购
2016/09/22 全球购物
仓库主管的岗位职责
2013/12/04 职场文书
大三预备党员入党思想汇报
2014/01/08 职场文书
2014年班组工作总结
2014/11/20 职场文书
2014幼儿园班主任工作总结
2014/12/04 职场文书
介绍信的格式
2015/01/30 职场文书
自我推荐信怎么写
2015/03/24 职场文书
教师评职称工作总结2015
2015/04/20 职场文书