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抓取网页中图片并保存到本地
Dec 01 Python
Python学生成绩管理系统简洁版
Apr 05 Python
Python使用Django实现博客系统完整版
Sep 29 Python
使用memory_profiler监测python代码运行时内存消耗方法
Dec 03 Python
详解【python】str与json类型转换
Apr 29 Python
使用Python进行体育竞技分析(预测球队成绩)
May 16 Python
浅析Python 引号、注释、字符串
Jul 25 Python
python matplotlib库直方图绘制详解
Aug 10 Python
Python利用requests模块下载图片实例代码
Aug 12 Python
用pytorch的nn.Module构造简单全链接层实例
Jan 14 Python
用python绘制樱花树
Oct 09 Python
OpenCV实现常见的四种图像几何变换
Apr 01 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
PHP源码之explode使用说明
2011/08/05 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
2016/08/12 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
简单的JavaScript互斥锁分享
2014/02/02 Javascript
自己封装的javascript事件队列函数版
2014/06/12 Javascript
在JavaScript中处理时间之getHours()方法的使用
2015/06/10 Javascript
jQuery结合CSS制作动态的下拉菜单
2015/10/27 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
2015/11/17 Javascript
EasyUI创建对话框的两种方式
2016/08/23 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
2017/02/15 Javascript
Vue-resource拦截器判断token失效跳转的实例
2017/10/27 Javascript
jQuery动态添加li标签并添加属性和绑定事件方法
2018/02/24 jQuery
node中间层实现文件上传功能
2018/06/11 Javascript
jQuery插件实现弹性运动完整示例
2018/07/07 jQuery
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
2019/12/10 Javascript
解决Vue-cli无法编译es6的问题
2020/10/30 Javascript
Python常用正则表达式符号浅析
2014/08/13 Python
python实现超市扫码仪计费
2018/05/30 Python
详解Django+Uwsgi+Nginx的生产环境部署
2018/06/25 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
python代码打印100-999之间的回文数示例
2019/11/24 Python
Django 允许局域网中的机器访问你的主机操作
2020/05/13 Python
python中get和post有什么区别
2020/06/19 Python
浅析NumPy 切片和索引
2020/09/02 Python
党校培训思想汇报
2014/01/03 职场文书
财务工作者先进事迹材料
2014/01/17 职场文书
竞选体育委员演讲稿
2014/04/26 职场文书
高中课程设置方案
2014/05/28 职场文书
竞聘演讲稿开场白
2014/08/25 职场文书
创业计划之特色精品店
2019/08/12 职场文书
关于JavaScript回调函数的深入理解
2021/06/27 Javascript