简介

  本篇文章与前边没有多大关联,就是对前边有关发邮件的总结和梳理。在写脚本时,放到后台运行,想知道执行情况,会通过邮件、SMS(短信)、飞信、微信等方式通知管理员,用的最多的是邮件。在linux下,Shell脚本发送邮件告警是件很简单的事,有现成的邮

件服务软件或者调用运营商邮箱服务器。

  对于Python来说,需要编写脚本调用邮件服务器来发送邮件,使用的协议是SMTP。接收邮件,使用的协议是POP3和IMAP。我想有必要说明下 ,POP3和IMAP的区别:POP3在客户端邮箱中所做的操作不会反馈到邮箱服务器,比如删除一封邮件,邮箱服务器并不

会删除。IMAP则会反馈到邮箱服务器,会做相应的操作。

  Python分别提供了收发邮件的库,smtplib、poplib和imaplib。

  本章主要讲解如果使用smtplib库实现发送各种形式的邮件内容。在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服务器连接

看下官方给的示例:

我们根据示例给自己发一个邮件测试下:

我这里测试使用本地的SMTP服务器,也就是要装一个支持SMTP协议的服务,比如sendmail、postfix等。

CentOS安装sendmail:yum install sendmail

1 >>> import smtplib
2 >>> s = smtplib.SMTP("localhost")
3 >>> tolist = ["xxx@qq.com", "xxx@163.com"]
4 >>> msg = '''\
5 ... From: Me@my.org
6 ... Subject: test
7 ... This is a test '''
8 >>> s.sendmail("me@my.org", tolist, msg)
9 {}

进入腾讯和网易收件人邮箱,就能看到刚发的测试邮件,一般都被邮箱服务器过滤成垃圾邮件,所以收件箱没有,你要去垃圾箱看看。

可以看到,多个收件人可以放到一个列表中进行群发。msg对象里From表示发件人,Subject是邮件标题,换行后输入的是邮件内容。

1.1 Python发送邮件并抄送

 1 #!/usr/bin/python
 2 # -*- coding: utf-8 -*-
 3 import smtplib
 4 def sendMail(body):
 5     smtp_server = 'smtp.163.com'
 6     from_mail = 'hongge@163.com'
 7     mail_pass = 'xxx'
 8     to_mail = ['xxx@qq.com', 'xxx@163.com']
 9     cc_mail = ['hongge@xxx.com']
10     from_name = 'monitor'
11     subject = u'监控'.encode('gbk')   # 以gbk编码发送,一般邮件客户端都能识别
12 #     msg = '''\
13 # From: %s <%s>
14 # To: %s
15 # Subject: %s
16 # %s''' %(from_name, from_mail, to_mail_str, subject, body)  # 这种方式必须将邮件头信息靠左,也就是每行开头不能用空格,否则报SMTP 554
17     mail = [
18         "From: %s <%s>" % (from_name, from_mail),
19         "To: %s" % ','.join(to_mail),   # 转成字符串,以逗号分隔元素
20         "Subject: %s" % subject,
21         "Cc: %s" % ','.join(cc_mail),
22         "",
23         body
24         ]
25     msg = '\n'.join(mail)  # 这种方式先将头信息放到列表中,然后用join拼接,并以换行符分隔元素,结果就是和上面注释一样了
26     try:
27         s = smtplib.SMTP()
28         s.connect(smtp_server, '25')
29         s.login(from_mail, mail_pass)
30         s.sendmail(from_mail, to_mail+cc_mail, msg)
31         s.quit()
32     except smtplib.SMTPException as e:
33         print "Error: %s" %e
34 if __name__ == "__main__":
35     sendMail("This is a test!")

s.sendmail(from_mail, to_mail+cc_mail, msg) 在这里注意下,收件人和抄送人为什么放一起发送呢?其实无论是收件人还是抄送人,它们收到的邮件都是一样的,SMTP都是认为收件人这样一封一封的发出。所以实际上并没有抄送这个概念,只是在邮件头加了抄送人的信息罢了!另外,如果不需要抄送人,直接把上面cc的信息去掉即可。

另外以上代码发送的邮件会出现主题中文乱码:

解决方案:三行代码即可,修改成红色框代码即可

1.2 Python发送邮件带附件

由于SMTP.sendmail()方法不支持添加附件,所以可以使用email模块来满足需求。email模块是一个构造邮件和解析邮件的模块。

先看下如何用email库构造一个简单的邮件:

message = Message()
message['Subject'] = '邮件主题'
message['From'] = from_mail
message['To'] = to_mail
message['Cc'] = cc_mail
message.set_payload('邮件内容')

基本的格式就是这样的!

继续回到主题,发送邮件带附件:

 1 # coding=utf-8
 2 #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
 3
 4 #2.注释:包括记录创建时间,创建人,项目名称。
 5 '''
 6 Created on 2019-5-9
 7 @author: 北京-宏哥
 8 Project:学习和使用邮箱发带有附件邮件
 9 '''
10 #3.导入模块
11 import smtplib
12 from email.mime.text import MIMEText
13 from email.mime.multipart import MIMEMultipart
14 from email.header import Header
15 from email import encoders
16 from email.mime.base import MIMEBase
17
18 def send_mail(file_new):
19     #-----------1.跟发件相关的参数------
20     smtpserver = 'smtp.mxhichina.com'                #发件服务器
21     port = 0                      #端口
22     username = 'noreply@cxx.cn'  #发件箱用户名
23     password = 'xx@@123'        #发件箱密码
24     sender = 'noreply@cxx.cn'    #发件人邮箱
25     receiver = ['hongge@cedex.cn','1918991791@qq.com'] #收件人邮箱
26     # ----------2.编辑邮件的内容------
27     #读文件内容
28     f = open(file_new, 'rb')
29     mail_body = f.read()
30     f.close()
31     # 邮件正文是MIMEText
32     body = MIMEText(mail_body, 'html', 'utf-8')
33     # 邮件对象
34     msg = MIMEMultipart()
35     msg['Subject'] = Header("自动化测试报告", 'utf-8').encode()#主题
36     msg['From'] = Header(u'测试机 <%s>'%sender)                #发件人
37     msg['To'] = Header(u'测试负责人 <%s>'%receiver)            #收件人
38     msg['To'] = ';'.join(receiver)
39     msg.attach(body)
40     # # MIMEBase表示附件的对象
41     att = MIMEText(mail_body, "base64", "utf-8")
42     att["Content-Type"] = "application/octet-stream"
43     # filename是显示附件名字
44     att["Content-Disposition"] = 'attachment; filename="test_report.html"'
45     msg.attach(att)
46     # ----------3.发送邮件------
47     try:
48         smtp = smtplib.SMTP()
49         smtp.connect(smtpserver)  # 连服务器
50         smtp.login(sender, password)
51     except:
52         smtp = smtplib.SMTP_SSL(smtpserver, port)
53         smtp.login(sender, password)  # 登录
54     smtp.sendmail(sender, receiver, msg.as_string())  # 发送
55     smtp.quit()
56
57 if __name__ == "__main__":
58     #本地文件的路径
59     att_path= r'E:\pythontest\text.txt'
60     send_mail(att_path)

1.3 Python发送HTML邮件

 1 # coding=utf-8
 2 #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
 3
 4 #2.注释:包括记录创建时间,创建人,项目名称。
 5 '''
 6 Created on 2019-5-9
 7 @author: 北京-宏哥
 8 Project:学习和使用邮箱发HTML邮件
 9 '''
10 #3.导入模块
11 #"-*- coding: utf-8 -*-"
12 import smtplib
13 from email.mime.text import MIMEText
14
15 mail_user="XXX@163.com"
16 mail_password="******q1125"
17 mailto_list=["1918991791<1918991791@qq.com>","2014816656@qq.com"]
18 mail_host="smtp.163.com"
19 mail_postfix="163.com"
20
21 def sendmail(to_list,sub,content):
22     me="北京-宏哥"+"<"+mail_user+"@"+mail_postfix+">"
23     msg=MIMEText("<a href='https://www.cnblogs.com/du-hong'><font color='red'>北京-宏哥</font></a>","html","utf-8")
24     msg['Subject']=sub
25     msg['From']=me
26     msg['To']=",".join(to_list)
27     try:
28         server=smtplib.SMTP()
29         server.connect(mail_host)
30         server.login(mail_user,mail_password)
31         server.sendmail(me,to_list,msg.as_string())
32         server.close()
33         return True
34     except Exception as e:
35         print (str(e))
36         return False
37 if sendmail(mailto_list,"标题:发送的是html格式","<a href='https://www.cnblogs.com/du-hong'>北京-宏哥</a>"):
38     print ("done!")
39 else:
40     print ("falsed!")

1.4 Python发送图片邮件

# coding=utf-8
#1.先设置编码,utf-8可支持中英文,如上,一般放在第一行#2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2019-5-9
@author: 北京-宏哥
Project:学习和使用1邮箱发HTML邮件
'''
#3.导入模块
#"-*- coding: utf-8 -*-"
import smtplib
from email.mime.text import MIMETextmail_user="@@@@@163.com"
mail_password="@@@@"
mailto_list=["1918991791<1918991791@qq.com>","2014816656@qq.com"]
mail_host="smtp.163.com"
mail_postfix="163.com"def sendmail(to_list,sub,content):me="北京-宏哥"+"<"+mail_user+"@"+mail_postfix+">"msg=MIMEText('<html><body><img hidefocus="true" class="index-logo-src" src="//www.baidu.com/img/bd_logo1.png" width="270" height="129" usemap="#mp"></body></html>', 'html', 'utf-8')msg['Subject']=submsg['From']=memsg['To']=",".join(to_list)try:server=smtplib.SMTP()server.connect(mail_host)server.login(mail_user,mail_password)server.sendmail(me,to_list,msg.as_string())server.close()return Trueexcept Exception as e:print (str(e))return False
if sendmail(mailto_list,"标题:发送的是HTML格式","<a href='https://www.cnblogs.com/du-hong'>北京-宏哥</a>"):print ("done!")
else:print ("falsed!")

上面发邮件的几种常见的发邮件方法基本满足日常需求了。

小结

1、linux环境下提示AttributeError: module 'smtplib' has no attribute 'SMTP',Windows环境运行代码也报如下错误:

2、原因当然不是模块的问题,检查了一下拼写也没有出问题,最后在这个帖子(链接)的启发下发现,发现自己的文件命名为email.py,和模块中的函数有冲突,改名之后Linux环境邮件正常发送。

转载于:https://www.cnblogs.com/du-hong/p/10831304.html

python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上(详解)...相关推荐

  1. python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上

    简介 本篇文章与前边没有多大关联,就是对前边有关发邮件的总结和梳理.在写脚本时,放到后台运行,想知道执行情况,会通过邮件.SMS(短信).飞信.微信等方式通知管理员,用的最多的是邮件.在linux下, ...

  2. python 邮件_Python发送邮件(常见四种邮件内容)

    在写脚本时,放到后台运行,想知道执行情况,会通过邮件.SMS(短信).飞信.微信等方式通知管理员,用的最多的是邮件.在linux下,Shell脚本发送邮件告警是件很简单的事,有现成的邮件服务软件或者调 ...

  3. python接口自动化(十二)--https请求(SSL)(详解)

    简介 本来最新的requests库V2.13.0是支持https请求的,但是一般写脚本时候,我们会用抓包工具fiddler,这时候会 报:requests.exceptions.SSLError: [ ...

  4. python接口自动化(十)--post请求四种传送正文方式(详解)

    简介 post请求我在python接口自动化(八)–发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等.我们要知道post请求四种传送正文方式首先需要先了 ...

  5. 【Visual C++】游戏开发笔记三十二 浅墨DirectX提高班之一 DirectX大局观认知篇

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:  http://blog.csdn.net/zhmxy555/article/details/8172615 作者:毛星云(浅 ...

  6. python接口自动化(十六)--参数关联接口后传(详解)

    简介 大家对前边的自动化新建任务之后,接着对这个新建任务操作了解之后,希望带小伙伴进一步巩固胜利的果实,夯实基础.因此再在沙场实例演练一下博客园的相关接口.我们用自动化发随笔之后,要想接着对这篇随笔操 ...

  7. python接口自动化(十五)--参数关联接口(详解)

    简介 我们用自动化新建任务之后,要想接着对这个新建任务操作,那就需要用参数关联了,新建任务之后会有一个任务的Jenkins-Crumb,获取到这个Jenkins-Crumb,就可以通过传这个任务Jen ...

  8. python接口自动化(十八)--重定向(Location)(详解)

    简介 在实际工作中,有些接口请求完以后会重定向到别的url,而你却需要重定向前的url.URL主要是针对虚拟空间而言,因为不是自己独立管理的服务器,所以无法正常进行常规的操作.但是自己又不希望通过主域 ...

  9. python接口自动化(十四)--session关联接口(详解)

    简介 上一篇cookie绕过验证码模拟登录博客园,但这只是第一步,一般登录后,还会有其它的操作,如发帖,评论等等,这时候如何保持会话呢?这里我以jenkins平台为例,给小伙伴们在沙场演练一下. se ...

最新文章

  1. c++强大还是python强大-如果C++很强大,为什么它不及Java、Python流行?
  2. 滞后分析rstudio_使用RStudio进行A / B测试分析
  3. android webview权限申请_Android WebView 获取定位权限的问题。
  4. 域名防系统+独立接口池+独立会员+独立权限
  5. JSF实现文件下载功能
  6. HTML5 保存画布
  7. 添加类别html页面,WordPress分类/标签/页面的url链接添加html后缀
  8. WiFi 空口抓包工具 --- OmniPeek
  9. 利用手机设置路由器密码
  10. mysql 数据库和实例_mysql中数据库和数据库实例的概念区别
  11. python怎么变成动图_python 生成动图
  12. 红石外汇 RedstoneFX|每日汇评:日元在央行温和数据发布后,等待美国关键通胀数据
  13. java排序算法(一)冒泡排序
  14. 第031讲:永久存储,腌制一缸美味的泡菜 | 学习记录(小甲鱼零基础入门学习Python)
  15. 5 打印选课学生名单 (25分)
  16. restapi是什么意思_网上整理的对于Rest和Restful api的理解
  17. 买菜App综合服务水平排行:盒马、多点、每日优鲜排前三
  18. 计算机表格边框,高会《职称计算机》Word 2007:设置表格边框和底纹
  19. MyBatis从入门到精通(九):MyBatis高级结果映射之一对一映射
  20. 网络基础:套接字编程,UDP和TCP通信程序

热门文章

  1. 后置三摄!郭明錤再曝新一代iPhone:屏幕变化不大
  2. linux分区par,linux基础篇(磁盘分区)
  3. centos7网卡编辑_CentOS7网卡命名中碰到的一个坑
  4. 使用go制作微服务数据计算
  5. vs2015 vs2017 编译zlib库
  6. linux C语言调用Intel处理器CPUID指令的实例
  7. shell学习笔记二则:统计空间
  8. 与图片相关的几个库的编译
  9. python判断linux中文件是否存在_linux shell 中判断文件、目录是否存在的方法
  10. 【java】java 并发编程 Condition 源码分析