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两种遍历字典(dict)的方法比较
May 29 Python
python实现通过pil模块对图片格式进行转换的方法
Mar 24 Python
json跨域调用python的方法详解
Jan 11 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
Dec 08 Python
python绘制简单折线图代码示例
Dec 19 Python
Python3并发写文件与Python对比
Nov 20 Python
python实现ip地址的包含关系判断
Feb 07 Python
Django更新models数据库结构步骤
Apr 01 Python
Python API 操作Hadoop hdfs详解
Jun 06 Python
Scrapy项目实战之爬取某社区用户详情
Sep 17 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
Dec 07 Python
python爬虫破解字体加密案例详解
Mar 02 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防范SQL注入的具体方法详解(测试通过)
2014/05/09 PHP
destoon官方标签大全
2014/06/20 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
2014/09/10 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
PHP常用函数总结(180多个)
2016/12/25 PHP
javascript 写类方式之五
2009/07/05 Javascript
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
JS封装的选项卡TAB切换效果示例
2016/09/20 Javascript
webpack 2的react开发配置实例代码
2017/07/28 Javascript
解决Vue2.0 watch对象属性变化监听不到的问题
2018/09/11 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
2018/11/14 jQuery
jQuery实现简单弹幕制作
2020/12/10 jQuery
[01:48]完美圣典齐天大圣至宝宣传片
2016/12/17 DOTA
[01:07:15]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第二场 1月25日
2021/03/11 DOTA
简单谈谈Python中的json与pickle
2017/07/19 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
2018/09/04 Python
一篇文章弄懂Python中所有数组数据类型
2019/06/23 Python
Python flask框架post接口调用示例
2019/07/03 Python
Django-Model数据库操作(增删改查、连表结构)详解
2019/07/17 Python
python flask web服务实现更换默认端口和IP的方法
2019/07/26 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
python 多线程死锁问题的解决方案
2020/08/25 Python
Python内存泄漏和内存溢出的解决方案
2020/09/26 Python
使用gunicorn部署django项目的问题
2020/12/30 Python
2014年圣诞节倒计时网页的制作过程
2014/12/05 HTML / CSS
跨域修改iframe页面内容详解
2019/10/31 HTML / CSS
Snapfish英国:在线照片打印和个性化照片礼品
2017/01/13 全球购物
德国购买踏板车网站:Microscooter
2019/10/14 全球购物
三星法国官方网站:Samsung法国
2019/10/31 全球购物
高中毕业自我鉴定
2013/12/19 职场文书
职工年度考核评语
2014/12/31 职场文书
2015年妇女工作总结
2015/05/14 职场文书
掌握这项技巧,一年阅读300本书不是梦
2019/09/12 职场文书
Python利用zhdate模块实现农历日期处理
2022/03/31 Python