python实现定时压缩指定文件夹发送邮件


Posted in Python onDecember 22, 2020

工作中每天需要收集部门内的FR文件,发送给外部部门的同事帮忙上传,这么发了有大半年,昨天亮光一闪,为什么不做成自动化呢,于是用python实现了整个流程,今天体验了一下真是美滋滋。

代码如下

首先导入需要的包

import win32com.client as win32
import datetime
import os
import zipfile

定义三个函数,都是网上抄别的同学作业来的(侵删)

邮箱用的是outlook

#压缩文件夹函数
def zip_ya(startdir,file_news):
 file_news = startdir +'.rar' # 压缩后文件夹的名字
 z = zipfile.ZipFile(file_news,'w',zipfile.ZIP_DEFLATED) #参数一:文件夹名
 for dirpath, dirnames, filenames in os.walk(startdir):
 fpath = dirpath.replace(startdir,'') #这一句很重要,不replace的话,就从根目录开始复制
 fpath = fpath and fpath + os.sep or ''#这句话理解我也点郁闷,实现当前文件夹以及包含的所有文件的压缩
 for filename in filenames:
  z.write(os.path.join(dirpath, filename),fpath+filename)
  print ('压缩成功')
 z.close()
#创建文件夹函数
def mkdir(path):
 folder = os.path.exists(path)
 if not folder:   
 os.makedirs(path)  
 print "创建文件夹成功"
 else:
 print "文件夹已存在"
#发送邮件函数
def sendmail(path):
 sub = '上传FR文件申请'
 body = '@xx,\r请帮忙上传FR文件,谢谢!'
 outlook = win32.Dispatch('outlook.application')
 receiver = ['xxx@xx.com']
 ccreceiver = ['xxx@xx.com;xxx@xx.com;xxx@xx.com;xxx@xx.com']
 mail = outlook.CreateItem(0)
 mail.To = receiver[0]
 mail.Cc = ccreceiver[0]
 mail.Subject = sub.decode('utf-8')
 mail.Body = body.decode('utf-8')
 mail.Attachments.Add(path)
 mail.Send()

文件夹名称为日期,每天脚本运行时,会新建一个明天的文件夹,并把昨天的压缩文件删除,所以先定义几个日期参数。

这里碰到一个坑,文件路径含中文时,用这个函数os.path.exists()测试都是False,即没有被识别到,用unicode(todaypath,'utf-8')转为unicode后问题解决。

#获取今天明天昨天的日期
today = datetime.date.today().strftime("%Y%m%d")
tomorrow = (datetime.date.today()+ datetime.timedelta(days=1)).strftime("%Y%m%d")
yesterday = (datetime.date.today()+ datetime.timedelta(days=-1)).strftime("%Y%m%d")

#定义文件路径
path='//tcent.cn/dfs/26.xx事业部/10.xx市场营销中心/04.xxx部/02.xxx组/FR文件上传/'
todaypath=path + today
todayfile = path + today + '.rar'
tomorrowpath=path + tomorrow
utodaypath=unicode(todaypath,'utf-8')
utodayfile=unicode(todayfile,'utf-8')
utomorrowpath=unicode(tomorrowpath,'utf-8')

#定义昨天的压缩文件
yesterdayfile=path + yesterday + '.rar'
uyesterdayfile=unicode(yesterdayfile,'utf-8')

#计算今天文件夹下的文件个数
filenum = 0 
for filename in os.listdir(utodaypath):
 filenum += 1

#创建明天的文件夹
mkdir(utomorrowpath) 

#删除昨天的压缩文件
if os.path.exists(uyesterdayfile): # 如果文件存在
 os.remove(uyesterdayfile) 
else:
 print('no such file:%s'%uyesterdayfile)

在思考如何让脚本每天自动运行时,决定采用windows定时任务配置(因为没看懂python定时器..)但是windows只能设置为每天运行,实际上周末、节假日是不需要发送邮件的,而节假日补班时需要运行任务,可以在代码端进行控制。

if条件那段就是先判断是否是空文件夹,如果没有文件就不用发了,如果有文件,再判断今天的日期,决定要不要发邮件。

#获取今天是周几
weekoftoday=datetime.date.today().weekday()
#节假日列表
holiday=['20180924','20181001','20181002','20181003','20181004','20181005']
#补班列表
workday=['20180924','20180925']

#是否是周末
isweekend=(weekoftoday == 5 or weekoftoday == 6)
#是否是小长假
isholiday=today in holiday
#是否不要补班
isworkday=today not in workday
#文件夹是否为空
isnullfile=(filenum==0)

#判断是否要压缩文件并发送邮件
#周末、工作日放假的节假日、文件夹为空时不执行
#补班的周末例外
if isnullfile:
 pass
else:
 if ((isweekend or isholiday) and isworkday ):
 pass
 else:
  #压缩今天的文件夹
  zip_ya(utodaypath,today)
  #发送邮件
  sendmail(utodayfile)

最后把这个python存成bat文件,去windows定时任务里配置即可。

@echo off 
cd D:\myprograms\sendmail
start python sendmail.py

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python编程中的文件读写及相关的文件对象方法讲解
Jan 19 Python
python模块smtplib实现纯文本邮件发送功能
May 22 Python
python实现决策树分类(2)
Aug 30 Python
python3+opencv3识别图片中的物体并截取的方法
Dec 05 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
Aug 07 Python
解决使用export_graphviz可视化树报错的问题
Aug 09 Python
TensorFlow基本的常量、变量和运算操作详解
Feb 03 Python
Jupyter Notebook打开任意文件夹操作
Apr 14 Python
Django多个app urls配置代码实例
Nov 26 Python
python基础之函数的定义和调用
Oct 24 Python
Python socket如何解析HTTP请求内容
Feb 12 Python
利用Python实现翻译HTML中的文本字符串
Jun 21 Python
python定时复制远程文件夹中所有文件
Apr 30 #Python
python实现图片转字符小工具
Apr 30 #Python
python 列表中[ ]中冒号‘:’的作用
Apr 30 #Python
python实现趣味图片字符化
Apr 30 #Python
python3对接mysql数据库实例详解
Apr 30 #Python
Python3.5局部变量与全局变量作用域实例分析
Apr 30 #Python
Python一行代码实现快速排序的方法
Apr 30 #Python
You might like
php 应用程序安全防范技术研究
2009/09/25 PHP
PHP中Date()时间日期函数的使用方法小结
2011/04/20 PHP
php 伪静态之IIS篇
2014/06/02 PHP
php封装的smartyBC类完整实例
2016/10/19 PHP
js option删除代码集合
2008/11/12 Javascript
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
js下拉选择框与输入框联动实现添加选中值到输入框的方法
2015/08/17 Javascript
详解nodejs 文本操作模块-fs模块(三)
2016/12/22 NodeJs
VueJs路由跳转——vue-router的使用详解
2017/01/10 Javascript
Angular 2父子组件数据传递之@Input和@Output详解 (上)
2017/07/05 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
vue 中directive功能的简单实现
2018/01/05 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
[01:09:40]Newbee vs Pain 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python的mysqldb安装步骤详解
2017/08/14 Python
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
ipad上运行python的方法步骤
2019/10/12 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
python实现npy格式文件转换为txt文件操作
2020/07/01 Python
python中plt.imshow与cv2.imshow显示颜色问题
2020/07/16 Python
python之语音识别speech模块
2020/09/09 Python
python help函数实例用法
2020/12/06 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
Kaufmann Mercantile官网:家居装饰、配件、户外及更多
2018/09/28 全球购物
线程的基本概念、线程的基本状态以及状态之间的关系
2012/10/26 面试题
什么是网络协议
2016/04/07 面试题
毕业生自我鉴定实例
2014/01/21 职场文书
捐助倡议书范文
2014/04/15 职场文书
实习单位评语
2014/04/26 职场文书
身边的榜样活动方案
2014/08/20 职场文书
文明倡议书
2015/01/19 职场文书
公司财务人员岗位职责
2015/04/14 职场文书
MySQL REVOKE实现删除用户权限
2021/06/18 MySQL