如何用Python脚本(SMTP协议)实现邮件定时发送?
实现SMTP定时发送邮件(无需客户端调度)
核心思路
SMTP协议本身没有内置定时发送机制,要绕过客户端层面的time.sleep()、schedule库或cron任务,唯一可行的方式是依赖SMTP服务器端的延迟投递功能:客户端仅负责将邮件提交给服务器,由服务器在指定时间完成投递,客户端无需维持进程或手动做调度逻辑。
前提条件
- 使用的SMTP服务器必须支持延迟投递(比如Exchange Server、部分企业邮箱服务器;注意Gmail、Outlook等公共邮箱通常不支持该功能)
- 需提前确认服务器认可的延迟投递头字段(不同服务器可能使用不同的自定义头)
实现步骤与代码示例
1. 构造邮件并添加延迟投递头
在MIME邮件中添加服务器支持的延迟投递头,比如Exchange常用的X-Delay-Delivery,值为RFC 2822格式的指定发送时间字符串。
import smtplib from email.mime.text import MIMEText from email.utils import formatdate # 邮件基础配置 sender = "your_work_email@company.com" receiver = "target_user@company.com" subject = "定时项目通知" body = "这是一封由服务器延迟投递的定时邮件" # 构建MIME邮件 msg = MIMEText(body, "plain", "utf-8") msg["From"] = sender msg["To"] = receiver msg["Subject"] = subject msg["Date"] = formatdate(localtime=True) # 记录邮件提交给服务器的时间 # 添加延迟投递头:指定发送时间(示例为2024年10月1日14:30) delivery_time = "Tue, 01 Oct 2024 14:30:00 +0800" msg.add_header("X-Delay-Delivery", delivery_time) # 连接SMTP服务器并提交邮件 with smtplib.SMTP("your_smtp_server_address", 587) as server: server.starttls() server.login("your_email_username", "your_email_password") server.send_message(msg)
2. 注意事项
- 不同服务器的延迟投递头可能不同:比如Sendmail可能使用
X-Schedule字段,需查阅对应服务器的官方文档确认 - 公共邮箱服务基本不支持该功能,必须使用企业级邮件服务器
- 若服务器不支持延迟投递,不存在完全符合你需求的方案——因为SMTP发送是即时行为,必须有进程在指定时间触发发送动作
替代方案(若服务器不支持延迟投递)
如果服务器不支持该功能,可考虑将邮件任务存入系统级消息队列服务(如RabbitMQ、Redis),由独立的消费者服务在指定时间拉取任务并执行SMTP发送。这种方式虽仍属于调度,但无需在你的脚本中手动添加sleep或schedule逻辑,调度逻辑由队列服务承担。
内容的提问来源于stack exchange,提问作者Harshad Parmar
相关产品推荐
相关产品推荐

