有时在发送文件时,需要发送附件。下面实例实现带附件的邮件。

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