有时在发送文件时,需要发送附件。下面实例实现带附件的邮件。
send_mail.py
#coding=utf-8
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
#发送邮箱
sender = 'testingwtb@126.com'
#接收邮箱
receiver = 'xiaoming@126.com'
#发送邮箱服务器
smtpserver = 'smtp.126.com'
#发送邮箱用户/密码
username = 'testingwtb@126.com'
password = '123456'
msgRoot = MIMEMultipart('related')
#邮件主题
msgRoot['Subject'] = 'Python email test'
#构造附件
att = MIMEText(open('E:\\test_object\\report\\log.txt', 'rb').read(), 'base64',
'utf-8')
att["Content-Type"] = 'application/octet-stream'
att["Content-Disposition"] = 'attachment; filename="log.txt"'
msgRoot.attach(att)
smtp = smtplib.SMTP()
smtp.connect('smtp.126.com')
smtp.login(username, password)
smtp.sendmail(sender, receiver, msgRoot.as_string())
smtp.quit()
与上一个实例相比,通过 MIMEMultipart 模块构造带附件的邮件,附件本身同样使用 MIMEText()方法
定义路径和格式。
查找最新的测试报告
我们已经可以通过 Python 编写发邮件程序了,现在要解决的问题如何在 report\目录下找到最新生
成的测试报告。
new_file.py
#coding=utf-8
import os
#定义文件目录
result_dir = 'E:\\test_object\\report'
lists=os.listdir(result_dir)
#重新按时间对目录下的文件进行排列
lists.sort(key=lambda fn: os.path.getmtime(result_dir+"\\"+fn))
print ('最新的文件为: '+lists[-1])
file = os.path.join(result_dir,lists[-1])
print file
首先定义测试报告的目录 result_dir ,通过 os.listdir()可以获取目录下的所有文件。这也只是获
取一个目录下的所有文件而已,我们最重要的任务是找到目录下最新生成的文件。
lists.sort(key=lambda fn: os.path.getmtime(result_dir+"\\"+fn))
在这短短的一行代码中包含了不少的 Python 知识,下面我们来逐一分析这段代码中的知识点。
=============================================================================
1 、lambda 函数
Lambda 函数又叫匿名函数,下面通过一个例子来看普通函数和匿名函数的区别:
Python Shell
#普通函数
>>> def fun(x):
return x*2
>>> print fun(5)
10
#匿名函数
>>> f = lambda x:x*2
>>> print f(5)
10
用 lambda 来声明匿名函数,冒号(:)前面 x 表示入参,冒号后面 x*2 表示返回值。lambda 和普通
的函数相比,省去了函数名称,“匿名函数”也是由此而来。
2 、sort 方法
lists.sort()
Python 列表有一个内置的列表。sort()方法用于改变列表中元素的位置。还有一个 sorted()内置函
数,建立了一种新的迭代排序列表。
Python Shell
>>> ls = ['cc','dd','bb','aa']
#对数据进行排序
>>> ls.sort()
#打印排序后的数组
>>> print ls
['aa', 'bb', 'cc', 'dd'] print f(5)
key=lambda fn:
key 是带一个参数的函数,用来为每个元素提取比较值. 默认为 None, 即直接比较每个元素
lambda 提供了一个运行时动态创建函数的方法。我这里创建了 fn 函数。
下面一个小例子来演示通过 sort()方法对一数组进排序:
Python Shell
#定位一个数组
>>> ls=['c.txt','b.txt','d.txt','a.txt']
>>> ls
['c.txt', 'b.txt', 'd.txt', 'a.txt']
#取数组中的 key 做排序
>>> ls.sort(key=lambda lists:lists[0])
>>> print ls
['a.txt', 'b.txt', 'c.txt', 'd.txt']
>>> ls.sort(key=lambda lists:lists[1])
>>> print ls
['c.txt', 'b.txt', 'd.txt', 'a.txt']
lists:lists[0] 表示取的是每个元组中的前半部分,即为:c、b、d、a ,所以可进行排序。
lists:lists[1] 表示取的是每个元组中的后半部分,即为:txt ,不能有效的进行排序规律,所以
按照数组的原样输出。
3 、getmtime 方法
os.path.getmtime()
getmtime()返回文件列表中最新文件的时间(最新文件的时间最大,所以我们会得到一个最大时间)
=============================================================================
通过上面一行代码的作作,lists 中的文件按照进间重时行的排列组合。如果想获最新的文件就取
lists[-1]。
通过 os.path.join()方法可以将文件目录与文件名进行拼接,从而打印出目录下最新文件的绝对路
径。这正是我们想要的,执行 new_file.py 文件,打印结果如下:
Python Shell
>>> ================================ RESTART ================================
>>>
最新的文件为: 2015-01-27 22_10_14result.html
E:\test_object\report\2015-01-27 22_10_14result.html