python 轻量级定时框架apscheduler,周中定时给自己发送邮件。

时间:2022-07-26
本文章向大家介绍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

官方api: https://apscheduler.readthedocs.io/en/latest/userguide.html?highlight=BackgroundScheduler#starting-the-scheduler

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