需求:搜集一些信息,并且每日通过邮件推送给自己。
参考链接:
【干货】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