Python自定义任务发邮件提醒

前言

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

方案简介

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

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

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

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

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

详细方案:

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为具体日期,表明到了指定日期,发出提醒邮件

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 formatDay(s1,"yyyy-mm-dd") == 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文件,设置成每天执行。

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

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

日期:2019-07-03

原文地址:https://www.cnblogs.com/SH170706/p/11129457.html

时间: 2024-11-08 14:44:33

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

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

背景介绍公司有多个web网站,没有配置监控服务,每天都需要定时检查服务器是否工作正常.低效耗时. 代码片段 #!/bin/bash # Author Jerry.huang (Email:[email protected]) # Check web Server if [[ -z `curl -I -s "http://www.baidu.com" | grep "200 OK"` ]]; then echo "www.baidu.com server s

Python logging smtplib 发邮件

#!/usr/bin/env python #-*- coding:utf-8 -*- #File:mail_send.py class Mail_Logger(): mailLogger = None def __init__(self,conf_file,name): import logging,logging.config logging.config.fileConfig(conf_file) #create logger self.mailLogger = logging.getLo

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

SMTP发送邮件的时候,并没有特殊的通信语句告诉邮件服务器 谁是主送,谁是抄送/密送,这三个角色都是以同样的方式告诉邮件服务器的,然后重点在邮件内容里. 邮件内容分为头和体两部分(就像http),头部包含了各种meta信息,其中说明了谁要用to,谁要cc,谁要bcc. 一个典型的带to和bcc的邮件发送过程debug日志如下: send: 'ehlo E42.lan\r\n' reply: b'250-smtp.qq.com\r\n' reply: b'250-PIPELINING\r\n' r

python中关于发邮件的示例

发送邮件示例代码如下: from WebUtils import ProperitiesLoad from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import smtplib import os class Sendmails(): ''' 发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件, 如果有多个附件,可依次构造,最后利用smtplib.smt

python编码发邮件

下面为使用python编写的发邮件的代码,注意,代码中的password不是邮箱的密码,而是客户端授权代码.获取客户端授权代码,以163邮箱为例:设置-常规设置-客户端授权密码. from email.mime.text import MIMEText from email.header import Header  subject = 'python email test'   msg = MIMEText('数据库中有内容更新,请及时查看', 'plain', 'utf-8') msg['S

如何利用python监控主机存活并邮件、短信通知

功能: 1.使用定时任务执行脚本,检查主机存活信息2.将主机存活信息写入指定文件3.发现宕机的主机后给用户发邮件提醒备注:因为139邮箱在接受到邮件后会自动给用户发送条短信告知(且此服务免费),所以间接的实现了短信提醒功能. 代码如下: # -*- coding: utf-8 -*- import os import time import smtplib from email.mime.text import MIMEText from email.header import Header #

如何通过Oracle实现自动发邮件功能

在内网项目.外网项目中多有 需要自动监控发邮件提醒的功能,因为邮件功能最便捷.便宜.不用开接口,不用接口费用.现 提供 我在一个内网项目中的使用案例: 案例背景: 在有限的资源下,能够自动给下级单位发布 数据考核评分(自动评分)和各 业务数据扣分 汇总统计后的数量(当然可进行拓展邮件信息) 案例工具: oracle;一个邮箱的对外服务调用地址:账号:密码: ----------------------------------------------------------------------

【Python系列】Python自动发邮件脚本

缘起 这段时间给朋友搞了个群发邮件的脚本,为了防止进入垃圾邮件,做了很多工作,刚搞完,垃圾邮件进入率50%,觉得还不错,如果要将垃圾邮件的进入率再调低,估计就要花钱买主机了,想想也就算了,先发一个月,看看效果再拓展吧. 脚本主要是通过Python写的,调的smtplib库,这些是基础,大家在网上一搜一大堆,今天主要给大家讲解下如何避免进入垃圾邮件系统,以及整个系统搭建时的一些思想.可能刚搞Python不久,有很多可能是错误的写法望大家提出来哈~ 配置 CentOS7.0系统 Python 3.4

python-发邮件脚本

折腾nagios发邮件好几天,终于完成,我的系统环境是ubuntu12.04,安装postfix服务,先贴上脚本,如下: #!/usr/bin/env python#-*- coding:utf-8 -*-''' from: 改成你的邮箱地址 '''import datetime,smtplib,string,sysfrom email.Header import Headerfrom email.MIMEText import MIMETextfrom email.MIMEMultipart