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定时启动脚本,适合每天只跑一次的简单场景。

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