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 读写txt文件 json文件的实现方法
Oct 22 Python
浅谈Python浅拷贝、深拷贝及引用机制
Dec 15 Python
Python学习小技巧之列表项的排序
May 20 Python
python中 chr unichr ord函数的实例详解
Aug 06 Python
K-means聚类算法介绍与利用python实现的代码示例
Nov 13 Python
python函数式编程学习之yield表达式形式详解
Mar 25 Python
详解python while 函数及while和for的区别
Sep 07 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
May 15 Python
创建Django项目图文实例详解
Jun 06 Python
Python pandas用法最全整理
Aug 04 Python
python getpass实现密文实例详解
Sep 24 Python
python自动点赞功能的实现思路
Feb 26 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 mvc开发模式的感想
2011/06/28 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
2013/07/05 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
2015/07/31 PHP
Yii2实现上下联动下拉框功能的方法
2016/08/10 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
laravel自定义分页的实现案例offset()和limit()
2019/10/15 PHP
jQuery each()方法的使用方法
2010/03/18 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
完美实现仿QQ空间评论回复特效
2015/05/06 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
AngularJS优雅的自定义指令
2016/07/01 Javascript
AngularJS基础 ng-src 指令简单示例
2016/08/03 Javascript
AngularJS 服务详细讲解及示例代码
2016/08/17 Javascript
购物车前端开发(jQuery和bootstrap3)
2016/08/27 Javascript
Angularjs自定义指令实现分页插件(DEMO)
2017/09/16 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
vue缓存的keepalive页面刷新数据的方法
2019/04/23 Javascript
layui监听工具栏的实例(操作列表按钮)
2019/09/10 Javascript
原生js实现的金山打字小游戏(实例代码详解)
2020/03/16 Javascript
python判断字符串是否包含子字符串的方法
2015/03/24 Python
python使用BeautifulSoup分页网页中超链接的方法
2015/04/04 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
python matplotlib 画dataframe的时间序列图实例
2019/11/20 Python
TensorBoard 计算图的可视化实现
2020/02/15 Python
Python变量格式化输出实现原理解析
2020/08/06 Python
浅析python实现动态规划背包问题
2020/12/31 Python
Python实现邮件发送的详细设置方法(遇到问题)
2021/01/18 Python
CSS3弹性盒模型开发笔记(一)
2016/04/26 HTML / CSS
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
JBL加拿大官方商店:扬声器、耳机等
2020/10/23 全球购物
盛大二次面试题
2016/11/18 面试题
园林资料员岗位职责
2013/12/30 职场文书
四好少年事迹材料
2014/01/12 职场文书