Pyhton模块学习

rrdtool:

rrdtool
可直接用pip install python-rrdtool

import rrdtool

创建:
create(...)
create(args..): Set up a new Round Robin Database
create filename [--start|-b start time] [--step|-s step] [DS:ds-name:DST:heartbeat:min:max] [RRA:CF:xff:steps:rows]
filename:是rrd的文件名,可以以rrd结尾。
--step:rrdtool期望每隔多长事件收到一个值,默认是5分钟。
--start:rrdtool第一个记录的起始时间,rrdtool不会接收任何数据的时间小于起始时间。例如你在update时给出的时间小于起始时间,则rrdtool会拒绝该值
DS:DS用于定义数据源,是用来存放结果的变量名。该变量名在画图时会用到。
DST:用来设置数据源的类型,有COUNTER、GUAGE、DERIVE、ABSOLUTE、COMPUTE等5种类型。
COUNTER:数值必须是递增的
DERIVE:和COUNTER类似,不过数据可递增可递减
ABSOLUTE:他每次假定前一个时间间隔的值是0,然后计算平均值
GAUGE:不做任何变化,直接存入rra中
COMPUTE:他不接收具体值,而是定义一个表达式,然后算出某个值
heartbeat:
min:
max:
RRA:rra指定数据如何存放,他可以保存不同时间间隔的数据。力图每5分钟产生一条数据,这样一小时就是12条,如果每30分钟一条数据,这样一小时就是两条数据,这样一天,一年下来会有很多条数据,但是rrd数据库的大小是固定的,所以就有一个合并数据的方式了。这就是rra的功能。合并方式由CF指定。
CF:CF就是用来设置数据合并的功能,有AVERAGE、MAX、MIN、LAST等4种类型,分别表示对PDP取平均、最大、最小、当前值。
xff:xff字段设置一个比例值,rrdtool会把多个PDP合并为一个CDP,如果这写PDP中有值为UNKNOW的PDP,那么CDP的值该怎么计算,xff就是设置一个比例,当PDP中UNKNOW的比例超过多少是,就无法合成正常的CPD,合成的CPD值也为UNKNOW。
steps:表示多少个PDP合成一个CDP
rows:表示总共存多少个CDP?也就是可以保存多少数据?
PDP:在每个规定的时间间隔内rrdtool都会收到一个值,rrdtool在收到该值后,根据DST的设置,会计算出另一个值,这个值就是PDP。
CDP:rrdtool使用多个PDP合并出一个CDP,也就是执行CF的后果,然后把这个CDP的值存入rra中。



查看第一次/最后一次数据更新时间:

first(...)
first(filename): Return the timestamp of the first data sample in an RRD
last(...)
last(filename): Return the timestamp of the last data sample in an RRD

查看rrd结构信息:
info(...)
info(filename): extract header information from an rrd
取出rrd的值:
fetch(...)
fetch(args..): fetch data from an rrd.
fetch filename CF [--resolution|-r resolution] [--start|-s start] [--end|-e end]
filename:要取出数据的rrd文件
--start:可选,默认是end-1day
--end:可选,默认是now
CF:AVERAGE、MAX、MIN、LAST。前提是你的rrd中有该类型的rra才可以。

更新rrd数据:
update(...)
update(args..): Store a new set of values into the rrd
update filename [--template|-t ds-name[:ds-name]...] N|timestamp:value[:value...] [timestamp:value[:value...] ...]
filename:要更新的rrd文件
--template:
-t ds-name[:ds-name]:设置更新那个DS的数据
N|timestamp:时间戳,表示数据在哪个时间点采集的,N表示now。
value[:value...]:一个rrd文件可以有多个DS,所以一次update可以更新多个value。
update插入值后,并不会有返回,无法知道插入是否正常,可以用updatev
带返回值的插入:
updatev(...)
updatev is called in the same manner as update
和update类似,不过每次插入后会返回一个状态码。

画图:
graph(...)
graph(args..): Create a graph based on data from one or several RRD
graph filename [-s|--start seconds] [-e|--end seconds] [-x|--x-grid x-axis grid and label] [-y|--y-grid y-axis grid and label] [--alt-y-grid] [--alt-y-mrtg] [--alt-autoscale] [--alt-autoscale-max] [--units-exponent] value [-v|--vertical-label text] [-w|--width pixels] [-h|--height pixels] [-i|--interlaced] [-f|--imginfo formatstring] [-a|--imgformat GIF|PNG|GD] [-B|--background value] [-O|--overlay value] [-U|--unit value] [-z|--lazy] [-o|--logarithmic] [-u|--upper-limit value] [-l|--lower-limit value] [-g|--no-legend] [-r|--rigid] [--step value] [-b|--base value] [-c|--color COLORTAG#rrggbb] [-t|--title title] [DEF:vname=rrd:ds-name:CF] [CDEF:vname=rpn-expression] [PRINT:vname:CF:format] [GPRINT:vname:CF:format] [COMMENT:text] [HRULE:value#rrggbb[:legend]] [VRULE:time#rrggbb[:legend]] [LINE{1|2|3}:vname[#rrggbb[:legend]]] [AREA:vname[#rrggbb[:legend]]] [STACK:vname[#rrggbb[:legend]]]
filename:图片的名称,默认是PNG格式
--start:图片X轴数据的起始时间
--end:图片X轴数据的结束时间
--x-grid x-axis grid and label:
--y-grid y-axis grid and label:
--alt-y-grid
--alt-y-mrtg
--alt-autoscale
--alt-autoscale-max
--units-exponent
--vertical-label text Y轴的文字说明
--width pixels X轴的大小
--height pixels Y轴的大小
--interlaced
--imginfo formatstring
--imgformat GIF|PNG|GD 图片格式
--background value
--overlay value
--unit value
--lazy
--logarithmic
--upper-limit value Y轴数据值的上限,默认会自动调整Y轴的数字
--lower-limit value Y轴数据值的下限
--no-legend 取消图表下方的图例
--rigid 严格按照upper-limit/lower-limit来绘制
--step value
--base value 默认1K=1000 可以调整1K=1024
--color COLORTAG#rrggbb
--title title 图表上方的标题
DEF:vname=rrd:ds-name:CF 定义绘图用的数据源,也就是从那个RRD中取数据,因为RRA有多种类型,所以需要指定CF
CDEF:vname=rpn-expression 定义合并值,
PRINT:vname:CF:format
GPRINT:vname:CF:format 在图表的下方输出最大值、最小值之类
COMMENT:text 用来输出一些字符串
HRULE:value#rrggbb 在图表上绘制水平线
VRULE:time#rrggbb 在图表上绘制垂直线
LINE{1|2|3}:vname 使用线条来绘制vname的数据图
AREA:vname 使用方块来绘制vname的数据图
STACK:vname

-------------------------------------------------------------------------

模块之psutil操作

psutil
可直接用pip install psutil


psutil.cpu_times() #显示cpu的整个信息

获取单项值
psutil.cpu_times() .user #如果要只但看那个的话就在后边加上.xxx就行了

获取cpu的逻辑个数
psutil.cpu_count()
获取cpu的物理个数
psutil.cpu_count( logical=False )
读取内存信息
linux系统内存利用率信息涉及to-tal(内存总数),used(以使用内存),free(空闲内存),buffers(缓冲使用数)
cache(缓存使用数),swap(交换分区使用数),分别使用psutil.virtual_memory()与psuti.swap_memory()方法获取
import psutil
mem = psutil.virtual_memory() #获取内存的完整信息
mem.total #获取内存总数
mem.free #获取空闲的内存信息
获取swap分区信息
psutil.swap_memory()
读取磁盘参数
磁盘利用率使用psutil.disk_usage方法获取,磁盘IO信息包括read_count(读IO数),write_count(写IO数)
read_bytes(IO写字节数),read_time(磁盘读时间),write_time(磁盘写时间),这些IO信息用psutil.disk_io_counters()
获取磁盘的完整信息
psutil.disk_partitions()
获取分区表的参数
psutil.disk_usage('/') #获取/分区的状态
获取硬盘IO总个数
psutil.disk_io_counters()
获取单个分区IO个数
psutil.disk_io_counters(perdisk=True) #perdisk=True参数获取单个分区IO个数
读取网络信息
网络信息与磁盘IO信息类似,涉及到几个关键点,包括byes_sent(发送字节数),byte_recv=xxx(接受字节数),
pack-ets_sent=xxx(发送字节数),pack-ets_recv=xxx(接收数据包数),这些网络信息用psutil.net_io_counters()
psutil.net_io_counters() #获取网络总IO信息
psutil.net_io_counters(pernic=True) #pernic=True输出网络每个接口信息--------------------------------------每个接口信息
获取当前系统用户登录信息
psutil.users()
获取开机时间
import psutil, datetime
psutil.boot_time() #以linux时间格式返回
datetime.datetime.fromtimestamp(psutil.boot_time ()).strftime("%Y-%m-%d %H: %M: %S") #转换成自然时间格式

系统进程管理
获取当前系统的进程信息,获取当前英语程序的运行状态,包括进程的启动时间,查看设置CPU亲和度,内存使用率,IO信息
socket连接,线程数等
获取进程信息
psutil模块在获取进程方面有很好的支持,使用psutil.pids()方法获取所有进程的PID,
使用psutil.Process()方法获取单个进程的名称,路径状态等
查看系统全部进程
psutil.pids()
查看单个进程
p = psutil.Process(2423)
p.name() #进程名
p.exe() #进程的bin路径
p.cwd() #进程的工作目录绝对路径
p.status() #进程状态
p.create_time() #进程创建时间
p.uids() #进程uid信息
p.gids() #进程的gid信息
p.cpu_times() #进程的cpu时间信息,包括user,system两个cpu信息
p.cpu_affinity() #get进程cpu亲和度,如果要设置cpu亲和度,将cpu号作为参考就好
p.memory_percent() #进程内存利用率
p.memory_info() #进程内存rss,vms信息
p.io_counters() #进程的IO信息,包括读写IO数字及参数
p.connectios() #返回进程列表
p.num_threads() #进程开启的线程数
听过psutil的Popen方法启动应用程序,可以跟踪程序的相关信息
from subprocess import PIPE
p = psutil.Popen(["/usr/bin/python", "-c", "print('hello')"],stdout=PIPE)
p.name()
p.username()

----------------------------------------------------------------------

模块之_pymysql操作

格式:
conn=MySQLdb.connect(host="localhost",user="root",passwd="sa",db="mytable",charset="utf8")

比较常用的参数包括
1.host:数据库主机名.默认是用本地主机.
2.user:数据库登陆名.默认是当前用户.
3.passwd:数据库登陆的秘密.默认为空.
4.db:要使用的数据库名.没有默认值.
5.port:MySQL服务使用的TCP端口.默认是3306.
6.charset:数据库编码.


然后,这个连接对象也提供了对事务操作的支持,标准的方法
commit() 提交
rollback() 回滚

 

3.执行sql语句和接收返回值

cursor=conn.cursor()

n=cursor.execute(sql,param)

首先,我们用使用连接对象获得一个cursor对象,接下来,我们会使用cursor提供的方法来进行工作.这些方法包括两大类:1.执行命令,2.接收返回值

 

cursor用来执行命令的方法:

callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
executemany(self, query, args):执行单条sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
nextset(self):移动到下一个结果集


cursor用来接收返回值的方法:

fetchall(self):接收全部的返回结果行.
fetchmany(self, size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.
fetchone(self):返回一条结果行.
scroll(self, value, mode='relative'):移动指针到某一行.如果mode='relative',则表示从当前所在行移动value条,如果mode='absolute',则表示从结果集的第一行移动value条.

 

 

 

#再来执行一个查询的操作

cursor.execute("select * from cdinfo")

#我们使用了fetchall这个方法.这样,cds里保存的将会是查询返回的全部结果.每条结果都是一个tuple类型的数据,这些tuple组成了一个tuple

cds=cursor.fetchall()

#因为是tuple,所以可以这样使用结果集

print cds[0][3]

#或者直接显示出来,看看结果集的真实样子

print cds

 

#如果需要批量的插入数据,就这样做

sql="insert into cdinfo values(0,%s,%s,%s,%s,%s)"

#每个值的集合为一个tuple,整个参数集组成一个tuple,或者list

param=((title,singer,imgurl,url,alpha),(title2,singer2,imgurl2,url2,alpha2))

#使用executemany方法来批量的插入数据.这真是一个很酷的方法!

n=cursor.executemany(sql,param)

 

4.关闭数据库连接

需要分别的关闭指针对象和连接对象.他们有名字相同的方法

cursor.close()

conn.close()

 

------------------------------------

连接时可设置编码,以便显示中文:
>>> conn = pymysql.connect('127.0.0.1','root','111111','mytest',charset ='utf8')

游标
>>> cur = conn.cursor()

使用数据库
>>> cur.execute('USE python')
0

执行插入数据,可按字段顺序写入数据
>>> cur.execute("INSERT INTO users VALUES(1,'loutsx'),(2,'小张')")
可以这样操作:
cur.execute("INSERT INTO users(id,name) VALUES(3,'中国')")

如果插入的数据有中文,执行脚本会的告警提示,可在创建表的时候设置编码为utf8
Warning (from warnings module):
File "C:Python34libsite-packagespymysqlcursors.py", line 161
result = self._query(query)
Warning: Incorrect string value: 'xE5xA5xA5xE6x9Ex97...' for column '客户' at row 1


以下是一个例子,读取Excel中的数据,并存储到mysql中:
-----------------------------------------------------
import xlrd
import pymysql

def get_xls():
data = xlrd.open_workbook('s.xls')
sheets = data.sheet_names()
table = data.sheets()[0]
rows = table.nrows
conn = pymysql.connect('127.0.0.1','root','111111','mytest',charset='utf8')------------这里要设置编码为utf8
cur = conn.cursor()
cur.execute("DROP TABLE VRF")
db = 'CREATE TABLE VRF(RD VARCHAR(255),VRF名称 VARCHAR(255),客户 VARCHAR(255)) charset ="utf8"'
insert = "INSERT INTO VRF VALUES(%s,%s,%s)"
cur.execute(db)
for i in range(1,rows):
line = table.row_values(i)
print(line)
cur.execute(insert,line)
cur.close()
conn.commit()
conn.close()

get_xls()
print('ok')
------------------------------------------------------

------------------------------------
下面的代码是一个完整的例子.

#使用sql语句,这里要接收的参数都用%s占位符.要注意的是,无论你要插入的数据是什么类型,占位符永远都要用%s
sql="insert into cdinfo values(%s,%s,%s,%s,%s)"
#param应该为tuple或者list
param=(title,singer,imgurl,url,alpha)
#执行,如果成功,n的值为1
n=cursor.execute(sql,param)
------------------------------------

执行查询操作
>>> cur.execute('select * from users')
2

>>> data = cur.fetchall()
>>> data
((1, 'loutsx'), (2, '小张'))
>>> for i in data:
print(i)


(1, 'loutsx')
(2, '小张')

关闭游标
>>> cur.close()

提交事务,不提交mysql中没有相关数据
>>> conn.commit()

关闭连接
>>> conn.close()

 

--------------------------------------------------------------------

模块之_IP地址操作

可直接通过pip下载IPy,或者在Python上下载后安装

from IPy import *

IPy.INT_TYPES IPy.IPV6_TEST_MAP IPy.MAX_IPV4_ADDRESS IPy.collections IPy.sys
IPy.IP IPy.IPint IPy.MAX_IPV6_ADDRESS IPy.intToIp IPy.types
IPy.IPSet IPy.IPv4ranges IPy.STR_TYPES IPy.parseAddress IPy.xrange
IPy.IPV6_MAP_MASK IPy.IPv6ranges IPy.bisect IPy.py

ips = IPy.IP('192.168.0.0/30')-------可用迭代的方式获取IP信息


ips.NoPrefixForSingleIp
ips.iptype() 检查是否公网IP地址
ips.prefixlen() 检查掩码的长度
ips.strFullsize() 得到IP的字符串方式
ips.WantPrefixLen()
ips.len()  获取IP地址数量,等同于len(ips)
ips.reverseName() 获取目标IP的反射信息
ips.strHex()
ips.broadcast() 获取广播地址
ips.make_net()
ips.reverseNames() 获取所有IP的反向信息
ips.strNetmask()   获取目标IP的掩码,字符串
ips.get_mac()
ips.net()
ips.strBin()   获取目标IP的二进制方式,字符串
ips.strNormal() 获取目标IP的信息,字符串,参数有0-3
ips.int() 同 ips.ip ,同ips.strDec(),字符方式
ips.netmask
ips.strCompressed() 获取目标IP的信息,字符串,等同于ips.strNormal(1)
ips.v46map
ips.overlaps() 确认一个IP是否在另一段内
ips.version

-----------------------------------------------------------------------

模块之_excel操作

python Excel模块
针对 03版excel(xls结尾的),我们可以使用xlrd读,xlwt包来写
针对 07版excel(xlsx结尾的),我们可以使用openpyxl来操作读写excel

xlrd,xlwt和xlutils是用Python处理Excel文档(*.xls)的高效率工具。
其中,xlrd只能读取xls,xlwt只能新建xls(不可以修改)
xlutils能将xlrd.Book转为xlwt.Workbook,从而得以在现有xls的基础上修改数据,并创建一个新的xls,实现修改


可直接通过pip方式下载

也可以直接下载:
xlwt的下载地址https://pypi.python.org/pypi/xlwt3
xlrd的下载地址https://pypi.python.org/pypi/xlrd3
openpyx1的下载地址https://pypi.python.org/pypi/openpyxl


#读取excel使用(支持03)
import xlrd
#写入excel使用(支持03)
import xlwt3
#读取execel使用(支持07)
from openpyxl import Workbook
#写入excel使用(支持07)
from openpyxl import load_workbook

------属性和方法-----------------------
xlrd
Book(class) 由xlrd.open_work("example.xls")返回
nsheets: sheets数
sheet_names: sheet名称列表
sheets: sheet列表
sheet_by_index(sheetx): 按序号提取sheet
sheet_by_name(sheet_name): 按名称提取sheet

Sheet(class) 由Book object相关方法返回
name:                         sheet名
nrows: 行数
ncols: 列数
cell(rowx,colx): 第rows行colx列的单元格
cell_type(rowx,colx): 数据类型
cell_value(rows,colx): 数值
col(colx): 第colx列所有单元格组成的列表
col_slice(colx,start_rowx=0,end_rowx=None): 第colx列指定单元格组成的列表
col_types(colx,start_rowx=0,end_rowx=None): 第colx列指定单元格数值类型组成的列表
col_values(colx,start_rowx=0,end_rowx=None): 第colx列指定单元格数值组成的列表
row同样有col的各项操作,此处略去

Cell(class) 由Sheet object(s)相关方法返回
ctype: 一个int型变量,对应不同的数值类型
value: 单元格的值


xlwt
Workbook(class) 由xlwt.Workbook()返回
encoding: 编码方案
add_sheet(sheet_name): 添加sheet
get_sheet(Sheet_name): 选择sheet
save(file_name): 保存

Worksheet(class) 由Workbook object相关方法返回
write(rows,colx,cell_value,style): 编辑单元格
row(rowx).write(colx,cell_value,style): 编辑行
flush_row_data(): 减少内存压力,flush之前行不可再修改
col(colx),write(rows,cell_value,style): 编辑列


xlutils
copy: 将xlrd.Book转为xlwt.Workbook
styles: 读取xlrd.Workbook的每一个单元格的style
display: 简单而安全地呈现xlrd读取的数据
filter: 拆分与整合多个xls文件
margins: 查看表格稀疏程度
save: 序列化xlrd.Book,转存为binary xls或stream


Tips
1. xlrd.open_workbook(fomatting_info=):当formatting_info=Ture,读取workbook并保留格式
2. xlrd.open_workbook(on_demand=): 当on_demand=True,只有被要求时才将worksheet载入内存,读取大文件时使用
3. xlwt.Worksheet.flush_row_data(): 减少内存占用,被刷新的行不能再访问或修改,建议每1000行刷新一次(若列很多当调整)
4. xlwt.Workbook(encoding=): 选择创建的workbook的编码




<span style="font-family: 'courier new', courier;">
import xlrd
import xlwt
from xlutils.copy import copy

# xlrd
book = xlrd.open_workbook("example.xls", formatting_info=True, on_demand=True)
sheet = book.sheet_by_index(0)
cell = sheet.cell(0,0)

# xlwt
workbook = xlwt.Workbook()
workbook.encoding = "utf-8" # Equals to workbook = xlwt.Workbook(encoding="utf-8")
sheet = workbook.add_sheet("Sheet1", cell_overwrite_ok=True)
style = xlwt.easyxf(
"font: name Arial;"
"pattern: pattern solid, fore_colour red;"
)
sheet.write(0, 0, "content of this cell", style)
sheet.row(0).set_style(style)
workbook.save("example.xls")

#xlutils
workbook = copy(book)
</span>


*********************************************************
******** 2003版本的操作 ********
*********************************************************


打开一个表格
data = xlrd.open_workbook(path)

返回表格中的sheet名称,多个名称返回一个列表
sheets=data.sheet_names()

获取一个工作表
① table = data.sheets()[0] #通过索引顺序获取
② table = data.sheet_by_index(0) #通过索引顺序获取
③ table = data.sheet_by_name(u'Sheet1')#通过名称获取

获取整行和整列的值(返回数组)
复制代码 代码如下:
table.row_values(i) ----返回行数的内容,i为行数索引,返回列表
table.col_values(i) ----返回列数的内容,i为行数索引,返回列表

获取行数和列数------这是属性,没有()
table.nrows
table.ncols

获取单元格
table.cell(0,0).value
table.cell(2,3).value
以上命令等同于:
table.cell_value(0,0)

使用行列索引
cell_A1 = table.row(0)[0].value
cell_A2 = table.col(1)[0].value

>>> table.row(0)[1]--------不加Value得到一个完整的数据
text:'IP Address'
>>> table.row(0)[1].value
'IP Address'
>>> table.row(0)
[text:'订单编号', text:'IP Address', text:'操作时间']

---------------------------------------------

写入操作:

打开一个表格,建议用ascii编码,不然可能会有一些诡异的现象。
wb=xlwt3.Workbook(encoding = 'ascii')

增加一个sheet
sheet=wb.add_sheet("xlwt3数据测试表")

写入数据table.write(行,列,value)
table.write(0,0,'test')

# 如果对一个单元格重复操作,会引发
# returns error:
# Exception: Attempt to overwrite cell:
# sheetname=u'sheet 1' rowx=0 colx=0
# 所以在打开时加cell_overwrite_ok=True解决

table = file.add_sheet('sheet name',cell_overwrite_ok=True)

保存到文件中
wb.save(path)


# 另外,使用style
style = xlwt.XFStyle() # 初始化样式
font = xlwt.Font() # 为样式创建字体
font.name = 'Times New Roman'
font.bold = True
style.font = font #为样式设置字体
table.write(0, 0, 'some bold Times text', style) # 使用样式

-----实例----------------
可以写入一个不存在的文件中,会自动创建一个文件
>>> wb = xlwt.Workbook()
>>> sheet = wb.add_sheet('另一个测试')
>>> value = [['姓名','性别','身高','三围'],['张三','男','190','45'],['李四','男','160','95']]
>>> for i in range(len(value)):
for j in range(len(value[i])):
sheet.write(i,j,value[i][j])
wb.save('d:/2.xls')
print('ok')

ok
ok
ok
>>>

 

*********************************************************
******** 2007版本的操作 ********
*********************************************************
打开一个表格
data1 = load_workbook(path)

返回表格中的sheet名称,多个名称返回一个列表
sheets = data1.get_sheet_names()

获取一个工作表
stable = data1.get_sheet_by_name('ddd')#通过名称获取


row=ws.get_highest_row()
col=ws.get_highest_column()
print("列数: ",ws.get_highest_column())
print("行数: ",ws.get_highest_row())

for i in range(0,row):
for j in range(0,col):
print(ws.rows[i][j].value," ",end="")


获取整行和整列的值(返回数组)
复制代码 代码如下:
table.row_values(i) ----返回行数的内容,i为行数索引,返回列表
table.col_values(i) ----返回列数的内容,i为行数索引,返回列表

获取行数和列数------这是属性,没有()
table.nrows
table.ncols

获取单元格
table.cell(0,0).value
table.cell(2,3).value
以上命令等同于:
table.cell_value(0,0)

---------------------------------------------------------------------

模块之_Mail操作

import smtplib
from email.mime.text import MIMEText

sender = 'syother@163.com'
passwd = '1qaz2wsx'
receivers = ['loutsx@163.com']

#连接服务器
server = smtplib.SMTP('smtp.163.com',25)

#登录认证
server.login(sender,passwd)

#邮件内容
msg1 = '''
hello loutsx:
this is python test mail script,
I try the script is sucesess!
'''
#这里plain是类型,可设置为html
#格式:MIMEText(_text,_subtype='plain',_charset=None)
msg = MIMEText(msg1,'plain','utf-8')
#定义邮件头
msg['From'] = 'syother<syother@163.com>'
msg['To'] = u'loutsx <loutsx@163.com>'
msg['Subject'] = u'python mail'
#发送邮件,msg.as_string())这里将内容转换为字串
server.sendmail('syother@163.com','loutsx@163.com',msg.as_string())

 

'''
------------另一种方式---------------------------
msg = MIMEText('asdasdf','plain','utf-8')
msg['From'] = 'syother@163.com'
msg ['To'] = 'loutsx@163.com'
msg['Subject'] = u'测试Python'
def mail():
server = smtplib.SMTP('smtp.163.com',25)
server.login('syother@163.com','1qaz2wsx')
server.sendmail('syother@163.com','loutsx@163.com',msg.as_string())

------------------------------------------------------

还可以发送HTML/IMG的邮件,发送带附件的邮件

 

import smtplib
from email.mime.text import MIMEText

sender = 'syother@163.com'
passwd = '1qaz2wsx'
receivers = ['loutsx@163.com'] 

#连接服务器
server = smtplib.SMTP('smtp.163.com',25)

#登录认证
server.login(sender,passwd)

#邮件内容
msg1 = '''
hello loutsx:
this is python test mail script,
I try the script is sucesess!
'''
#这里plain是类型,可设置为html
#格式:MIMEText(_text,_subtype='plain',_charset=None)
msg = MIMEText(msg1,'plain','utf-8')
#定义邮件头
msg['From'] = 'syother<syother@163.com>'
msg['To'] = u'loutsx <loutsx@163.com>'
msg['Subject'] = u'python mail'
#发送邮件,msg.as_string())这里将内容转换为字串
server.sendmail('syother@163.com','loutsx@163.com',msg.as_string())



'''
------------另一种方式---------------------------
msg = MIMEText('asdasdf','plain','utf-8')
msg['From'] = 'syother@163.com'

msg ['To'] = 'loutsx@163.com'
msg['Subject'] = u'测试Python'
def mail():
    server = smtplib.SMTP('smtp.163.com',25)
    server.login('syother@163.com','1qaz2wsx')
    server.sendmail('syother@163.com','loutsx@163.com',msg.as_string())

------------------------------------------------------

  

原文地址:https://www.cnblogs.com/syother/p/6773588.html