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中操作字符串之startswith()方法的使用
May 20 Python
Python中的with语句与上下文管理器学习总结
Jun 28 Python
Python如何判断数独是否合法
Sep 08 Python
使用python实现个性化词云的方法
Jun 16 Python
Python实现扩展内置类型的方法分析
Oct 16 Python
python3.4实现邮件发送功能
May 28 Python
用python简单实现mysql数据同步到ElasticSearch的教程
May 30 Python
Python Pexpect库的简单使用方法
Jan 29 Python
Python 使用folium绘制leaflet地图的实现方法
Jul 05 Python
python 消除 futureWarning问题的解决
Dec 25 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
Mar 09 Python
Python 捕获代码中所有异常的方法
Aug 03 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+MySQL的聊天室设计
2006/10/09 PHP
php zend解密软件绿色版测试可用
2008/04/14 PHP
PHP高级OOP技术演示
2009/08/27 PHP
基于在生产环境中使用php性能测试工具xhprof的详解
2013/06/03 PHP
php实现可以设置中奖概率的抽奖程序代码分享
2014/01/19 PHP
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
php插件Xajax使用方法详解
2017/08/31 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
jQuery开发者都需要知道的5个小技巧
2010/01/08 Javascript
深入理解JavaScript系列(3) 全面解析Module模式
2012/01/15 Javascript
jQuery中delegate与on的用法与区别示例介绍
2013/12/20 Javascript
node.js中的fs.unlink方法使用说明
2014/12/15 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
JQuery鼠标移到小图显示大图效果的方法
2015/06/10 Javascript
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
vue项目中使用axios上传图片等文件操作
2017/11/02 Javascript
js 两数组去除重复数值的实例
2017/12/06 Javascript
详解如何在Angular优雅编写HTTP请求
2018/12/05 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
微信小程序后端无法保持session的原因及解决办法问题
2020/03/20 Javascript
[06:33]3.19 DOTA2发布会 海涛、冷冷、2009见证希望
2014/03/21 DOTA
python输出指定月份日历的方法
2015/04/23 Python
Python 中的 else详解
2016/04/23 Python
python fabric实现远程部署
2017/01/05 Python
基于python使用tibco ems代码实例
2019/12/20 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
css3的transition属性详解
2014/12/15 HTML / CSS
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
Hudson Jeans官网:高级精制牛仔裤
2018/11/28 全球购物
德国高尔夫商店:Par71.de
2020/11/29 全球购物
标准毕业生自荐信范文
2013/11/04 职场文书
招标授权委托书样本
2014/09/23 职场文书
党的群众路线教育实践活动自我剖析材料
2014/10/08 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
小学教师教育随笔
2015/08/14 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书