SMTP是发送邮件的协议,Python 2.3版本开始内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。本文以QQ邮件为例,用python发送各类邮件。

Python对SMTP支持主要使用smtplib和email两个模块,email模块负责构造邮件,smtplib模块负责发送邮件。

一、 传输简单邮件 smtplib模块

1. SMTP类定义

smtplib.SMTP([host[,port[,local_hostname[,timeout]]]])

作为SMTP的构造函数,功能是与smtp服务器建立连接,在连接成功后,就可以向服务器发送相关请求,比如登录、校验、发送、退出等。

  • host参数为远程smtp主机地址,比如smtp.163.com
  • port为连接端口,默认为25
  • local_hostname的作用是在本地主机的FQDN(完整的域名)发送HELO/EHLO(标识用户身份)指令
  • timeout为连接或尝试在多少秒超时

由于安全问题,通常不直接使用smtplib.SMTP来实例化,第三方邮箱会认为它是不安全的而报错。使用加密过的SMTP_SSL来实例化,它负责让服务器做出具体操作,它有两个参数:

  • 参数1:smtp服务器地址,但它是bytes格式,所以需要编码
  • 参数2:smtp端口,SMTP_SSL协议默认端口是465
smtp_srv = "smtp.qq.com"
srv = smtplib.SMTP_SSL(smtp_srv.encode(), 465)

2. SMTP类方法

  • SMTP.connect([host[,port]]):连接远程smtp主机

host为远程主机地址,port为远程主机smtp端口,也可以直接使用host:port形式来表示

SMTP.connect("smtp.163.com","25")
  • SMTP.login(user, password):远程smtp主机的校验方法

参数为用户名与密码(或者授权码,视邮箱而定)

SMTP.login("python_2014@163.com","sdjkg358")
  • SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]):实现邮件的发送功能

参数依次为是发件人、收件人(列表)、邮件内容

SMTP.sendmail("python_2014@163.com",["demo@domail.com","demo@domail02.com"],body)
  • SMTP.starttls([keyfile[, certfile]]):启用TLS(安全传输)模式

所有SMTP指令都将加密传输,例如使用gmail的smtp服务时需要启动此项才能正常发送邮件,如SMTP.starttls()。

  • SMTP.quit():断开smtp服务器的连接

二、 定制个性化邮件 email模块

除简单文本外,很多时候邮件中还会包含HTML、图片、音频、附件等。MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)作为一种新的扩展邮件格式很好地补充了这一点。

可以将email.mime理解成smtplib模块邮件内容主体的扩展,从原先默认只支持纯文本格式扩展到HTML,同时支持附件、音频、图像等格式,smtplib只负责邮件的投递即可。

下面介绍几个常用的MIME实现类:

  • email.mime.multipart.MIMEMultipart([_subtype[,boundary[,_subparts[,_params]]]])包含多个部分邮件体的MIME对象。

参数_subtype指定要添加到 "Content-type:multipart/subtype" 报头的三种可选子类型:

mixed(默认):构建一个带附件的邮件体
related:构建内嵌资源的邮件体
alternative:构建纯文本与超文本共存的邮件体
  • email.mime.audio.MIMEAudio (_audiodata[,_subtype[,_encoder[,**_params]]]):创建包含音频数据的邮件体

_audiodata包含原始二进制音频数据的字节字符串。

  • email.mime.image.MIMEImage(_imagedata[,_subtype[,_encoder[,**_params]]]):创建包含图片数据的邮件体

_imagedata是包含原始图片数据的字节字符串。

  • email.mime.text.MIMEText (_text[,_subtype[,_charset]]):创建包含文本数据的邮件体

_text是包含消息负载的字符串,_subtype指定文本类型,支持plain(默认值)或html类型的字符串。

三、发送简单文本邮件

下面是一个小例子,只简单发送文本数据

1. 获取授权码

进入QQ 邮箱的主界面→设置→账户,开启“POP3/SMTP服务”和“IMAP/SMTP 服务”。

开启后会弹出授权码,记录下来,例如

  • POP3/SMTP服务:kkkkkkkkkkkkkk
  • IMAP/SMTP服务:jjjjjjjjjjjjjjjjjjjjjjjjjjj

2. Python代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#@Time  : 2022/2/5 23:03
#@Author: ying.huang
#@File  : python_email.pyimport smtplib
from email.mime.text import MIMEText
from email.utils import formataddr# 发件人
from_name = "Hehuyi_In"
# 发件邮箱
from_addr = "xxxxx@qq.com"
# 发件邮箱授权码,注意不是QQ邮箱密码
from_pwd = "jjjjjjjjjj"
# 收件邮箱
to_addr = "yyyyyy@qq.com"# 邮件标题
my_title = "Hehuyi Test"
# 邮件正文
my_msg = "Hello World"# MIMEText三个主要参数
# 1. 邮件内容
# 2. MIME子类型,plain表示text类型
# 3. 邮件编码格式,使用"utf-8"避免乱码
msg = MIMEText(my_msg, 'plain', 'utf-8')
msg['From'] = formataddr([from_name, from_addr])
# 邮件的标题
msg['Subject'] = my_title# SMTP服务器地址,QQ邮箱的SMTP地址是"smtp.qq.com"
smtp_srv = "smtp.qq.com"try:# 不能直接使用smtplib.SMTP来实例化,第三方邮箱会认为它是不安全的而报错# 使用加密过的SMTP_SSL来实例化,它负责让服务器做出具体操作,它有两个参数# 第一个是服务器地址,但它是bytes格式,所以需要编码# 第二个参数是服务器的接受访问端口,SMTP_SSL协议默认端口是465srv = smtplib.SMTP_SSL(smtp_srv.encode(), 465)# 使用授权码登录QQ邮箱srv.login(from_addr, from_pwd)# 使用sendmail方法来发送邮件,它有三个参数# 第一个是发送地址# 第二个是接受地址,是list格式,可以同时发送给多个邮箱# 第三个是发送内容,作为字符串发送srv.sendmail(from_addr, [to_addr], msg.as_string())print('发送成功')
except Exception as e:print('发送失败')
finally:#无论发送成功还是失败都要退出你的QQ邮箱srv.quit()

执行代码

注意Python文件名不能和import的包名相同,否则会遇到以下报错

E:\Python36\python.exe E:/pytest/email.py

Traceback (most recent call last):

File "E:/pytest/email.py", line 7, in <module>

import smtplib

File "E:\Python36\lib\smtplib.py", line 47, in <module>

import email.utils

File "E:\pytest\email.py", line 8, in <module>

from email.mime.text import MIMEText

ModuleNotFoundError: No module named 'email.mime'; 'email' is not a package

Process finished with exit code 1

查看QQ邮箱,发现果然收到了新邮件,并且标题、发件人、正文都跟我们设置的一样

四、 发送HTML格式邮件

本示例通过引入email.mime的MIMEText类来实现支持HTML格式的邮件,支持所有HTML元素,包含表格、图片、动画、CSS样式、表单等。使用HTML的表格定制美观的业务报表:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time  : 2022/2/5 23:03
# @Author: Hehuyi_In
# @File  : html_email.pyimport smtplib
from email.mime.text import MIMEText
from email.utils import formataddr# 发件人
from_name = "Hehuyi_In"
# 发件邮箱
from_addr = "xxxxxxx@qq.com"
# 发件邮箱授权码,注意不是QQ邮箱密码
from_pwd = "jjjjjjj"
# 收件邮箱
to_addr = "xxxxxxx@qq.com"# 邮件标题
my_title = "HTML Test"
# 邮件正文,html格式
my_msg = '''<table width="800" border="0" cellspacing="0" cellpadding="4"><tr><td bgcolor="#CECFAD" height="20" style="font-size:14px">*官网数据 <a href="monitor.domain.com">更多>></a></td></tr><tr><td bgcolor="#EFEBDE" height="100" style="font-size:13px">1)日访问量:<font color=red>152433</font> 访问次数:23651 页面浏览量:45123 点击数:545122 数据流量:504Mb<br>2)状态码信息<br>&nbsp;&nbsp;500:105 404:3264 503:214<br>3)访客浏览器信息<br>&nbsp;&nbsp;IE:50% firefox:10% chrome:30% other:10%<br>4)页面信息<br>&nbsp;&nbsp;/index.php 42153<br>&nbsp;&nbsp;/view.php 21451<br>&nbsp;&nbsp;/login.php 5112<br></td></tr></table>'''# 参数2改为html
msg = MIMEText(my_msg, 'html', 'utf-8')
msg['From'] = formataddr([from_name, from_addr])
# 邮件的标题
msg['Subject'] = my_title# SMTP服务器地址
smtp_srv = "smtp.qq.com"try:srv = smtplib.SMTP_SSL(smtp_srv.encode(), 465)# 使用授权码登录QQ邮箱srv.login(from_addr, from_pwd)# 使用sendmail方法来发送邮件srv.sendmail(from_addr, [to_addr], msg.as_string())print('发送成功')
except Exception as e:print('发送失败')
finally:# 无论发送成功还是失败都要退出你的QQ邮箱srv.quit()

运行结果

五、 发送图文格式邮件

当要求包含图片数据的邮件内容时,需要引用MIMEImage类,若邮件主体由多个MIME对象组成,则同时需引用MIMEMultipart类来进行组装。

本示例通过MIMEText与MIMEImage类的组合来实现图文格式邮件的定制:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time  : 2022-02-07 22:00
# @Author: Hehuyi_In
# @File  : image_email.pyimport smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.utils import formataddr# 发件人
from_name = "Hehuyi_In"
# 发件邮箱
from_addr = "xxxx@qq.com"
# 发件邮箱授权码,注意不是QQ邮箱密码
from_pwd = "xxxxx"
# 收件邮箱
to_addr = "xxxx@qq.com"
# 邮件标题
my_title = "HTML+Image Test"# 添加图片函数,参数1:图片路径,参数2:图片id
def addimg(src,imgid):fp = open(src,'rb')  # 打开文件msg_image = MIMEImage(fp.read())  # 创建MIMEImage对象,读取图片内容并作为参数fp.close() # 关闭文件msg_image.add_header('Content-ID',imgid)  # 指定图片文件的Content-ID,<img>标签src用到return  msg_image# 创建MIMEMultipart对象,采用related定义内嵌资源的邮件体
msg_multipart = MIMEMultipart('related')# 创建MIMEText对象,HTML元素包括表格<table>及图片<img>
msg_text = MIMEText("""
<table width="600" border="0" cellspacing="0" cellpadding="4"><tr bgcolor="#CECFAD" height="20" style="font-size:14px"><td colspan=2>*SqlServer001 <a href="monitor.domain.com">更多>></a></td></tr><tr bgcolor="#EFEBDE" height="100" style="font-size:13px"><td><img src="cid:001"></td><td> <img src="cid:002"></td></tr><tr bgcolor="#EFEBDE" height="100" style="font-size:13px"><td><img src="cid:003"></td><td><img src="cid:004"></td></tr>
</table>""","html","utf-8")   # <img>标签的src属性是通过Content-ID来引用的# MIMEMultipart对象附加MIMEText及MIMEImage的内容
msg_multipart.attach(msg_text)
msg_multipart.attach(addimg("img/001.png","001"))  # 图片路径与标签,001对应上方html中的<img src="cid:001">
msg_multipart.attach(addimg("img/002.png","002"))
msg_multipart.attach(addimg("img/003.png","003"))
msg_multipart.attach(addimg("img/004.png","004"))# 发件人
msg_multipart['From'] = formataddr([from_name, from_addr])
# 邮件标题
msg_multipart['Subject'] = my_title# SMTP服务器地址
smtp_srv = "smtp.qq.com"try:srv = smtplib.SMTP_SSL(smtp_srv.encode(), 465)# 使用授权码登录QQ邮箱srv.login(from_addr, from_pwd)# 使用sendmail方法来发送邮件srv.sendmail(from_addr, [to_addr], msg_multipart.as_string())print('发送成功')
except Exception as e:print('发送失败')
finally:# 无论发送成功还是失败都要退出你的QQ邮箱srv.quit()

运行结果如图

六、 发送带附件的邮件

本示例通过MIMEText与MIMEImage类的组合,实现图文邮件格式,另通过MIMEText类再定义Content-Disposition属性来实现带附件的邮件。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time  : 2022-02-07 22:33
# @Author: Hehuyi_In
# @File  : attach_email.pyimport smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.utils import formataddr# 发件人
from_name = "Hehuyi_In"
# 发件邮箱
from_addr = "xxxx@qq.com"
# 发件邮箱授权码,注意不是QQ邮箱密码
from_pwd = "xxxxx"
# 收件邮箱
to_addr = "xxxx@qq.com"
# 邮件标题
my_title = "Text+Image+Attachment Test"# 添加图片函数,参数1:图片路径,参数2:图片id
def addimg(src,imgid):fp = open(src,'rb')  # 打开文件msg_image = MIMEImage(fp.read())  # 创建MIMEImage对象,读取图片内容并作为参数fp.close() # 关闭文件msg_image.add_header('Content-ID',imgid)  # 指定图片文件的Content-ID,<img>标签src用到return  msg_image# 创建MIMEMultipart对象,采用related定义内嵌资源的邮件体
msg_multipart = MIMEMultipart('related')#创建一个MIMEText对象,HTML元素包括文字与图片<img>
msg_text = MIMEText("<font color=red>sqlserver介绍<br><img src=\"cid:001\" border=\"1\"><br>详情参考附件</font>","html","utf-8")# 创建一个MIMEText对象,附加sqlserver.txt文档
msg_attach = MIMEText(open("doc/sqlserver.txt", "rb").read(),"base64","utf-8")# 指定文件格式类型
msg_attach["Content-Type"] = "application/octet-stream"# 指定Content-Disposition值为attachment则出现下载保存对话框,保存的默认文件名使用filename指定
msg_attach["Content-Disposition"] = "attachment; filename=\"sqlserver.txt\""# MIMEMultipart对象附加text,img,attach内容
msg_multipart.attach(msg_text)
msg_multipart.attach(addimg("img/001.png","001")) # 图片路径与标签,001对应上方html中的<img src="cid:001">
msg_multipart.attach(msg_attach)# 发件人
msg_multipart['From'] = formataddr([from_name, from_addr])
# 邮件标题
msg_multipart['Subject'] = my_title# SMTP服务器地址
smtp_srv = "smtp.qq.com"try:srv = smtplib.SMTP_SSL(smtp_srv.encode(), 465)# 使用授权码登录QQ邮箱srv.login(from_addr, from_pwd)# 使用sendmail方法来发送邮件srv.sendmail(from_addr, [to_addr], msg_multipart.as_string())print('发送成功')
except Exception as e:print('发送失败')# 打印具体报错print(e)
finally:# 无论发送成功还是失败都要退出你的QQ邮箱srv.quit()

运行结果如图

参考

《python自动化运维技术与最佳实践》

https://docs.python.org/2.7/library/smtplib.html

https://docs.python.org/2.7/library/email.mime.html

用python发送qq邮件_fgdwa的博客-CSDN博客_python发送qq邮件

python发送QQ邮件_齐天大圣的博客-CSDN博客_python 发送qq邮件

python发送各类QQ邮件 —— smtplib与email模块相关推荐

  1. python发邮件详解 -- smtplib和email模块

    文章目录 python发邮件详解,-->smtplib和email模块 1.python发邮件所需要的基础包 2.smtplib的用法 3.email模块的详细理解和使用 A.MIMEText对 ...

  2. 【Python学习笔记】(十)邮件处理:email模块;SMTP协议(smtplib模块);POP3协议(poplib模块);IMAP协议(imaplib模块)

    电子邮件,简称电邮,是指一种由寄件人将数字信息发送给一个人或者多个人的信息交换方式. 电邮包括三个部分:消息的"信封".邮件标头.邮件内容. 电邮的格式:用户名@主机名(域名).电 ...

  3. Python发送多附件邮件的方法

    Python发送多附件邮件的基本思路,首先就是用MIMEMultipart()方法来表示这个邮件由多个部分组成.然后再通过attach()方法将各部分内容分别加入到MIMEMultipart容器中.M ...

  4. 安装了email模块还是报错_科普:利用Python smtplib和email模块实现自动发送邮件功能...

    概要 我们都知道SMTP(简单邮件传输协议),是一组用于从原地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式.SMTP规定电子邮件应该如何格式化.如何加密,以及如何在邮件服务器之间传递.SMT ...

  5. python发邮件11002_【python发送zabbix报警邮件,SSL版本】mailman.py

    [python发送zabbix报警邮件,SSL版本]mailman.py#!/usr/local/bin/python3 # # via  @ 20150210 # SSL only ''' 用法: ...

  6. 使用python SMTP 自动发送qq邮件

    使用python SMTP 自动发送qq邮件 参考教程 参考博客 目前有个需求就是在阿里云服务器上跑不间断抓取数据的python程序,程序有时会出现bug,因为不可能随时随地都看着程序运行,所以就想到 ...

  7. email邮件中 内嵌iframe_邮件发送,使用Python中 smtplib与email 模块实现自动发送QQ邮件...

    在 Python 的实际应用中,特别是在执行周期性定时任务的场景中,我们希望能够一种简单.方便的方式获取任务的运行结果和状态.一般我们通过支持邮件发送功能的方式,实现任务结果的反馈.本文主要介绍,如何 ...

  8. python发邮件详解,smtplib和email模块详解

    在介绍具体的实现python发邮件的具体操作之前,我觉得有必要介绍下SMTP,更有助于理解python发邮件的实现原理.SMTP协议属于TCP/IP协议簇,即简单邮件传输协议,它是一组用于由源地址到目 ...

  9. python是什么邮箱_python发邮件详解,smtplib和email模块详解

    在介绍具体的实现python发邮件的具体操作之前,我觉得有必要介绍下SMTP,更有助于理解python发邮件的实现原理.SMTP协议属于TCP/IP协议簇,即简单邮件传输协议,它是一组用于由源地址到目 ...

  10. python发送各类邮件的主要方法

    python中email模块使得处理邮件变得比较简单,今天着重学习了一下发送邮件的具体做法,这里写写自己的的心得,也请高手给些指点.     一.相关模块介绍 发送邮件主要用到了smtplib和ema ...

最新文章

  1. C++编程思想重点笔记(上)
  2. wifi一键配网smartconfig原理及应用
  3. 产销对接行动倡议书-丰收节交易会·万祥军:贫困地区农品
  4. pjsua帮助手册(中文)
  5. 10月5日起 部分小米红米机型将停止开发版内测公测
  6. 最新pvz服务器补偿码,阴阳师:补偿来了!大量活动导致服务器崩溃,现已修复且下发补偿...
  7. monkey命令详解(二)
  8. vs code为什么不出现小黑框_为什么越来越多商家开通微信小程序商城?
  9. 最新cs1.6服务器ip地址,CS1.6服务器IP地址
  10. IPV6 RFC和地址表示
  11. c语言中sqrt与pow的区别,实现sqrt和pow函数
  12. CSDN博客新增「评论置顶」、「定时发布」功能,翘首期盼的PC版「每日一练」上线!【第14期*2021.9.22】
  13. cmd无法打开jupyter notebook问题
  14. c语言的字符串不是存放,在C语言中,字符串不存放在一个变量中,而是存放在一个中...
  15. 【p4】perforce命令笔记
  16. c语言输出五角星程序,c语言入门之绘制五角星.doc
  17. Android开发技术前线 (android-tech-frontier) --优质技术文章的聚合项目
  18. 图像处理之天空区域识别
  19. java围棋代码_围棋源代码Java_Applet小程序
  20. Amazon S3 服务15岁生日快乐!

热门文章

  1. Busiest Computing Nodes (线段树维护区间最小值)
  2. android flash插件下载地址,adobe flash player
  3. SAP ABAP BDC基础使用方法
  4. Photoshop基础学习-修改图片文字
  5. 输入某年某日,判断这一天是这一年的第几天
  6. python企业微信回调_Python微信企业号开发之回调模式接收微信端客户端发送消息及被...
  7. 2022/06/06 day07:Scanner类、Random类、ArrayList 类
  8. 【Cesium】添加polygon边界线
  9. 【原创】自制操作系统知识储备(一)---流程篇
  10. java实现验证码时效,JAVA实现验证码