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案例代码
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = '**********@163.com'
receivers = ['#######@163.com']
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:无法发送邮件")
1.1.3 常用邮件发送方式案例
"如果我们本机没有 sendmail 访问,也可以使用其他邮件服务商的 SMTP 访问(QQ、网易、Google等)。"
import smtplib
from email.mime.text import MIMEText
from email.header import Header
mail_host = "smtp.163.com"
mail_user = "**********@163.com"
mail_pass = "***************"
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("邮件发送失败!!")
1.1.4 发送HTML格式的邮件
import smtplib
from email.mime.text import MIMEText
from email.header import Header
mail_host = "smtp.163.com"
mail_user = "**********@163.com"
mail_pass = "***************"
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("无法发送邮件!!")
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头信息、下载速度等,利用这些信息可以定位服务响应慢的具体环节,下面详细进行说明月。
1.cmd--python 查看自己python的版本
2.https://www.lfd.uci.edu/~gohlke/pythonlibs/
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
"1.安装源码curl"
1.wget http://curl.haxx.se/download/curl-7.36.0.tar.gz
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
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()
c.setopt(pycurl.CONNECTTIMEOUT,5)
c.setopt(pycurl.TIMEOUT,5)
c.setopt(pycurl.NOPROGRESS,0)
c.setopt(pycurl.MAXREDIRS,5)
c.setopt(pycurl.FORBID_REUSE,1)
c.setopt(pycurl.FRESH_CONNECT,1)
c.setopt(pycurl.DNS_CACHE_TIMEOUT,60)
c.setopt(pycurl.URL,"http://www.baidu.com")
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")
c.setopt(pycurl.WRITEFUNCTION,getbody)
c.setopt(pycurl.WRITEHEADER,fileobj)
c.setopt(pycurl.WRITEDATA,fileobj)
getinfo(option)方法,对应libcurl包中的curl_easy_getinfo方法,参数option是通过libcurl的常量来指定的。
下面列举常用的常量列表:
c = pycurl.Curl()
c.getinfo (pycurl.HTTP_CODE)
c.getinfo (pycurl.TOTAL_TIME)
c.getinfo (pycurl.NAMELOOKUP_TIME)
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)
"我们利用libcurl包提供的这些常量值来达到探测Web服务质量的目的"
1.2.3 实现探测Web服务质量
import os,sys
import time
import pycurl
URL = "http://www.baidu.com"
c = pycurl.Curl()
c.setopt(pycurl.URL,URL)
c.setopt(pycurl.CONNECTTIMEOUT,5)
c.setopt(pycurl.TIMEOUT,5)
c.setopt(pycurl.FORBID_REUSE,1)
c.setopt(pycurl.MAXREDIRS,1)
c.setopt(pycurl.DNS_CACHE_TIMEOUT,30)
indexfile = open(os.path.dirname(os.path.realpath(__file__))+"/content.txt","wb")
c.setopt(pycurl.WRITEHEADER,indexfile)
c.setopt(pycurl.WRITEDATA,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)
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)
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))
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
"""