Python中的定时邮件提醒

1 投票
3 回答
2527 浏览
提问于 2025-04-15 22:07

我写了一个Python脚本,用户可以输入一条消息、他们的邮箱和希望发送邮件的时间。这些信息都存储在一个MySQL数据库里。

但是,我该怎么让这个脚本在指定的时间和日期执行呢?需要用到定时任务吗?比如说在4月20日的2:15,脚本会查找数据库中所有设置为2:15的时间,然后发送这些邮件。那么,如果有邮件是在2:16呢?

我使用的是共享主机,所以不能让脚本一直运行。

谢谢

3 个回答

1

每分钟设置一个定时任务就可以了。如果你在考虑这个问题,有两件事需要注意:

1 - 每分钟预计要发送多少封邮件?如果你发送一封邮件需要1秒钟,而你每分钟有100封邮件要发,那你根本发不完。

2 - 如果一个任务在上一个任务还没完成的时候就开始了,会发生什么?要小心不要重复发送邮件。你需要确保第一个任务完成后再开始下一个(风险:可能会漏掉一封邮件),或者避免下一个任务开始(风险:第一个任务可能会卡住整个队列),或者让它们同时进行(风险:可能会出现同步问题)。

如果你采纳daramarak的建议,让你的脚本在结束时添加一个新的定时任务,那么如果出现一个错误,整个系统可能会崩溃。

2

看起来这个Django应用程序就是为像你这样的情况而设计的...

http://code.google.com/p/django-cron/

另外,你的设计似乎有点问题。如果它在2:15运行,你不应该只发送那些在2:15应该发送的邮件,而是应该发送所有过去应该发送但还没发送的邮件。

你的数据库应该要么: A. 一旦发送就删除这些记录 或者 B. 在你的数据库表中增加一个列,用来标记邮件是否已经发送。然后你的逻辑就可以利用这个列来判断。

2

如果你不能让一个脚本一直运行,那就需要有某种东西来触发它,这样就得依赖你操作系统内部的功能。在Unix系统中,像你提到的,使用定时任务(cron job)就可以解决这个问题。

你可以设置定时任务来运行这个脚本,让脚本在运行时先等一段时间,然后继续发送邮件,直到下一个邮件发送的时间超过这个等待的时间。接着,让你的脚本再添加一个新的定时任务,用于下次的唤醒时间。

撰写回答