【背景】创业小公司的行政MM负责公司所有人的薪资情况,想给大家每个月发一下工资条,又没有有效的工具,有一天突然问我会写代码吗?作为测试工程师,基本上很少接触这些内容,正好这段时间有点空闲,也在学习python,那就搞起吧
【问题分析】
选定python脚本语言,是为了更好的了解自动化测试,按照需求,需实现小功能和对问题深入理解的过程记录一下
(1)原始文件存储
起初想读取csv文件,因为有现成的csv库供使用,如果采用csv文件,只能把每项数据都出来,以文件内容的形式放到邮件里展示。这里有一个问题,其实也是困扰我好几天,如何在邮件中写汉字,这个在后面介绍一下。
(2)邮件内容展示:
对邮件内容展示有三种设想
第一种:(以文本的形式展示)
亲爱的xxx:
本月工资如下:
总工资=xxx
交税=xxx
实发工资=xxx
第二种:(以表格的形式展示)
工号 | 姓名 | 邮箱 | 身份证 | 工资月份 | 工资数量 |
100 | 张1 | [email protected] | 121232323232 | 2016-06 | 30000 |
第三种:(以文本和附件的形式展示)
亲爱的xxx:
请查看附件文件xxx
解决问题的思路
首先,先把原始文件放到csv文件里面
从里面读取
选用第一种邮件展示方式,发送普通文本,发送普通文本的方法参照邮件,这个比较容易实现
后来觉得不好,咱们来点高级的,选用第二种把,可是python中间可以插入html绘制的表格,但表格中的内容如何填写就费了很大劲,
那咱们就用第三种展现方式,主要设计到python对excel文件的读取和写入,python都提供了专门的库去使用,把原始文件的数据提取出来,对每个员工创建一个excel文件,然后发送附件
发送邮件的几种方法在之前的博文中已经实现,控制excel的博文也已经有了,结合起来就好啦,下面看看代码是什么样的把:
{code}
# -*- coding: utf-8 -*-
import xlrd
import xlwt
from datetime import date,datetime
from time import sleep
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
workbook=xlrd.open_workbook(r'C:\python27\salary.xlsx')
#打印出excel sheet 名称
text='李洪良'
#get data from salary file
salary_sheet=workbook.sheet_by_index (0)
'''
# salary_sheet.row_values(0) 文件中一行文件内容
print str(int(salary_sheet.cell(1,0).value))#number
print type(salary_sheet.cell(1,0).value)
print salary_sheet.cell(1,1).value #name
print type(salary_sheet.cell(1,1).value)
print salary_sheet.cell(1,2).value #email
print type(salary_sheet.cell(1,2).value)
print salary_sheet.cell(1,3).value #id
print type(salary_sheet.cell(1,3).value)
print salary_sheet.cell(1,4).value #month
print type(salary_sheet.cell(1,4).value)
print salary_sheet.cell(1,5).value#money
print type(salary_sheet.cell(1,5).value)
'''
for i in range(1,10):
'''creat file for everyone'''
f=xlwt.Workbook()
sheet1=f.add_sheet(u'sheet1',cell_overwrite_ok=True)
row0=[u'工号',u'姓名',u'邮箱',u'身份证',u'工资月份',u'工资数量']
for j in range(0,len(salary_sheet.row_values(0))):
sheet1.write(0,j,row0[j])
sheet1.write(1,j,salary_sheet.row(1)[j].value)
new_sheet_name=str(int(salary_sheet.cell(i,0).value))+'_'+salary_sheet.cell(i,1).value+".xls"
print new_sheet_name
f.save(new_sheet_name)
sleep(5)
'''send email with attachment'''
msg = MIMEMultipart()
text='亲爱的xxx:\n请查看附件,谢谢'
att1=MIMEText(text, "plain",'utf-8')
msg.attach(att1)
att2 = MIMEText(open(r'C:\python27'+'\\'+u'100_张1.xls', 'rb').read(), 'base64', 'gb2312')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="2016-10.xls"'
msg.attach(att2)
#加邮件头
msg['to'] = salary_sheet.cell(i,2).value
msg['from'] = '[email protected]'
msg['subject'] = "这是一个邮件".decode('utf-8')
#发送邮件
try:
server = smtplib.SMTP()
server.connect('smtp.exmail.qq.com')
server.login('[email protected]','Lhl123456')
server.sendmail(msg['from'], msg['to'],msg.as_string())
server.quit()
print '发送成功'
except Exception, e:
print str(e)
print ("==================")
{code}