array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 python:利用smtplib模块发送邮件 - 爱码网

自动化测试中,测试报告一般都需要发送给相关的人员,比较有效的一个方法是每次执行完测试用例后,将测试报告(HTML、截图、附件)通过邮件方式发送。

参考代码:send_mail.py

 

一、python对SMTP的支持

SMTP(Simple Mail Transfer Protocol)是简单传输协议,它是一组用于用于由源地址到目的地址的邮件传输规则。

python中对SMTP进行了简单的封装,可以发送纯文本邮件、HTML邮件以及带附件的邮件。

1、python对SMTP的支持

①email模块:负责构建邮件

②smtplib模块:负责发送邮件

可以通过help()方法查看SMTP提供的方法:

 1 >>> from smtplib import SMTP
 2 >>> help(SMTP)
 3 Help on class SMTP in module smtplib:
 4 
 5 class SMTP(builtins.object)
 6  |  This class manages a connection to an SMTP or ESMTP server.
 7  |  SMTP Objects:
 8  |      SMTP objects have the following attributes:
 9  |          helo_resp
10  |              This is the message given by the server in response to the
11  |              most recent HELO command.
12  |  
13  |          ehlo_resp
14  |              This is the message given by the server in response to the
15  |              most recent EHLO command. This is usually multiline.
16  |  
17  |          does_esmtp
18  |              This is a True value _after you do an EHLO command_, if the
19  |              server supports ESMTP.
20 | ......

 导入SMTP,查看对象注释。。。。。。

 

2、sendmail()方法的使用说明

①connect(host,port)方法参数说明

  host:指定连接的邮箱服务器

  port:指定连接的服务器端口

②login(user,password)方法参数说明

  user:登录邮箱用户名

  password:登录邮箱密码

③sendmail(from-addr,to_addrs,msg...)方法参数说明

  from_addr:邮件发送者地址

  to_addrs:字符串列表,邮件发送地址

  msg:发送消息

④quit():结束当前会话

 

二、发送不同格式的邮件

1、纯文本格式的邮件

 1 # coding=utf-8
 2 import smtplib
 3 from email.mime.text import MIMEText
 4 # 发送纯文本格式的邮件
 5 msg = MIMEText('hello,send by python_test...','plain','utf-8')
 6 #发送邮箱地址
 7 sender = 'sender@163.com'
 8 #邮箱授权码,非登陆密码
 9 password = '123456'
10 #收件箱地址
11 receiver = 'receiver@qq.com'
12 #smtp服务器
13 smtp_server = 'smtp.163.com'
14 #发送邮箱地址
15 msg['From'] = sender
16 #收件箱地址
17 msg['To'] = receiver
18 #主题
19 msg['Subject'] = 'from IMYalost'
20 server = smtplib.SMTP(smtp_server,25)
21 
22 server.login(sender,password)
23 server.sendmail(sender,receiver,msg.as_string())
24 server.quit()

login()方法用来登录SMTP服务器,sendmail()方法就是发邮件,可以一次发给多个人,所以传入一个list,邮件正文是一个str,as_string()把MIMEText对象变成str。

为了方便演示,这里用的是163和QQ邮箱,收到的邮件内容如下:

python:利用smtplib模块发送邮件

 

2、HTML格式的邮件

如果想发送HTML类型的邮件,只需要下面的一段代码即可:

1 # coding=utf-8
2 import smtplib
3 from email.mime.text import MIMEText
4 # 发送HTML格式的邮件
5 msg = MIMEText('<html><h1>人生苦短,我用python</html></h1>','html','utf-8')

收到的邮件内容如下:

python:利用smtplib模块发送邮件

PS:注意这里的区别,msg中输入的是邮件正文,因此需要根据具体内容格式选择合适的类型!

关于不同类型文件的对应类型,可参考此链接:HTTP Content-type 对照表

 

3、邮件格式的关系

构造一个邮件对象就是一个message对象,如果构造一个MIMEText对象,就表示一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片;

要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。它们的继承关系如下:

1 Message
2 +- MIMEBase
3    +- MIMEMultipart
4    +- MIMENonMultipart
5       +- MIMEMessage
6       +- MIMEText
7       +- MIMEImage

可以通过email.mime文档查看它们所在的包以及详细的用法。

 

三、SMTP发送邮件之坑

1、协议之坑

因为采用的是SMTP协议,那么需要确保自己的发送优邮箱地址开启了SMTP服务,否则,会报错

python:利用smtplib模块发送邮件

python:利用smtplib模块发送邮件

 

2、password之坑

看了很多例子,都是将邮箱登录密码设置为password,然后就华丽丽的懵逼了,报错!!!whf!!!

事实的真相是:password需要输入邮箱授权码,而非邮箱登录密码!!!

 

3、各种报错

我在调试的时候,遇到很多的报错,大多都是这些:smtplib.SMTPDataError(553/554...)

根据报错里面的链接:see http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html,找到对应的问题,仔细检查代码,慢慢debug吧。。。

PS:如果收件邮箱的传输经过加密,必须经过SSL加密再STMP传输,出现554(发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件),发生了一件有趣的事情:

    网易邮箱的处理结果是发生回退,即邮件发送失败,转回了收件箱。。。

    QQ邮箱的处理结果,是将邮件放进垃圾邮件里面。。。

总结:发生报错的原因还是技术不到家,不够细心啊,唉,年轻人。。。

附:常用的邮箱服务器(POP3、SMTP)地址、端口

 

利用python对SMTP的内置封装支持,发送邮件的代码和注意事项基本就是以上几点,当然,其中的代码都是demo,具体实践过程还需要根据实际情况做调整。。。

    

 

相关文章: