作为一个大(忘)忙(事)人(佬),每天写日报这种事儿简直就是种折磨。
而碰巧领导又让你天天写日报,这不是要了老命了吗,所以咯,殚精竭虑之后,本人写了个自动发送周报的程序,每天定时发送一封写的声色俱全的日报给领导。
切入正题吧。
程序是用python写的发送email的程序,使用shell写的逻辑,使用linux服务器制定定时任务定时发送。
括弧 自己拥有服务器的土豪可以自己在服务器上装mail命令,就不用自己写邮件发送程序了,由于使用公共服务器,并没有安装程序的权限,所以自己用python写了邮件发送程序。
整个程序的目录结构是这样的
drwxrwxr-x 2 * * 4096 Jul 28 17:17 ./ drwxr-xr-x 15 * * 4096 Jul 28 17:17 ../ -rw-rw-r-- 1 * * 288 Jul 28 12:10 rlist #工作内容列表,用来在自己忘了填充内容的时候随机编造工作内容 -rw-rw-r-- 1 * * 0 Jul 28 13:00 send.log #执行log查看给领导发送的邮件内容,免得漏了陷 -rwxrwxr-x 1 * * 527 Jul 28 17:17 sendmail.sh* #手写邮件发送程序 有mail程序的服务器可以不用这个文件 -rwxrwxr-x 1 * * 1082 Jul 28 17:05 send.py* #发送邮件的主程序 -rw-rw-r-- 1 * * 34 Jul 28 17:10 today #发送邮件的今日工作内容 -rw-rw-r-- 1 * * 93 Jul 28 17:14 tomorrow #发送邮件的昨日工作内容
rlist 就是个列表,里面随便编上几十个工作内容。越多越好,越详细越好。
回顾代码
优化后台功能
重构代码
修改bug
检查代码性能
回顾代码
优化后台功能
重构代码
修改bug
检查代码性能
回顾代码
优化后台功能
重构代码
修改bug
检查代码性能
发送邮件的程序,可以使用mail命令代替
# -*- coding: utf-8 -*- from email import encoders from email.header import Header from email.mime.text import MIMEText from email.utils import parseaddr, formataddr import smtplib import argparse import time parser = argparse.ArgumentParser() parser.add_argument("content") args = parser.parse_args() times = time.strftime('%Y-%m-%d',time.localtime(time.time())) content = args.content def _format_addr(s): name, addr = parseaddr(s) return formataddr(( Header(name, 'utf-8').encode(), addr.encode('utf-8') if isinstance(addr, unicode) else addr)) from_addr = "***********" password = "*********" to_addr = "***********" smtp_server = "*********" msg = MIMEText(content, 'html', 'utf-8') msg['From'] = _format_addr(u'***** <%s>' % from_addr) msg['To'] = _format_addr(u'**** <%s>' % to_addr) msg['Subject'] = Header(u'【日报】'+times, 'utf-8').encode() server = smtplib.SMTP(smtp_server, 25) server.login(from_addr, password) server.sendmail(from_addr, [to_addr,"****抄送一份给自己****"], msg.as_string()) server.quit() ~
接下来就是整个程序的逻辑了
#! /bin/bash
# 随机数生成方法 function rand(){ min=$1 max=$(($2-$min+1)) num=$(($RANDOM+1000000000)) #增加一个10位的数再求余 echo $(($num%$max+$min)) } echo "开始发送邮件"
#进入程序所在的目录 cd /***/***/***/sendEmail
#接下来的两行代码目的是为了随机一个半小时之内的休息时间,这样每次领导收到日报的时间都不一样,所以更难猜到是定时发送任务。 slt=`rand 1 1800 ` sleep $slt
#判断明日目标是否存在,不存在的话从理由列表中随机出一份 if [ -f tomorrow ];then to=$(cat tomorrow) else l=`rand 1 10` to=$(sed -n $l'p' rlist) echo $to > tomorrow fi
#从today中拿取今日目标 tod=$(cat today)
#将明日目标和今日目标合成一个内容 content="今日任务:<br/>"$tod"<br/>明日任务:<br/>"$to
#删除今日目标(因为已经没用啦) rm today
#将明日目标改名为今日目标(废话 今天的明天不就是明天的今天吗) mv tomorrow today
#发送邮件(如果用mail命令修改这一行就行啦) python2.7 send.py $content
#往log里面打印一条成功信息 echo $content "发送成功"
整体来说,程序的用法是,如果自己记得需要发日报这回事,就赶紧上服务器上写一份明日工作计划放到tomorrow文件里面,如果忘了呢就是自动从rlist列表里面随机出一份,然后随机一个时间给领导发过去,让领导觉得你是一个比较规律发日报的好同志!
最后的最后,设定一个定时器,让这个程序每天定时执行就行了
shell里面输入
crontab -e
然后添加这么一条信息就ok了
30 17 * * * /***********/sendEmail/sendmail.sh >> /**********/sendEmail/send.log 2>&1