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中for循环详解
Jan 17 Python
Python struct模块解析
Jun 12 Python
八大排序算法的Python实现
Jan 28 Python
virtualenv实现多个版本Python共存
Aug 21 Python
python距离测量的方法
Mar 06 Python
Python3.7实现中控考勤机自动连接
Aug 28 Python
python的debug实用工具 pdb详解
Jul 12 Python
Django框架ORM数据库操作实例详解
Nov 07 Python
opencv-python 读取图像并转换颜色空间实例
Dec 09 Python
解决tensorflow打印tensor有省略号的问题
Feb 04 Python
Python脚本导出为exe程序的方法
Mar 25 Python
python 爬取小说并下载的示例
Dec 07 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
zend framework文件上传功能实例代码
2013/12/25 PHP
php命名空间学习详解
2014/02/27 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
2018/04/08 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
JQuery动态给table添加、删除行 改进版
2011/01/19 Javascript
各浏览器对click方法的支持差异小结
2011/07/31 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
实例说明为什么不要行内使用javascript
2014/04/18 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
超棒的响应式布局jQuery插件Freetile.js
2014/11/17 Javascript
JS基于HTML5的canvas标签实现炫目的色相球动画效果实例
2016/08/24 Javascript
JavaScript toUpperCase()方法使用详解
2016/08/26 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
原生js开发的日历插件
2017/02/04 Javascript
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
2017/08/24 Javascript
Vue+Element-U实现分页显示效果
2020/11/15 Javascript
使用Python中的cookielib模拟登录网站
2015/04/09 Python
Python2.x版本中cmp()方法的使用教程
2015/05/14 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
2019/01/14 Python
python selenium执行所有测试用例并生成报告的方法
2019/02/13 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
2020/06/18 Python
Matplotlib 绘制饼图解决文字重叠的方法
2020/07/24 Python
Python如何批量生成和调用变量
2020/11/21 Python
Python字符串的15个基本操作(小结)
2021/02/03 Python
机关财务管理制度
2014/01/17 职场文书
《学棋》教后反思
2014/04/14 职场文书
优秀党支部申报材料
2014/12/24 职场文书
2015毕业实习推荐信
2015/03/23 职场文书
单位实习介绍信
2015/05/05 职场文书
公司辞职信模板
2015/05/13 职场文书
金砖之国观后感
2015/06/11 职场文书