You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 08:50:02