四、python-smtplib|pycurl模块

1.1 发送电子邮件模块smtplib

1.1.1 smtp模块常用类与方法
·SMTP.connect([host[,port])方法,连接远程smtp主机方法,hos为远程主机地址,port为远程主机smtp端口,默认25,也可以直接使用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, rept_options])方法,实现邮件的发送功能,参数依次为是发件人、收件人、邮件内容,
例如:
	SMTP.sendmail("python_2014@163.com","demo@domail.com",body)
  其中body内容定义如下:
	"""From: python_2014@163.com
	To: demo@domail.com
	Subject: test mail
	test mail body"""
·SMTP.starttls([keyfile[, certfile])方法,启用TLS(安全传输)模式代,所有SMTP指令都将加密传输,例如使用gmail的smp服务时需要启动此项才能正正常发送邮件
例如:
	SMTP.starttls()。
	DSMTP.quit()方法,断开smtp服务器的连接。
                
----个性化邮件方法
·email.mime.multipart.MIMEMultipart([_subtype[, boundary[, _subparts[,_params]]]])
作用是生成包含多个部分的邮件体的MIME对象,参数_subtype指定要添加到
"Content-type:multipart/subtype"报头的可选的三种子类型,分别为1mixed、related、alternative默认值为mixed。
定义mixed实现构建一个带附件的邮件体;
定义related实现构建内嵌资源的邮件体;
定义alternative则实现现构建纯文本与超文本共存的邮件体。
"""
·email.mime.audio.MIMEAudio (_audiodata[, _subtype[, _encoder[, **_partams]]),创建
包含音频数据的邮件体,audiodata包含原始二进制音频数据的字节字符串。
·email.mime.image.MIMEImage(_imagedata[, _subtype[, _encoder[, **params]]),创建
包含图片数据的邮件体,_imagedata是包含原始图片数据的字节字符串。
·email.mime.text.MIMEText (_text[,_subtype[,_charset]),创建包含义文本数据的邮件体,
text是包含消息负载的字符串,subtype指定文本类型,支持plain(默认值)或html
类型的字符串。
"""
1.1.2 smtplib案例代码
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = '**********@163.com'    #邮件发起者
receivers = ['#######@163.com']       #收件人
# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
message = MIMEText('Python 邮件发送测试...','plain','utf-8')
message['From'] = Header("Devops",'utf-8')     #发送者
message['To'] = Header("学习测试",'utf-8')      #接收者
subject = "Python SMTP 邮件测试!!!"
message['Subject'] = Header(subject,'utf-8')
try:
    smtpObj = smtplib.SMTP('localhost')
    smtpObj.sendmail(sender,receivers,message.as_string())
    print("邮件发送成功!!!")
except smtplib.SMTPException:
    print("Error:无法发送邮件")

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vciuCV4z-1687946395519)(D:\py-资料\assetss\image-20230321163624835.png)]

1.1.3 常用邮件发送方式案例
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
"如果我们本机没有 sendmail 访问,也可以使用其他邮件服务商的 SMTP 访问(QQ、网易、Google等)。"
import smtplib
from email.mime.text import MIMEText
from email.header import Header

#第三方smtp服务
mail_host = "smtp.163.com"    #设置邮件服务器地址
mail_user = "**********@163.com"
mail_pass = "***************"       #此处为pop密码

sender = "**********@163.com"  #发件人
receviers = ['#######@163.com'] #接收人

message = MIMEText('Python 邮件发送测试...','plain','utf-8')
message['From'] = Header("Devops")     #发送者
message['To'] = Header("学习测试")      #接收者
subject = 'Python SMTP 邮件测试!!!'    #邮件主题
message['Subject'] = Header(subject,'utf-8')
try:
    smtpObj = smtplib.SMTP()
    smtpObj.connect(mail_host,25)
    smtpObj.login(mail_user,mail_pass)
    smtpObj.sendmail(sender,receviers,message.as_string())
    print("邮件发送成功!")
except smtplib.SMTPException:
    print("邮件发送失败!!")

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gZGFcsgg-1687946395521)(D:\py-资料\assetss\image-20230628175853281.png)]

1.1.4 发送HTML格式的邮件
import smtplib
from email.mime.text import MIMEText
from email.header import Header
#第三方smtp服务
mail_host = "smtp.163.com"    #设置邮件服务器地址
mail_user = "**********@163.com"
mail_pass = "***************"       #此处为pop密码

sender = "**********@163.com"  #发件人
receviers = ['#########@163.com'] #接收人

mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="http://www.baidu.com">这是一个链接</a></p>
"""
#会将网站封装为一个可点击跳转的连接
message = MIMEText(mail_msg,'html','utf-8')
message['From'] = Header("leader--薛晓强",'utf-8')     #发送者
message['To'] = Header("html测试")      #接收者
subject = 'Python SMTP 邮件测试!!!'    #邮件主题
message['Subject'] = Header(subject,'utf-8')

try:
    smtpObj = smtplib.SMTP()
    smtpObj.connect(mail_host, 25)
    smtpObj.login(mail_user, mail_pass)
    smtpObj.sendmail(sender,receviers,message.as_string())
    print("邮件发送成功!")
except smtplib.SMTPException:
    print("无法发送邮件!!")

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Feszm3Si-1687946395522)(D:\py-资料\assetss\image-20230628175738300.png)]

1.2 探测Web服务质量方法

1.2.1 pycurl模块介绍
pycurl(http://pycurl.sourceforge.net)是一个用C语言写的libcurl Python实现,功能非常强大.
支持的操作协议有FTP、HTTP、HTTPS、TELNET等,可以理解成Linux下curl命令功能的Python封装,简单易用。
通过调用pycurl提共的方法,实现探测Web服务质量的情况:
	比如响应的HTTP状态码、请求延时、HTTP头信息、下载速度等,利用这些信息可以定位服务响应慢的具体环节,下面详细进行说明月。
#模块安装(windows):
1.cmd--python 查看自己python的版本
2.https://www.lfd.uci.edu/~gohlke/pythonlibs/#pycurl     #下载对应版本的pycurl,此处我下载的是cp37.amd64
3.下载的whl文件,放到桌面
4.cmd--
C:\Users\LENOVO\Desktop>pip install pycurl-7.45.1-cp37-cp37m-win_amd64.whl
Processing c:\users\lenovo\desktop\pycurl-7.45.1-cp37-cp37m-win_amd64.whl
Installing collected packages: pycurl
Successfully installed pycurl-7.45.1
#出现succesfully即为成功(需要自己pycharm的虚拟环境python解释器环境和)
#修改本地python系统环境需要修改环境变量,确保cmd打开的为你自己python的解释器版本

#模块安装(linux):
"1.安装源码curl"
1.wget http://curl.haxx.se/download/curl-7.36.0.tar.gz             #要求curl-config包支持
2.tar -zxvf curl-7.36.0.tar.gz
3.cd curl-7.36.0
4../configure
5.make && make install
6.export LD_LIBRARY_PATH=/usr/local/lib


"2.安装pycurl"
1.wget https://pypi.python.org/packages/source/p/pycurl/pycurl-7.19.3.1.tar.gz --no-check-certificate
2.tar -zxvf pycurl-7.19.3.1.tar.gz
3.cd pycurl-7.19.3.1
4.python3 setup.py install --curl-config=/usr/local/bin/curl-config
#5.yum install python3-devel                   --如果报错则需要输入此命令
1.2.2 pycurl常用方法
close()方法:对应libcurl包中的curl_easy_cleanup方法,无参数,实现关闭、回收Curl对象。

perform()方法:对应libcurl包中的curl_easy_perform方法,无参数,实现Curl对象请求的提交。

setopt(option,value)方法:对应libcurl包中的curl_easy_setopt方法,参数option是通过libcurl的常量来指定的,参数value的值会依赖option,可以是一个字符串、整型长整型、文件对象、列表或函数等。

"下面列举常用的常量列表:"
import pycurl
url = "www.kuaidaili.com"
print(pycurl.version)
c = pycurl.Curl() #创建一个curl对象
c.setopt(pycurl.CONNECTTIMEOUT,5)  #连接的等待时间,设置为0则不等待
c.setopt(pycurl.TIMEOUT,5) #请求超时时间
c.setopt(pycurl.NOPROGRESS,0)  ##是否屏蔽下载进度条,非0则屏蔽
c.setopt(pycurl.MAXREDIRS,5)  #指定HTTP重定向的最大数
c.setopt(pycurl.FORBID_REUSE,1) #完成交互后强制断开连接,不重用
c.setopt(pycurl.FRESH_CONNECT,1)  ##强制获取新的连接,即替代缓存中的连接
c.setopt(pycurl.DNS_CACHE_TIMEOUT,60)  ##设置保存DNS信息的时间,默认为120秒
c.setopt(pycurl.URL,"http://www.baidu.com")  #指定请求的url
c.setopt(pycurl.USERAGENT,"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36")
##配置请求HTTP头的User-Agent
c.setopt(pycurl.WRITEFUNCTION,getbody)  #将返回的内容定向到回调函数getbody
c.setopt(pycurl.WRITEHEADER,fileobj)   ##将返回的HTTPHEADER定向到fileobj文件对象
c.setopt(pycurl.WRITEDATA,fileobj)    #将返回的HTML内容定向到fileobj文件对象

getinfo(option)方法,对应libcurl包中的curl_easy_getinfo方法,参数option是通过libcurl的常量来指定的。
下面列举常用的常量列表:
c = pycurl.Curl()       #创建一个curl对象
c.getinfo (pycurl.HTTP_CODE)    #返回的HTTP状态码
c.getinfo (pycurl.TOTAL_TIME)  #传输结束所消耗的总时间
c.getinfo (pycurl.NAMELOOKUP_TIME) #DNS解析所消耗的时间
c.getinfo(pycurl.CONNECT_TIME)  #建立连接所消耗的时间
c.getinfo (pycurl.PRETRANSFER_TIME)  #从建立连接到准备传输所消耗的时间
c.getinfo (pycurl.STARTTRANSFER_TIME) #从建立连接到传输开始消耗的时间
c.getinfo(pycurl.REDIRECT_TIME) #重定向所消耗的时间
c.getinfo (pycurl.SIZE_UPLOAD) #上传数据包大小
c.getinfo (pycurl.SIZE_DOWNLOAD) #下载数据包大小
c.getinfo(pycurl.SPEED_DOWNLOAD) #平均下载速度
c.getinfo (pycurl.SPEED_UPLOAD) #平均上传速度
c.getinfo(pycurl.HEADER SIZE) #HTTP头部大小
"我们利用libcurl包提供的这些常量值来达到探测Web服务质量的目的"
1.2.3 实现探测Web服务质量
#!/bin/env python
#-*- coding: UTF-8 -*-
import  os,sys
import time
import pycurl
URL = "http://www.baidu.com"
c = pycurl.Curl()
c.setopt(pycurl.URL,URL)   #请求的url常量
c.setopt(pycurl.CONNECTTIMEOUT,5)  #定义请求连接的等待时间
c.setopt(pycurl.TIMEOUT,5)    #请求超时时间
c.setopt(pycurl.FORBID_REUSE,1) #完成交互后强制断开连接,不重用
c.setopt(pycurl.MAXREDIRS,1) #HTTP重定向的最大次数
c.setopt(pycurl.DNS_CACHE_TIMEOUT,30)   #DNS的ttl时间为30s
#创建一个文件对象,以"wb"方式打开,存储返回的http头部喝页面内容
indexfile = open(os.path.dirname(os.path.realpath(__file__))+"/content.txt","wb")
#以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
#当前文件路径下新建content.txt文件以二进制方式打开
c.setopt(pycurl.WRITEHEADER,indexfile)  #将返回http header重定向到indexfile文件对象中
c.setopt(pycurl.WRITEDATA,indexfile)  #将返回的HTMl定向到indexfile中
try:
    c.perform()   #提交请求
except Exception as e:
    print("connection error:"+str(e))
    indexfile.close()
    #关闭文件
    c.close()
    #关闭请求
    exit(0)

NAMELOOUP_TIME = c.getinfo(pycurl.NAMELOOKUP_TIME) #获取DNS解析时间
CONNECT_TIME = c.getinfo(pycurl.CONNECT_TIME) #获取建立连接时间
PRETRANSFER_TIME = c.getinfo(pycurl.PRETRANSFER_TIME) #从建立连接到准备传输所消耗的时间
STARTTRANSFER_TIME = c.getinfo(pycurl.STARTTRANSFER_TIME) #从建立连接到传输开始消耗的时间

TOTAL_TIME = c.getinfo(pycurl.TOTAL_TIME) #总传输的时间

HTTP_CODE = c.getinfo(pycurl.HTTP_CODE)  #http状态码
SIZE_DOWNLOAD = c.getinfo(pycurl.SIZE_DOWNLOAD) #下载数据包的大小
HEADER_SIZE = c.getinfo(pycurl.HEADER_SIZE)  #头部大小
SPEED_DOWNLOAD = c.getinfo(pycurl.SPEED_DOWNLOAD) #评价下载大小
print("HTTP状态码:%s" %(HTTP_CODE))
print("DNS解析时间:%.2f ms" %(NAMELOOUP_TIME * 1000))
print("建立连接时间:%.2f ms" %(CONNECT_TIME * 1000))
print("准备传输时间:%.2f ms" %(PRETRANSFER_TIME * 1000))           #因为1000ms为1秒而机器返回的为ms所以*1000
print("传输开始时间:%.2f ms" %(STARTTRANSFER_TIME * 1000))
print("传输结束时间:%.2f ms" %(TOTAL_TIME * 1000))
print("下载数据包大小:%d bytes/s" %(SIZE_DOWNLOAD))
print("HTTP头部大小:%d byte" %(HEADER_SIZE))
print("平均下载速度:%d bytes/s" %(SPEED_DOWNLOAD))
indexfile.close()
#关闭文件否则导致文件内容有误
c.close()
#关闭请求
"""
result:
HTTP状态码:200
DNS解析时间:28.15 ms
建立连接时间:61.45 ms
准备传输时间:61.76 ms
传输开始时间:107.48 ms
传输结束时间:288.78 ms
下载数据包大小:380544 bytes/s
HTTP头部大小:1183 byte
平均下载速度:1317782 bytes/s
"""

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运维神经科主任

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值