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 相关文章推荐
netbeans7安装python插件的方法图解
Dec 24 Python
Python中的引用和拷贝浅析
Nov 22 Python
在Python中处理XML的教程
Apr 29 Python
简单的连接MySQL与Python的Bottle框架的方法
Apr 30 Python
基于Python 的进程管理工具supervisor使用指南
Sep 18 Python
python下如何查询CS反恐精英的服务器信息
Jan 17 Python
python爬虫_自动获取seebug的poc实例
Aug 05 Python
Python基于回溯法子集树模板实现8皇后问题
Sep 01 Python
Flask框架响应、调度方法和蓝图操作实例分析
Jul 24 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
Aug 23 Python
解决 jupyter notebook 回车换两行问题
Apr 15 Python
Python爬虫中Selenium实现文件上传
Dec 04 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中foreach循环中使用引用要注意的地方
2011/01/02 PHP
php解析url的三个示例
2014/01/20 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
2016/08/12 PHP
php使用正则表达式去掉html中的注释方法
2016/11/03 PHP
php实现产品加入购物车功能(1)
2020/07/23 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
2019/09/30 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
jquery里的正则表达式说明
2011/08/03 Javascript
JS清除IE浏览器缓存的方法
2013/07/26 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
Bootstrap每天必学之表单
2015/11/23 Javascript
jQuery实现根据滚动条位置加载相应内容功能
2016/07/18 Javascript
原生js实现倒计时功能(多种格式调用)
2017/01/12 Javascript
JavaScript实现图片无缝滚动效果
2017/07/07 Javascript
使用JS实现图片轮播的实例(前后首尾相接)
2017/09/21 Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
2017/11/22 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
python数据结构树和二叉树简介
2014/04/29 Python
Python的Django框架中设置日期和字段可选的方法
2015/07/17 Python
Python简单定义与使用二叉树示例
2018/05/11 Python
python使用matplotlib模块绘制多条折线图、散点图
2020/04/26 Python
关于python多重赋值的小问题
2019/04/17 Python
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
2019/07/22 Python
Python一键安装全部依赖包的方法
2019/08/12 Python
Pycharm Git 设置方法
2020/09/15 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
企业车辆管理制度
2014/01/24 职场文书
大家检讨书5000字
2014/02/03 职场文书
博士生导师推荐信
2014/07/08 职场文书
公务员党员评议表自我鉴定
2014/09/14 职场文书
行政介绍信范文
2015/05/04 职场文书
css3实现的加载动画效果
2021/04/07 HTML / CSS
大型强子对撞机再次重启探索“第五种自然力”
2022/04/29 数码科技