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中使用glob和rmtree删除目录子目录及所有文件的例子
Nov 21 Python
简单上手Python中装饰器的使用
Jul 12 Python
Python作用域用法实例详解
Mar 15 Python
Python备份目录及目录下的全部内容的实现方法
Jun 12 Python
python pandas dataframe 行列选择,切片操作方法
Apr 10 Python
Python中的单继承与多继承实例分析
May 10 Python
Python 输入一个数字判断成绩分数等级的方法
Nov 15 Python
eclipse创建python项目步骤详解
May 10 Python
通过cmd进入python的实例操作
Jun 26 Python
python实现两个文件夹的同步
Aug 29 Python
python——全排列数的生成方式
Feb 26 Python
python turtle绘制多边形和跳跃和改变速度特效
Mar 16 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的ob_start();控制您的浏览器cache!
2007/02/14 PHP
利用discuz自带通行证整合dedecms的方法以及文件下载
2007/03/06 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
Laravel框架表单验证详解
2014/09/04 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
javascript修改图片src的方法
2015/01/27 Javascript
jQuery+html5实现div弹出层并遮罩背景
2015/04/15 Javascript
使用CoffeeScrip优美方式编写javascript代码
2015/10/28 Javascript
JavaScript Array对象详解
2016/03/01 Javascript
ES6中数组array新增方法实例总结
2017/11/07 Javascript
NodeJS父进程与子进程资源共享原理与实现方法
2018/03/16 NodeJs
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
js实现踩五彩块游戏
2020/02/08 Javascript
微信小程序scroll-view的滚动条设置实现
2020/03/02 Javascript
使用JS实现动态时钟
2020/03/12 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
2020/09/29 Javascript
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python实现FTP上传文件或文件夹实例(递归)
2017/01/16 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
在 Python 中接管键盘中断信号的实现方法
2020/02/04 Python
Python中Selenium库使用教程详解
2020/07/23 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
2020/08/27 Python
HTML5 实现图片上传预处理功能
2020/02/06 HTML / CSS
严选全球尖货,立足香港:Bonpont宝盆
2018/07/24 全球购物
公司部门司机岗位职责
2014/01/03 职场文书
高中学生自我评价范文
2014/09/23 职场文书
酒店辞职书范文
2015/02/26 职场文书
教学工作总结范文5篇
2019/08/19 职场文书
vue实现水波涟漪效果的点击反馈指令
2021/05/31 Vue.js
浅谈mysql返回Boolean类型的几种情况
2021/06/04 MySQL
Python使用psutil库对系统数据进行采集监控的方法
2021/08/23 Python