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 相关文章推荐
100行Python代码实现自动抢火车票(附源码)
Jan 11 Python
python使用tcp实现局域网内文件传输
Mar 20 Python
python 通过 socket 发送文件的实例代码
Aug 14 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
Python实现钉钉发送报警消息的方法
Feb 20 Python
Python 列表去重去除空字符的例子
Jul 20 Python
python socket通信编程实现文件上传代码实例
Dec 14 Python
解决Windows下python和pip命令无法使用的问题
Aug 31 Python
python实现AHP算法的方法实例(层次分析法)
Sep 09 Python
Numpy ndarray 多维数组对象的使用
Feb 10 Python
利用Python如何画一颗心、小人发射爱心
Feb 21 Python
Python人工智能之混合高斯模型运动目标检测详解分析
Nov 07 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图片上传存储源码并且可以预览
2011/08/26 PHP
php无限极分类实现的两种解决方法
2013/04/28 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
2014/07/18 PHP
php中Session的生成机制、回收机制和存储机制探究
2014/08/19 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
2019/09/12 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
浏览器无法运行JAVA脚本的解决方法
2008/01/09 Javascript
用js实现下载远程文件并保存在本地的脚本
2008/05/06 Javascript
JavaScript中实现块作用域的方法
2010/04/01 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
js预加载图片方法汇总
2015/06/15 Javascript
js实现卡片式项目管理界面UI设计效果
2015/12/08 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
2017/03/30 Javascript
微信小程序 swiper组件构建轮播图的实例
2017/09/20 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
angularjs通过过滤器返回超链接的方法
2018/10/26 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
Layui事件监听的实现(表单和数据表格)
2019/10/17 Javascript
[52:44]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第一场 6.3
2018/06/04 DOTA
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
Python图算法实例分析
2016/08/13 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
用Python 爬取猫眼电影数据分析《无名之辈》
2020/07/24 Python
浅析pandas随机排列与随机抽样
2021/01/22 Python
HTML5打开本地app应用的方法
2016/03/31 HTML / CSS
日本整理专家Marie Kondo的官方在线商店:KonMari
2020/06/29 全球购物
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
《小小雨点》教学反思
2014/02/18 职场文书
团代会闭幕词
2015/01/28 职场文书
自主招生专家推荐信
2015/03/26 职场文书
2016学习雷锋精神活动倡议书
2015/04/27 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书
聊聊SpringBoot自动装配的魔力
2021/11/17 Java/Android