Python定时检查新邮件并提醒 schedule实战
用schedule库定时轮询IMAP邮箱,发现新邮件就终端响铃或桌面弹窗提醒,配合已读标记避免重复提醒,附完整可运行代码。
场景痛点
不能一直挂着网页邮箱刷,也不想手机一直响,但客户报价、领导审批的邮件又怕错过。让脚本每5分钟自动登一次邮箱,发现新邮件就终端打印、响铃提醒,重要发件人再加桌面弹窗,人不用盯着邮箱也不漏事。
用到的库
pip install schedule
imaplib、email是标准库;schedule负责定时。
完整代码
# -*- coding: utf-8 -*-
import time
import imaplib
import email
from email.header import decode_header, make_header
import schedule
IMAP_SERVER = "imap.qq.com"
IMAP_PORT = 993
ACCOUNT = "your_account@qq.com"
PASSWORD = "your_imap_auth_code"
# 这些发件人来邮件时重点提醒
IMPORTANT_SENDERS = ["boss@company.com", "client@vip.com"]
# 记录上次已经提醒过的邮件ID,避免重复
_alerted_ids = set()
def decode_str(s):
if not s:
return ""
return str(make_header(decode_header(s)))
def beep():
# 终端响铃,Windows/linux/mac都兼容
print("\a", end="", flush=True)
def check_once():
try:
mail = imaplib.IMAP4_SSL(IMAP_SERVER, IMAP_PORT)
mail.login(ACCOUNT, PASSWORD)
mail.select("INBOX")
# 只看未读
_, msgs = mail.search(None, "UNSEEN")
ids = msgs[0].split() if msgs[0] else []
new_count = 0
for mid in ids:
if mid in _alerted_ids:
continue
_, data = mail.fetch(mid, "(BODY.PEEK[HEADER.FIELDS (SUBJECT FROM)])")
msg = email.message_from_bytes(data[0][1])
subject = decode_str(msg.get("Subject"))
sender = decode_str(msg.get("From"))
print(f"\n【新邮件】{sender}")
print(f" 主题:{subject}")
if any(s in sender for s in IMPORTANT_SENDERS):
print(" !重要发件人,请注意")
beep()
_alerted_ids.add(mid)
new_count += 1
if new_count == 0:
print(f"[{time.strftime('%H:%M:%S')}] 无新邮件")
else:
print(f"本轮新邮件 {new_count} 封")
mail.logout()
except Exception as e:
print(f"检查出错:{e}")
if __name__ == "__main__":
print("开始监听新邮件,每5分钟检查一次,Ctrl+C退出")
check_once() # 启动时先查一次
schedule.every(5).minutes.do(check_once)
while True:
schedule.run_pending()
time.sleep(1)
代码讲解
schedule.every(5).minutes.do(check_once):每5分钟执行一次check_once。schedule就是个轻量定时器,比自己写while True + sleep清晰。UNSEEN搜索:只查未读邮件,已读的不重复提醒。_alerted_ids:进程内存里记着已经提醒过的邮件ID,避免下一轮5分钟又把同一封未读邮件再提醒一遍。脚本重启会重新提醒一次,可接受。BODY.PEEK[HEADER.FIELDS (SUBJECT FROM)]:只抓主题和发件人两个头,不下载正文,轮询开销极小。IMPORTANT_SENDERS:重要发件人列表,命中时终端响铃(\a),普通邮件只打印。try/except:网络抖动、登录失败不能让整个监听程序挂掉,打个错误下一轮继续。
运行结果
脚本启动后每5分钟自动查一次邮箱,没有新邮件就打印时间戳,有新邮件就打印发件人和主题,重要发件人还会响铃。挂在终端窗口最小化就行,比一直开网页邮箱省资源。
注意事项
- 邮件ID是会话内临时编号,
_alerted_ids跨会话可能失效。要持久化提醒状态,把ID写到本地文件,下次启动读进来。 - 轮询间隔别太短(别低于1分钟),频繁登录容易被服务器判定异常封IP。5~10分钟比较合适。
- Linux/mac下
\a响铃要终端本身支持。想做桌面弹窗,Windows用ctypes.windll.user32.MessageBoxW,mac用osascript。 - 想把提醒推到微信/钉钉/飞书,可以在命中重要邮件时调它们的webhook接口,比终端响铃实用。
- 脚本要长期跑,建议用nohup、systemd或计划任务挂后台,别只在自己终端窗口跑。

更新时间:2026-09-14 21:07:00