暂时接手一个离职前端实习生的工作,昨天第一次对接产品,跟我说每天晚上要给她发送一个当天的报表。
每天?excuse me?每天?开什么国际玩笑。每天干同一个工作,这要不给整成auto的,还怎么自称屌丝程序猴。今天果断研究了下自动发送邮件。
原理不懂,只实现功能。
主要是两部分
python自动发送邮件, 基于SMTP协议,使用email和smtplib库
linux定时执行, cron
功能描述:
将一个以日期格式命名(yyyymmdd)的文件夹压缩zip包,通过邮件附件形式发送指定邮箱。
#!/bin/env python # -*- coding: utf-8 -*- import datetime import smtplib import os,sys from email import Encoders from email.mime.text import MIMEText from email.MIMEMultipart import MIMEMultipart from email.MIMEBase import MIMEBase from optparse import OptionParser HOME=sys.path[0] #sender name and password sendername="haha" #your email name sendername_all="haha@hehe.com" #your email senderpass="wonazhidao" #email password #list of all receiver (include cc-receiver) receiverlist=["haha1@hehe.com","haha2@hehe.com"] #收件人 receivertmplist=[] receivercctmplist=[] #抄送人 #make a mail mailall=MIMEMultipart() today=str(datetime.date.today()).replace('-','') #今天日期 mailcontent="haha" mailall.attach(MIMEText(mailcontent,'plain','utf-8')) #邮件正文内容,类型是plain, or html(复杂) title=today+" Data report" #today=os.path.join(HOME,today) attfilePath=today+'.zip' if os.path.exists(today): sys_cmd="zip -r %s %s"%(attfilePath,today) os.system(sys_cmd) if not os.path.isfile(attfilePath): print("no zip file") else: print("no folder") #添加zip邮件附件(通用其他文件格式) if os.path.isfile(attfilePath) and os.path.exists(today): with open(attfilePath,'rb') as f: contype = 'application/octet-stream' maintype,subtype=contype.split('/',1) attfile=MIMEBase(maintype,subtype) attfile.set_payload(f.read()) Encoders.encode_base64(attfile) #Base64编码(为啥不知道) attfile.add_header('Content-Disposition','attachment',filename = attfilePath) #头信息,貌似并不是附件名称 print("attach file prepared!") mailall.attach(attfile) else: title="some wrong!!!" print(title) #title,sender,receiver,cc-receiver, #邮件基本信息,主题,发送人,收件人,抄送人 mailall['Subject']=title #options.title mailall['From']=sendername_all mailall['To']=str(receivertmplist) if len(receivercctmplist) !=0: mailall['CC']=str(receivercctmplist) #get the text of mailall fullmailtext=mailall.as_string() print("prepare fullmailtext ok.") #mailconnect = smtplib.SMTP(options.server) mailconnect = smtplib.SMTP("smtp.126.com") #email server,port default 25 try: mailconnect.login(sendername,senderpass) except Exception as e: print("error when connect the smtpserver with the given username and password !") print(e) print("connect ok!") try: mailconnect.sendmail(sendername_all, receiverlist, fullmailtext) except Exception as e: print("error while sending the email!") finally: mailconnect.quit() print('email to '+str(receiverlist)+' over.')
cron是linux下的定时执行工具,可以在无需人工干预的情况下运行作业。
root或su下操作。
首先查看cron是否启动。
service cron status //查看cron状态 service crond start //启动服务 service crond stop //关闭服务 service crond restart //重启服务 service crond reload //重新载入配置
然后修改crontab.
crontab –e : 修改 crontab 文件,如果文件不存在会自动创建 crontab –l : 显示 crontab 文件 #crontab书写格式: minute(00-59) hour(00-24) day-of-month(01-31) month-of-year(01-12) day-of-week(0-6,0:Sunday) commands
在crontab中写入需要执行的命令和时间,前五个域是指定命令执行时间,最后一个域是执行命令。每个域之间使用空格或者制表符分隔。
除了数字还有几个特殊的符号:"*"、"/"和"-"、","
*代表所有的取值范围内的数字
"/"代表每的意思,"/5"表示每5个单位
"-"代表从某个数字到某个数字
","分开几个离散的数字
commands 注意
文件要写绝对路径
打印不会显示出来,在后台运行,做好重定向日志
0 6 * * * echo "Good morning." #6:00 every day 15 */2 * * * echo "Good morning." #每两个小时的第15分钟 0 4 1 1 * echo "Good morning." #1月1日4:00 5,15,55 16,18 * * * echo "Good morning." #每天16点、18点的5min、15min、55min执行
首推每个的第一个
auto-email:
http://blog.csdn.net/lifeiaidajia/article/details/8525259
http://blog.csdn.net/kornberg_fresnel/article/details/51227761
http://blog.sina.com.cn/s/blog_78c913e30102x6i5.html
http://wjpingok.blog.51cto.com/5374697/1737182
cron:
http://www.cnblogs.com/kaituorensheng/p/4494321.html
http://blog.csdn.net/xionglangs/article/details/52913351
转载于:https://www.cnblogs.com/zhanxiage1994/p/7774934.html