本文转自:https://www.cnblogs.com/insane-Mr-Li/p/9121619.html

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

首先我们要做:

进入163邮箱,点击设置中的pop3/smtp/imap

开启smtp服务,如果没有开启,点击设置,手机号验证后勾选开启即可,开启后图如下:

主要用到的就是smtp服务器:smtp.163.com

然后设置客户端授权密码:

记住密码,如果不记得密码在这重新授权。手机号验证即可重新授权。这个密码一会写代码的时候要用

设置成功后,开始写代码

一、python对SMTP的支持

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

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

1、python对SMTP的支持

①email模块:负责构建邮件

②smtplib模块:负责发送邮件

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

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

♦在smtplib库中,主要主要用smtplib.SMTP()类,用于连接SMTP服务器,发送邮件。

这个类有几个常用的方法:

方法

描述

SMTP.set_debuglevel(level) 设置输出debug调试信息,默认不输出
SMTP.docmd(cmd[, argstring]) 发送一个命令到SMTP服务器
SMTP.connect([host[, port]]) 连接到指定的SMTP服务器
SMTP.helo([hostname]) 使用helo指令向SMTP服务器确认你的身份
SMTP.ehlo(hostname) 使用ehlo指令像ESMTP(SMTP扩展)确认你的身份
SMTP.ehlo_or_helo_if_needed() 如果在以前的会话连接中没有提供ehlo或者helo指令,这个方法会调用ehlo()或helo()
SMTP.has_extn(name) 判断指定名称是否在SMTP服务器上
SMTP.verify(address) 判断邮件地址是否在SMTP服务器上
SMTP.starttls([keyfile[, certfile]]) 使SMTP连接运行在TLS模式,所有的SMTP指令都会被加密
SMTP.login(user, password) 登录SMTP服务器
SMTP.sendmail(from_addr, to_addrs, msg, mail_options=[], rcpt_options=[])

发送邮件

from_addr:邮件发件人

to_addrs:邮件收件人

msg:发送消息

SMTP.quit() 关闭SMTP会话
SMTP.close() 关闭SMTP服务器连接

二、发送不同格式的邮件

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 = 'xxxxx'
  10. #收件箱地址
  11. receiver = 'receiver@qq.com'
  1. mailto_list = ['liqiang22230@163.com','10116340931@qq.com']#收件人
  1. #smtp服务器
  2. smtp_server = 'smtp.163.com'
  3. #发送邮箱地址
  4. msg['From'] = sender
  5. #收件箱地址
  6. msg['To'] =';'.join(mailto_list)#发送多人邮件写法
  1. #主题
    msg['Subject'] = 'from IMYalost'
  2.  
  3. server = smtplib.SMTP(smtp_server,25)# SMTP协议默认端口是25
    server.login(sender,password)#ogin()方法用来登录SMTP服务器
    server.set_debuglevel(1)#打印出和SMTP服务器交互的所有信息。
    server.sendmail(sender,mailto_list,msg.as_string())#msg.as_string()把MIMEText对象变成str server.quit()
    # 第一个参数为发送者,第二个参数为接收者,可以添加多个例如:['SunshineWuya@163.com','xxx@qq.com',]# 第三个参数为发送的内容
  1. server.quit()

我们用set_debuglevel(1)就可以打印出和SMTP服务器交互的所有信息。SMTP协议就是简单的文本命令和响应。login()方法用来登录SMTP服务器,sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文是一个str,as_string()把MIMEText对象变成str。

附一段例子:

  1. #coding:utf-8 #强制使用utf-8编码格式
  2. import smtplib #加载smtplib模块
  3. from email.mime.text import MIMEText
  4. from email.utils import formataddr
  5. my_sender='发件人邮箱账号' #发件人邮箱账号,为了后面易于维护,所以写成了变量
  6. my_user='收件人邮箱账号' #收件人邮箱账号,为了后面易于维护,所以写成了变量
  7. def mail():
  8. ret=True
  9. try:
  10. msg=MIMEText('填写邮件内容','plain','utf-8')
  11. msg['From']=formataddr(["发件人邮箱昵称",my_sender]) #括号里的对应发件人邮箱昵称、发件人邮箱账号
  12. msg['To']=formataddr(["收件人邮箱昵称",my_user]) #括号里的对应收件人邮箱昵称、收件人邮箱账号
  13. msg['Subject']="主题" #邮件的主题,也可以说是标题
  14.  
  15. server=smtplib.SMTP("smtp.xxx.com",25) #发件人邮箱中的SMTP服务器,端口是25
  16. server.login(my_sender,"发件人邮箱密码") #括号中对应的是发件人邮箱账号、邮箱密码
  17. server.sendmail(my_sender,[my_user,],msg.as_string()) #括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
  18. server.quit() #这句是关闭连接的意思
  19. except Exception: #如果try中的语句没有执行,则会执行下面的ret=False
  20. ret=False
  21. return ret
  22.  
  23. ret=mail()
  24. if ret:
  25. print("ok") #如果发送成功则会返回ok,稍等20秒左右就可以收到邮件
  26. else:
  27. print("filed") #如果发送失败则会返回filed

如果发送成功则会返回ok,否则为执行不成功,如下图:

2、HTML格式的邮件

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

  1. msg = MIMEText('<html><body><h1>Hello</h1>' +
  2. '<p>send by <a href="http://www.python.org">Python</a>...</p>' +
  3. '</body></html>', 'html', 'utf-8')

再发一封邮件显示如下:

♦ 发送送不同格式的附件:

基本思路就是,使用MIMEMultipart来标示这个邮件是多个部分组成的,然后attach各个部分。如果是附件,则add_header加入附件的声明。
在python中,MIME的这些对象的继承关系如下。
MIMEBase
    |-- MIMENonMultipart
        |-- MIMEApplication
        |-- MIMEAudio
        |-- MIMEImage
        |-- MIMEMessage
        |-- MIMEText
    |-- MIMEMultipart
一般来说,不会用到MIMEBase,而是直接使用它的继承类。MIMEMultipart有attach方法,而MIMENonMultipart没有,只能被attach。
MIME有很多种类型,这个略麻烦,如果附件是图片格式,我要用MIMEImage,如果是音频,要用MIMEAudio,如果是word、excel,我都不知道该用哪种MIME类型了,得上google去查。
最懒的方法就是,不管什么类型的附件,都用MIMEApplication,MIMEApplication默认子类型是application/octet-stream。
application/octet-stream表明“这是个二进制的文件,希望你们那边知道怎么处理”,然后客户端,比如qq邮箱,收到这个声明后,会根据文件扩展名来猜测。

下面上代码。
假设当前目录下有foo.xlsx/foo.jpg/foo.pdf/foo.mp3这4个文件。

  1. import smtplib
  2. from email.mime.multipart import MIMEMultipart
  3. from email.mime.text import MIMEText
  4. from email.mime.application import MIMEApplication
  5. _user = "sigeken@qq.com"
  6. _pwd = "***"
  7. _to = "402363522@qq.com"
  8.  
  9. #如名字所示Multipart就是分多个部分 # 构造一个MIMEMultipart对象代表邮件本身 
  10. msg = MIMEMultipart()
  11. msg["Subject"] = "don't panic"
  12. msg["From"] = _user
  13. msg["To"] = _to
  14.  
  15. #---这是文字部分---
  16. part = MIMEText("乔装打扮,不择手段")
  17. msg.attach(part)
  18.  
  19. #---这是附件部分---
  20. #xlsx类型附件
  21. part = MIMEApplication(open('foo.xlsx','rb').read())
  22. part.add_header('Content-Disposition', 'attachment', filename="foo.xlsx")
  23. msg.attach(part)
  24.  
  25. #jpg类型附件
  26. part = MIMEApplication(open('foo.jpg','rb').read())
  27. part.add_header('Content-Disposition', 'attachment', filename="foo.jpg")
  28. msg.attach(part)
  29.  
  30. #pdf类型附件
  31. part = MIMEApplication(open('foo.pdf','rb').read())
  32. part.add_header('Content-Disposition', 'attachment', filename="foo.pdf")
  33. msg.attach(part)
  34.  
  35. #mp3类型附件
  36. part = MIMEApplication(open('foo.mp3','rb').read())
  37. part.add_header('Content-Disposition', 'attachment', filename="foo.mp3")
  38. msg.attach(part)
  39.  
  40. s = smtplib.SMTP("smtp.qq.com", timeout=30)#连接smtp邮件服务器,端口默认是25
  41. s.login(_user, _pwd)#登陆服务器
  42. s.sendmail(_user, _to, msg.as_string())#发送邮件
  43. s.close()

♦有时候信息我们想进行加密传输:

只需要在中间加上一串这样的代码举行了

  1. mail_server = smtplib.SMTP(smtp_server,25)# SMTP协议默认端口是25
  2. # 登陆服务器
  3. mail_server.ehlo()#使用ehlo指令像ESMTPSMTP扩展)确认你的身份
  4. mail_server.starttls()#使SMTP连接运行在TLS模式,所有的SMTP指令都会被加密
  5. mail_server.ehlo()
  6. mail_server.set_debuglevel(1)#打印出和SMTP服务器交互的所有信息。
  7. mail_server.login(sender,pwd)
  8. # 发送邮件

输出结果:

我们厂遇到的几个坑:

  1.password:邮箱密码,163邮箱设置中的客户端授权密码

  2.msg["To"] = _to 一定要加上不然会报错。

                                          至此邮箱这块基本上就讲完了。 

每天一点点,感受自己存在的意义。

python:利用smtplib发送邮件详解的更多相关文章

  1. python引用和对象详解

    python引用和对象详解 @[马克飞象] python中变量名和对象是分离的 例子 1: a = 1 这是一个简单的赋值语句,整数 1 为一个对象,a 是一个引用,利用赋值语句,引用a指向了对象1. ...

  2. python操作redis用法详解

    python操作redis用法详解 转载地址 1.redis连接 redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用 ...

  3. python基础之函数详解

    Python基础之函数详解 目录 Python基础之函数详解 一.函数的定义 二.函数的调用 三.函数返回值 四.函数的参数 4.1 位置参数 4.2 关键字参数 实参:位置实参和关键字参数的混合使用 ...

  4. python之OS模块详解

    python之OS模块详解 ^_^,步入第二个模块世界----->OS 常见函数列表 os.sep:取代操作系统特定的路径分隔符 os.name:指示你正在使用的工作平台.比如对于Windows ...

  5. python之sys模块详解

    python之sys模块详解 sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和我一起走进python的模块吧! sys模块的常见函数列表 sys.argv: 实现从程序外部向程序传 ...

  6. python中threading模块详解(一)

    python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...

  7. Python数据类型及其方法详解

    Python数据类型及其方法详解 我们在学习编程语言的时候,都会遇到数据类型,这种看着很基础也不显眼的东西,却是很重要,本文介绍了python的数据类型,并就每种数据类型的方法作出了详细的描述,可供知 ...

  8. Python中time模块详解

    Python中time模块详解 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. ...

  9. Python 列表(List)操作方法详解

    Python 列表(List)操作方法详解 这篇文章主要介绍了Python中列表(List)的详解操作方法,包含创建.访问.更新.删除.其它操作等,需要的朋友可以参考下   列表是Python中最基本 ...

随机推荐

  1. 进阶之路 | 奇妙的Activity之旅

    前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 本篇文章需要已经具备的知识: Activity的基本概念 AndroidManifest.xml的基本概念 学 ...

  2. NServiceBus 入门到精通(一)

    什么是NServiceBus?NServiceBus 是一个用于构建企业级 .NET系统的开源通讯框架.它在消息发布/订阅支持.工作流集成和高度可扩展性等方面表现优异,因此是很多分布式系统基础平台的理 ...

  3. 使用 Apache James 3.3.0(开源免费) 搭建外网电子邮件服务器(基于 Windows + Amazon Corretto 8)

    对于邮件服务器的安装,请先参阅: 使用 Apache James 3.3.0(开源免费) 搭建内网电子邮件服务器(基于 Windows + Amazon Corretto 8) https://www ...

  4. Android布局管理器-使用FrameLayout帧布局管理器显示层叠的正方形以及前景照片

    场景 Android布局管理器-使用LinearLayout实现简单的登录窗口布局: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details ...

  5. Java BigDecimal toString() 的转换和输出

    BigDecimal 的 toString() 方法将会把 BigDecimal 通过字符串的方式输出.这个方法将会在必要的时候使用指数进行输出. 具体的转换步骤是按照下面的步骤进行转换的: BigD ...

  6. AI Web 1.0

    kali:192.168.0.103 目标机:192.168.0.105 0X01 端口和目录扫描 打开目标主页没有任何信息 a) 端口扫描 只有一个80端口开启 b) 目录扫描 0x03 查看敏感目 ...

  7. Android在Activity中与Fragment中创建自定义菜单的区别

    区别就在这里,Activity中添加菜单要这样: public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R ...

  8. 出现ImportError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly ....的解决方法

    在terminal上运行gluoncv时遇到了一个报错问题. ImportError: Python is not installed as a framework. The Mac OS X bac ...

  9. 建立基于docker的编译环境

    如果我们要在一台开发主机上搭一个编译环境,我们需要安装一堆依赖库和编译工具.如果我们有多个不同的项目同时进行,这些项目的编译工具和依赖库又都不一样,如果我们把这些东西全都塞到一台机器里,会不会有冲突呢 ...

  10. Notability

    Notability 上课记笔记.听网课→Notability 有录音功能, 在原来笔记中新添加空白行(选中之后下移) Notability常用的功能总结 1.纸张有颜色2.荧光笔会盖住文字3.套索工 ...