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下paramiko模块实现ssh连接登录Linux服务器
Jun 03 Python
Python中属性和描述符的正确使用
Aug 23 Python
详解Python之数据序列化(json、pickle、shelve)
Mar 30 Python
NumPy 如何生成多维数组的方法
Feb 05 Python
python2.6.6如何升级到python2.7.14
Apr 08 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
Apr 10 Python
Python对数据进行插值和下采样的方法
Jul 03 Python
numpy向空的二维数组中添加元素的方法
Nov 01 Python
pytorch自定义二值化网络层方式
Jan 07 Python
基于梯度爆炸的解决方法:clip gradient
Feb 04 Python
Python中的Cookie模块如何使用
Jun 04 Python
Python3爬虫中Ajax的用法
Jul 10 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版 汉字转码的实现详解
2013/06/09 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
php json转换相关知识(小结)
2018/12/21 PHP
Apply an AutoFormat to an Excel Spreadsheet
2007/06/12 Javascript
JavaScript 解析读取XML文档 实例代码
2009/07/07 Javascript
jquery通过a标签删除table中的一行的代码
2013/12/02 Javascript
JS中怎样判断undefined(比较不错的方法)
2014/03/27 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/08/22 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
2015/08/18 Javascript
原生javascript实现图片无缝滚动效果
2016/02/12 Javascript
浅析JS原型继承与类的继承
2016/04/07 Javascript
js将json格式的对象拼接成复杂的url参数方法
2016/05/25 Javascript
JS实现的简单图片切换功能示例【测试可用】
2017/02/14 Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
2017/12/14 Javascript
vue2.0实现移动端的输入框实时检索更新列表功能
2018/05/08 Javascript
[53:52]OG vs EG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python编写电话薄实现增删改查功能
2016/05/07 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
Flask-WTF表单的使用方法
2019/07/12 Python
查看jupyter notebook每个单元格运行时间实例
2020/04/22 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
python3中数组逆序输出方法
2020/12/01 Python
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
电子商务自荐书范文
2014/01/04 职场文书
初中化学教学反思
2014/01/23 职场文书
爱国演讲稿500字
2014/05/04 职场文书
2014年车间主任工作总结
2014/12/10 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
征求意见函
2015/06/05 职场文书
终止解除劳动合同证明书
2015/06/17 职场文书
护士心得体会范文
2016/01/25 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python
JavaScript实现简单计时器
2021/06/22 Javascript
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS
了解Kubernetes中的Service和Endpoint
2022/04/01 Servers
JavaScript原型链中函数和对象的理解
2022/06/16 Javascript