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

news2024/11/24 12:10:22

简介

  本篇文章与前边没有多大关联,就是对前边有关发邮件的总结和梳理。在写脚本时,放到后台运行,想知道执行情况,会通过邮件、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服务器连接

  如果你想学习接口自动化测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的接口自动化测试教程,同时在线人数到达1000人,并且还有笔记可以领取及各路大神技术交流:798478386    

【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)_哔哩哔哩_bilibili【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)共计200条视频,包括:1.【接口自动化】目前软件测试的市场行情以及测试人员能力标准。、2.【接口自动化】全面熟练Requests库以及底层方法调用逻辑、3.【接口自动化】接口自动化实战及正则和JsonPath提取器的应用等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337&vd_source=488d25e59e6c5b111f7a1a1a16ecbe9a 

看下官方给的示例:

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

我这里测试使用本地的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 MIMEText

mail_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']=sub
    msg['From']=me
    msg['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 True
    except 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环境邮件正常发送。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/745093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

这份4577页的Java面试PDF,让我成功斩获阿里、字节等大厂offer

我为大家准备了一份超级全面的Java 学习面试笔记&#xff0c;这份电子版笔记涵盖了诸多后端技术栈的面试题和答案&#xff0c;相信可以帮助大家在最短的时间内复习Java后端的大多数技术点和面试题&#xff0c;从而拿到自己心仪的offer。共4577页。整体还是比较清爽的&#xff0…

Postman的细节回顾

之前在学校摸索着玩过postman&#xff0c;工作后要使用postman&#xff0c;发现对于很多细节&#xff0c;这里补充说明一下&#xff0c;当作使用手册。 之所以使用postman&#xff0c;是因为更便捷的查看接口情况&#xff0c;不需要每次在浏览器f12查看。 目录 1 创建请求2 测…

产品经理怎么管理项目进度?

作为在职七年的项目管理人员&#xff0c;在项目进度管理上确实有一点发言权。产品经理作为企业的核心骨干岗位之一&#xff0c;在进行项目进度管理时也会有很多问题出现&#xff0c;那么应该怎样去管理项目进度呢&#xff1f;以下是答主的一些拙见&#xff0c;有需要的朋友们就…

C. Particles

Problem - C - Codeforces 思路&#xff1a;通过题意能够知道如果移除i&#xff0c;那么i-1与i1会合成一个新的&#xff0c;同时后面的往前移动两个单位&#xff0c;并且我们发现可以让1 3 5 7 ... 2*n-1合成一个数&#xff0c;让2 4 6 8 ... 2*n合成一个数&#xff0c;同时我们…

java自我学习记录day02

java日常学习 1.继承2.super3.方法重写/覆盖4.多态5.Object类和equals的对比equals用于判断值是否相等hashCode方法toString方法finalize方法 6.刷题&#xff08;03&#xff09;题三&#xff1a;在排序数组中查找元素的第一个和最后一个位置 1.继承 如果希望指定去调用父类的某…

uniapp 小程序 filters 过滤日期

页面效果&#xff1a; <template><view class"order-intro-item"><text class"left-label">日期</text><text class"right-info time-text">{{startClearingTime | formatData}} 至 {{endClearingTime | format…

21. 斐波那契数列

链接&#xff1a; 链接 题目&#xff1a; 输入一个整数 nn &#xff0c;求斐波那契数列的第 nn 项。 假定从 00 开始&#xff0c;第 00 项为 00。 数据范围 0≤n≤390≤n≤39 样例 输入整数 n5 返回 5 思路&#xff1a; 0返回0&#xff0c;1&#xff0c;2都返回1&#xff0c;后…

数据库备份恢复和索引视图

样例表如下&#xff1a; /***************************样例表***************************/CREATE DATABASE booksDB;use booksDB;CREATE TABLE books(bk_id INT NOT NULL PRIMARY KEY,bk_title VARCHAR(50) NOT NULL,copyright YEAR NOT NULL);INSERT INTO booksVALUES (1107…

IPv6 over IPv4 之SIT隧道

一.SIT模块功能简介 SIT模块是支持ISATAP隧道和6to4隧道两种隧道模式的 ISATAP和6to4都是目前比较流行的自动建立隧道的过渡技术&#xff0c;都可以连接被IPv4隔绝的IPv6孤岛&#xff0c;都是通过将IPv4地址嵌入到IPv6地址当中&#xff0c;并将IPv6封包封装在IPv4中传送&…

第一章介绍处理器(Cortex-M7 Processor)

目录 第一章引言本章介绍处理器。 1.1关于Cortex-M7处理器 1.1.1特性 1.1.2接口 1.1.3配置选项 1.2组件模块 1.2.1数据处理单元 1.2.2预取单元 1.2.3负载存储单元 1.2.4浮点单元 1.2.5嵌套矢量中断控制器 1.2.6唤醒中断控制器 1.2.7记忆系统 1.2.8存储缓冲区 1.2.9内…

从数据中看天气变迁:Python获取历史天气数据

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 需要知识点 : 动态数据抓包 requests发送请求 结构化非结构化数据解析 开发环境 : python 3.8 运行代码 pycharm 2022.3.2 辅助敲代码 专业版 requests 发送请求 pip install requests parsel 解析数据 pip inst…

cuda中radix_sort

背景 radix_sort排序是一种经典排序&#xff0c;在gpu上都有对其进行支持&#xff0c;这里主要参考cub中的实现&#xff0c;简单介绍一种单block的情形, 本文只适合看过源码但是没有看懂的同学。 流程 在second step中完全实在ScanCounters()函数中&#xff0c;具体分为upswe…

怎样将视频中的音频提取出来? 分享三个方法!

在处理视频时&#xff0c;有时我们需要将视频中的音频提取出来&#xff0c;可能是为了编辑或处理音频&#xff0c;或者仅仅是想保存音频本身。无论是出于什么目的&#xff0c;以下是三种简单的方法来提取视频中的音频&#xff1a; 方法一&#xff1a;修改文件后缀 这是一种简…

从CTAN下载缺少的包

1、打开CTAN: Comprehensive TeX Archive Networkhttps://ctan.org/ 2、在搜索栏中输入包名&#xff0c;回车 3、点击Package tabularray 4、点击Sources 附&#xff1a; Index of /CTAN/systems/texlive/Images/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

奥威BI-金蝶云星空SaaS版一站式平台:对接数据、做分析

金蝶云星空和BI大数据分析平台都在企业数字化转型中扮演了重要的角色&#xff0c;为企业提供了全面的数字化解决方案和数据分析功能&#xff0c;两者强强联合不仅能提高部署效率&#xff0c;更能增强数据分析、数据可视化效果&#xff0c;帮助企业更好地适应市场变化和用户需求…

向量数据库Faiss的搭建与使用

向量数据库Faiss是Facebook AI研究院开发的一种高效的相似性搜索和聚类的库。它能够快速处理大规模数据&#xff0c;并且支持在高维空间中进行相似性搜索。本文将介绍如何搭建Faiss环境并提供一个简单的使用示例。 Faiss的安装 首先&#xff0c;我们需要在我们的系统上安装Fai…

方便的记事本app有哪些 快捷方便的生活记事软件推荐

生活中很多时候都需要记事&#xff0c;比如去超市要买的物品清单&#xff0c;旅行时遇到的好看的风景、有趣的事情&#xff0c;以及脑海中不经意间产生的灵感、想法或思考感悟等&#xff0c;都可以随手用记事App软件记录下来&#xff0c;以便后续查看。那方便的记事本app有哪些…

飞行动力学 - 第7节-part2-单发失效的起飞性能 之 基础点摘要

飞行动力学 - 第7节-part2-单发失效的起飞性能 之 基础点摘要 1. 单发失效2. 平衡场长3. 参考资料 1. 单发失效 前面我还在说呢&#xff0c;如果单发失效&#xff0c;那过了决策速度不就听天由命了嘛。 果然&#xff0c;这里就提到了一个开伞的问题&#xff0c;不过如果是塞斯…

Origin画科研折线图,柱状图,双Y轴折线图绘图方法

一、数据表格 1.依次点击&#xff1a;文件->新建->工作表&#xff1a;填写数据 2.数据表横纵坐标含义&#xff1a; 长名称&#xff1a;表示这一列的名称&#xff0c;绘图时会自动显示在图的标签栏上单位&#xff1a;这一列值的单位函数&#xff1a;可以添加一下函数表…

RNN、LSTM、Seq2Seq

目录 时间序列表示梯度弥散和梯度爆炸RNN&#xff08;循环神经网络&#xff09;LSTMSeq2SeqELMo 时间序列表示 核心是加入历史信息去预测下一步骤 在NLP中&#xff0c;序列维度一般是这个样子:[b,seq_len,feature_len] b个句子&#xff0c;每个句子seq_len个单词&#xff0c;…