python 轻量级定时框架apscheduler,周中定时给自己发送邮件。
需求:搜集一些信息,并且每日通过邮件推送给自己。
参考链接:
【干货】APScheduler官方文档翻译: https://www.jianshu.com/p/4f5305e220f0
花10分钟让你彻底学会Python定时任务框架apscheduler: https://blog.csdn.net/somezz/article/details/83104368
python apscheduler 暂停和恢复任务: https://www.jianshu.com/p/1c98cbabbf7e
APScheduler(Python化的Cron)使用总结 定时任务: https://www.cnblogs.com/zhaoyingjie/p/9664081.html
思路:
构造一个定时计划,在指定时间通过smtp服务发送邮件信息。
定时计划使用apscheduler框架。可以轻松的,通过构造triggersd来设置自己的定时任务。
简单例子,对于我们的需求,使用使用cron类触发器:
# 使用后台运行,非阻塞 scheduler = BackgroundScheduler() # 添加任务 - 3类 # 添加任务 - 1:在指定时间执行 scheduler.add_job(send_job, 'date', run_date=datetime.datetime.now() + datetime.timedelta(seconds=5), args=['text']) # 添加任务 - 2:间断时间执行 scheduler.add_job(send_job, 'interval', seconds=3,args=['text']) # 添加任务 - 3: 周期性指定时间执行 scheduler.add_job(send_job,"cron", day_of_week='*', hour='9', minute='20', second='*/2',args=['text']) # 启动任务 sched.start() # 中断任务,wait=False表示立刻中断 sched.shutdown(wait=True)
再结合发送邮件的功能,构造定时发送邮件任务。
# 执行邮件发送
# subtype为发送的邮件内容类型,此处默认为Html
def send_mail(mail_content='test',subtype='html',host_server = 'smtp.126.com',sender = '***@126.com',pwd = '***', sender_mail = '***@126.com',receiver = '***@126.com',mail_title = 'title'): try: # ssl登录 smtp = SMTP_SSL(host_server) # set_debuglevel()是用来调试的。参数值为1表示开启调试模式,参数值为0关闭调试模式 smtp.set_debuglevel(0) smtp.ehlo(host_server) smtp.login(sender, pwd) msg = MIMEText(mail_content, subtype, 'utf-8') msg["Subject"] = Header(mail_title, 'utf-8') msg["From"] = sender_mail msg["To"] = receiver smtp.sendmail(sender_mail, receiver, msg.as_string()) smtp.quit() return True except Exception as e: print('发送失败',e) return False
对于如果是对于数据表格,还可以构造成Html内容进行发送DataFrame类型。
# 构建表格内容 def create_table_content(data): d='' #表格内容 # 标题 t = '<tr>' for k in range(len(columns)): t = t + '<td>' + columns[k] + '</td>' t = t + '</tr>' d = d + t #数据内容 for i in range(len(data)): t = '<tr>' for k in range(len(columns)): t = t + '<td>' + str(data.iloc[i,k]) + '</td>' t = t + '</tr>' d=d+t html = """\ <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <body> <div id="container"> <p><strong>tips:</strong></p> <div id="content"> <table border="2" bordercolor="red" cellspacing="2"> """+d+""" </table> </div> </div> </div> </body> </html> """ return html