我的知识记录

Python定时发送邮件 schedule库实战

用Python schedule库实现每天定时自动发邮件、每周一发周报,配合smtplib不用写操作系统定时任务,附完整代码与异常重连处理。

场景痛点

每天早上9点要给老板发前一天的数据日报,到点就忘、周末还要加班。用schedule库写个常驻脚本,到点自动发,服务器跑着就行,不用每天惦记。比操作系统自带的crontab/任务计划好调试,跨平台都能跑。

用到的库

pip install schedule

完整代码

# -*- coding: utf-8 -*-
import time
import smtplib
from datetime import datetime
from email.mime.text import MIMEText
from email.header import Header
import schedule

SMTP_SERVER = "smtp.qq.com"
SMTP_PORT = 465
SENDER = "your_account@qq.com"
AUTH_CODE = "your_smtp_auth_code"
RECEIVER = "boss@example.com"


def send_daily_report():
"""每天执行一次:发前一天的数据日报"""
yesterday = (datetime.now().date()).isoformat()
body = f"老板好,{yesterday} 的日报已生成,请查收附件。"

msg = MIMEText(body, "plain", "utf-8")
msg["From"] = Header(f"日报机器人 <{SENDER}>", "utf-8")
msg["To"] = Header(RECEIVER, "utf-8")
msg["Subject"] = Header(f"【日报】{yesterday} 业务数据", "utf-8")

try:
server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
server.login(SENDER, AUTH_CODE)
server.sendmail(SENDER, [RECEIVER], msg.as_string())
server.quit()
print(f"[{datetime.now()}] 日报已发送")
except Exception as e:
print(f"[{datetime.now()}] 发送失败: {e}")


def main():
# 配置定时任务
schedule.every().day.at("09:00").do(send_daily_report)   # 每天9点
# schedule.every().monday.at("10:00").do(send_weekly)    # 每周一10点
# schedule.every(2).hours.do(check_task)                 # 每2小时
# schedule.every().minute.do(ping)                       # 每分钟

print("定时邮件服务已启动,等待触发...")
while True:
schedule.run_pending()
time.sleep(30)   # 每30秒检查一次到没到点


if __name__ == "__main__":
main()

代码讲解

  • schedule.every().day.at("09:00"):每天9点触发;.monday.at(...)每周一;.hours每小时;.minutes每几分钟。
  • .do(函数名):把要执行的函数挂上去,注意传函数名不要加括号,加括号会立刻执行。
  • while True循环里不断调run_pending()检查到点任务,time.sleep(30)控制检查频率,30秒足够日报这种场景。
  • 把发送逻辑包在try/except里:SMTP连接偶尔会因为网络抖动失败,捕到异常打印日志就行,不会让整个定时服务挂掉。

运行结果

脚本启动后控制台打印"定时邮件服务已启动",到每天9点自动发邮件并打印"日报已发送"。脚本要一直挂在服务器上不能关。

注意事项

  • 脚本必须一直运行,关掉电脑或SSH断开就不发了。生产环境建议用nohup/systemd/pm2托管,或放到公司服务器上。
  • 时区是服务器本地时区,部署到云服务器前先确认服务器时区是Asia/Shanghai,否则9点变成UTC时间。
  • schedule精度到分钟级,要秒级精度用APScheduler。
  • 发失败别盲目重试,连续失败3次就发告警到另一个邮箱,避免重复轰炸老板邮箱。
  • 也可以不用schedule,直接写一个Python脚本,用Windows任务计划或Linux crontab定时启动脚本,适合每天只跑一次的简单场景。

Python定时发送邮件 schedule库实战

标签:

更新时间:2026-09-14 21:06:21

上一篇:Python发送邮件带附件完整示例

下一篇:Python定时检查新邮件并提醒 schedule实战