前言

在工作中,有时会有一些定期需要执行的任务或在将来某一天需要执行的任务,为避免疏漏,设计个小工具,发邮件提醒自己去处理.

方案简介

1.建立一个Excel文件,里面定义好待提醒的任务

2.建立一个记事本文件,里面输入待接收邮件的邮箱账号

3.采用Python编写代码,读取Excel文件,检查是否该发送提醒邮件,如果需要提醒,则发出邮件给接收人。

4.把python编写的代码,打包成exe可执行文件

5.采用Windows的定时任务作业,调度打包好的exe文件

适用环境:

1.Windows平台

2.已经配置好可以收发邮件的Outlook

详细方案:

1.Excel名称:Task.xlsx,sheet名:sheet1

说明:

1)、Frequency列,执行频率

2)、Item列,分如下三种情况

a.当Frequency为Week,Item为Monday,表明周一需要执行,Item可填写的内容为英文星期

b.当Frequency为Month,Item为1-30中间的某个数值,在当月那一天执行

c.当Frequency为Day,Item为具体日期,表明到了指定日期,发出提醒邮件,注意填写的日期格式:yyyy-mm-dd

Item这一列,设置为文本格式

3)、Task为发送邮件的提醒内容

4)、是否处理,如果为Y ,则表明已经处理过了,无需再发提醒邮件

2.记事本,config.txt,里面填写待接收邮件的邮箱账号,如果是多个人,则邮箱账号间用分号分开

3.Python代码

调用Outlook发送邮件,调用Outlook发送邮件,有两种方式:

一是知道邮箱服务器的smtp服务器地址,并有一个邮箱账号和口令,在代码里设置登陆邮箱,发出邮件。

二是单位的电脑已经配置好了,outlook可以直接使用,不知道smtp服务器的地址,而且无法登陆第三方的邮箱系统发送邮件,比如无法通过登陆smtp.163.com,

这种情况下,只能调用本电脑上的outlook。

这里采用第二种方式,参考代码如下:

# -*- coding: utf-8 -*-

"""
Module 根据定义的Task,发送邮件提醒,避免遗漏处理
""" import os
import xlrd
import schedule
import time
import win32com.client as win32
from datetime import datetime,date dictWeek={0:"Monday",1:"TuesDay",2:"Wednesday",3:"Thursday",4:"Friday",5:"Saturday",6:"Sunday"} def main():
sPath = os.getcwd()
sFile = "Task.xlsx"
sExcelFile = sPath +"\\" + sFile wb = xlrd.open_workbook(filename=sExcelFile) sheet1 = wb.sheet_by_index(0)
nrows1 = sheet1.nrows #注意weekday() 返回的是0-6是星期一到星期日
sWeekday = dictWeek.get(datetime.now().weekday())
sNow = datetime.now() iDay = sNow.day
sToday= formatDay(sNow,"yyyy-mm-dd") for iRow in range(1,nrows1):
sCheck = sheet1.cell(iRow,3).value
if sCheck != "Y":
sFrequency = sheet1.cell(iRow,0).value
s1 = sheet1.cell(iRow,1).value
if sFrequency == "Week":
if s1 == sWeekday:
s2 = sheet1.cell(iRow,2).value
sendEmail(s2)
elif sFrequency == "Day":
               
if s1 == sToday:
s2 = sheet1.cell(iRow,2).value
sendEmail(s2)
elif sFrequency == "Month":
if int(s1) == int(iDay):
s2 = sheet1.cell(iRow,2).value
sendEmail(s2) def formatDay(sDay,sFormat):
sYear = str(sDay.year)
sMonth = str(sDay.month)
sDay = str(sDay.day) if sFormat == "yyyy-mm-dd":
sFormatDay = sYear +"-" +sMonth.zfill(2)+"-" +sDay.zfill(2)
elif sFormatStyle == "yyyy/mm/dd":
sFormatDay = sYear +"/" +sMonth.zfill(2)+"/" +sDay.zfill(2)
else:
sFormatDay = sYear+"-" + sMonth + "-" + sDay return sFormatDay def sendEmail(sTask):
try:
#读取config.txt,获得发送的目标邮箱账号
sConfigFile="config.txt" f=open(sConfigFile,'r')
try:
file_Context=f.read()
except:
return False
finally:
if f:
f.close() outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0) receivers = [file_Context]
mail.To = receivers[0]
mail.Subject ='这是一封提醒邮件.'
mail.Body="邮件提醒: \r\n 请注意处理任务作业,如已处理可忽略此封邮件。\r\n 任务内容:" + sTask + " \r\n (此邮件由系统自动发送)"
#mail.Attachments.Add('C:\\Users\enegc\\OneDrive - Bayer\\Personal Data\\'+sFileName+'.xlsx')
mail.Send()
return True
except exceptions as e:
return False if __name__ == "__main__":
main()

4.打包Python文件成exe文件,使用pyinstaller

pyinstaller -F -w AutoSendEmail.py

5.部署,把打包好的exe文件从第4步生成的dist文件里拷贝出来,和config.txt以及Task.xlsx文件放到同一个文件夹里,然后在Windows的任务作业里建立一个任务作业,调用

打包好的exe文件,设置成每天执行。

6.上面部署的方式,是利用Windows的定时任务作业调用打包好的exe文件,也可以采用Python自己的任务调度方式,打包成exe后,双击启动,驻留在内存中,由系统自动调用

任务作业。

示例代码如下,这里设置的是每天10:30执行

# -*- coding: utf-8 -*-

"""
Module 根据定义的Task,发送邮件提醒,避免遗漏处理
""" import os
import xlrd
import schedule
import time
import win32com.client as win32
from datetime import datetime,date dictWeek={0:"Monday",1:"TuesDay",2:"Wednesday",3:"Thursday",4:"Friday",5:"Saturday",6:"Sunday"} def job():
sPath = os.getcwd()
sFile = "Task.xlsx"
sExcelFile = sPath +"\\" + sFile
print("Test")
wb = xlrd.open_workbook(filename=sExcelFile) sheet1 = wb.sheet_by_index(0)
nrows1 = sheet1.nrows #注意weekday() 返回的是0-6是星期一到星期日
sWeekday = dictWeek.get(datetime.now().weekday())
sNow = datetime.now() iDay = sNow.day
sToday= formatDay(sNow,"yyyy-mm-dd") for iRow in range(1,nrows1):
sCheck = sheet1.cell(iRow,3).value
if sCheck != "Y":
sFrequency = sheet1.cell(iRow,0).value
s1 = sheet1.cell(iRow,1).value
if sFrequency == "Week":
if s1 == sWeekday:
s2 = sheet1.cell(iRow,2).value
sendEmail(s2)
elif sFrequency == "Day":
if s1 == sToday:
s2 = sheet1.cell(iRow,2).value
sendEmail(s2)
elif sFrequency == "Month":
if int(s1) == int(iDay):
s2 = sheet1.cell(iRow,2).value
sendEmail(s2) def formatDay(sDay,sFormat):
sYear = str(sDay.year)
sMonth = str(sDay.month)
sDay = str(sDay.day) if sFormat == "yyyy-mm-dd":
sFormatDay = sYear +"-" +sMonth.zfill(2)+"-" +sDay.zfill(2)
elif sFormatStyle == "yyyy/mm/dd":
sFormatDay = sYear +"/" +sMonth.zfill(2)+"/" +sDay.zfill(2)
else:
sFormatDay = sYear+"-" + sMonth + "-" + sDay return sFormatDay def sendEmail(sTask):
try:
#读取config.txt,获得发送的目标邮箱账号
sConfigFile="config.txt" f=open(sConfigFile,'r')
try:
file_Context=f.read()
except:
return False
finally:
if f:
f.close() outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0) receivers = [file_Context]
mail.To = receivers[0]
mail.Subject ='这是一封提醒邮件.'
mail.Body="邮件提醒: \r\n 请注意处理任务作业,如已处理可忽略此封邮件。\r\n 任务内容:" + sTask + " \r\n (此邮件由系统自动发送)"
#mail.Attachments.Add('C:\\Users\enegc\\OneDrive - Bayer\\Personal Data\\'+sFileName+'.xlsx')
mail.Send()
return True
except exceptions as e:
return False schedule.every().day.at("10:30").do(job) while True:
schedule.run_pending()
time.sleep(1)

代码参考,已分享在百度网盘上。

链接:https://pan.baidu.com/s/1KMKVmpEyuA3zI0lEhfon7A
提取码:dzi9

日期:2019-07-03

Python自定义任务发邮件提醒的更多相关文章

  1. EDM营销算法:python自动批量发邮件

    EDM营销:全称Email Direct Marketing,即电子邮件营销.企业可以通过使用EDM软件向目标客户发送EDM邮件,建立同目标顾客的沟通渠道,向其直接传达相关信息,用来促进销售.EDM软 ...

  2. python连接数据库自动发邮件

    python连接数据库实现自动发邮件 1.运行环境 redhat6 + python3.6 + crontab + Oracle客户端 2.用到的模块  3.操作步骤 (1)安装python3.6参考 ...

  3. 脚本监控web服务器,工作不正常发邮件提醒

    背景介绍公司有多个web网站,没有配置监控服务,每天都需要定时检查服务器是否工作正常.低效耗时. 代码片段 #!/bin/bash # Author Jerry.huang (Email:Jerry. ...

  4. python实现自动发邮件

    Python有两个内置库:smtplib和email,可以实现邮件功能,无需下载,直接import导入. smtplib库负责发送邮件 Email库负责构造邮件格式和内容 邮件发送需要遵守SMTP协议 ...

  5. 调magento自定义模板发邮件

    1. 设置邮件模板 <global> <template> <email> <custom_email_template1 module="Samp ...

  6. python之smtplib发邮件

    第一版: 认证发信,不支持附件 #!/usr/bin/env python # --------------------------------------- # author : Geng Jie ...

  7. Python学习笔记——发邮件

    参考:Python3实现163邮箱SMTP发送邮件 1.首先需要注册一个网易的邮箱,开启smtp服务,并使用其授权码 2.发送邮件的Python脚本 #!/usr/bin/python # -*- c ...

  8. 【python】使用python smtplib库发邮件添加cc,bcc

    #!/usr/bin/env python# -*- coding: utf-8 -*- '''@author@mail @date 2017/03/16 发送邮件'''import smtplibf ...

  9. python使用SMTP发邮件时使用Cc(抄送)和Bcc(密送)

    SMTP发送邮件的时候,并没有特殊的通信语句告诉邮件服务器 谁是主送,谁是抄送/密送,这三个角色都是以同样的方式告诉邮件服务器的,然后重点在邮件内容里. 邮件内容分为头和体两部分(就像http),头部 ...

随机推荐

  1. Ajax工作原理及优缺点

    1. Ajax是什么? 全称是 asynchronous javascript and xml,是已有技术的组合,主要用来实现客户端与服务器端的异步通信效果(无需重新加载整个网页的情况下),实现页面的 ...

  2. linux bash 用户输入yes or no.

    脚本为script2 vim 打开脚本 内容是 对用户的键盘输入反应 sh 运行脚本,一次输入的是y ,一次输入的是n.

  3. 通过vsphere给esxi添加本地硬盘

    公司ESXi服务器的硬盘空间不够使用,现在新加了一块硬盘在ESxi服务器上.在服务器上添加完硬盘后,在Vsphere上是看不到新加硬盘的. 下面我们来通过虚拟机模拟该情况,先添加一块硬盘.如下图: 在 ...

  4. Mysql基础04-查询

    关联查询 1.内连接:实现A∩B select 字段列表 from A表 inner join B表 on 关联条件 where 等其他子句; 2.左外连接 #实现查询结果是A select 字段列表 ...

  5. eclipse 项目资源与 java 编译器级别不致总是;说明资源路径位置类型Java编译器级别不匹配t

    问题:Description Resource Path Location Type Java compiler level does not match t 今天在自己项目中整合HBase API的 ...

  6. 自用浏览器的 User-agent 表

    浏览器版本号见请求. 浏览器 User-agent Internet Explorer Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11. ...

  7. Python函数进阶:闭包、装饰器、生成器、协程

    返回目录 本篇索引 (1)闭包 (2)装饰器 (3)生成器 (4)协程 (1)闭包 闭包(closure)是很多现代编程语言都有的特点,像C++.Java.JavaScript等都实现或部分实现了闭包 ...

  8. 手动安装 saltshaker-plus 版本选择特别说明(后期重点讲解Docker安装方式)

    前后端都建议使用1.12版本

  9. linux(服务器)如何确认网卡(网口)对应的配置文件

    服务器装完系统就要配置网络,然而服务器经常是多网卡多网口,我们在某个网口插上网线后,到/etc/sysconfig/network-scripts/下配置ip时无法确定网口对应的配置文件.(比如是et ...

  10. linux基础之IO模型

    一.IO模型 一次read操作: (1)等待数据准备好:从磁盘到内核内存 (2)从内核内存复制到进程内存 示意图如下: I/O类型: 同步和异步:synchronous,asynchronous 关注 ...