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 相关文章推荐
详解Python3.1版本带来的核心变化
Apr 07 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
Oct 18 Python
Android应用开发中Action bar编写的入门教程
Feb 26 Python
Python中运算符"=="和"is"的详解
Oct 08 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
Apr 30 Python
python实现朴素贝叶斯算法
Nov 19 Python
python根据url地址下载小文件的实例
Dec 18 Python
python 获取图片分辨率的方法
Jan 08 Python
浅析Python3中的对象垃圾收集机制
Jun 06 Python
如何在django中运行scrapy框架
Apr 22 Python
keras的siamese(孪生网络)实现案例
Jun 12 Python
总结Python使用过程中的bug
Jun 18 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下几个常用的去空、分组、调试数组函数
2009/02/22 PHP
php $_ENV为空的原因分析
2009/06/01 PHP
php面向对象全攻略 (三)特殊的引用“$this”的使用
2009/09/30 PHP
探讨file_get_contents与curl效率及稳定性的分析
2013/06/06 PHP
在PHP程序中使用Rust扩展的方法
2015/07/03 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
Javascript模块化编程详解
2014/12/01 Javascript
JavaScript 学习笔记之操作符(续)
2015/01/14 Javascript
jQuery实现文件上传进度条特效
2015/08/12 Javascript
JS拖拽组件学习使用
2016/01/19 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
JavaScript多种图形实现代码实例
2020/06/28 Javascript
Python中函数的参数传递与可变长参数介绍
2015/06/30 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
解决python 文本过滤和清理问题
2019/08/28 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
基于python计算并显示日间、星期客流高峰
2020/05/07 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
2020/06/01 Python
python实现取余操作的简单实例
2020/08/16 Python
Booking.com英国官网:全球酒店在线预订网站
2018/04/21 全球购物
荷兰最大的儿童服装店:The Kids Republic
2019/04/13 全球购物
公司薪酬管理制度
2014/01/31 职场文书
学风建设演讲稿
2014/09/12 职场文书
2016春季小学开学寄语
2015/12/03 职场文书
八年级历史教学反思
2016/02/19 职场文书
MySQL大小写敏感的注意事项
2021/05/24 MySQL