我有一个网站,每个用户都可以选择在他选择的时间收到每日电子邮件提醒(假设时区相同)。
因此,在他的个人资料中有一个输入框,其中包含“接收电子邮件提醒的时间”。
如何在CRON工作中实现这一目标?
我想过每分钟运行这样的东西:
SELECT `id`,`email` FROM `reg_users` WHERE `start_time` >= $time_now
问题是它会发送多封电子邮件。
也许,每次比赛都要在发送电子邮件后更新一个标志。
UPDATE reg_users SET sent_already = 1;
然后上面的查询将是
SELECT `id`,`email` FROM `reg_users` WHERE `start_time` >= $time_now AND `sent_already` = 0;
但是在一天结束时需要UPDATE
所有记录到sent_already = 0
并使用第二个CRON作业。看起来有点草率。
任何人都有更好的解决方案吗?
答案 0 :(得分:2)
让cron运行x分钟,运行类似。
SELECT `cols` FROM `Emails_Queue` WHERE `Timestamp` <= NOW() LIMIT 0,50
此外,您应该限制查询,以免被标记为垃圾邮件发送者更改50一次要发送的数量。我相信现在是DATETIME格式。
然后您发送了没有错误的电子邮件删除了带有某种ID的电子邮件(从选择中提取),这样您就可以删除正确的电子邮件。
DELETE FROM `Emails_Queue` WHERE `colid` = ?
插入问题。你可以查看类似的内容。
SELECT `cols` FROM `Emails_Queue` WHERE `User` = ? AND `Timestamp` = ?
然后如果没有返回结果。
或者您可以使用User
和Timestamp
之类的复合键并拥有ON UPDATE NO ACTION
,但只有在您的数据库引擎支持密钥时才能使用。然后你可以做到以下几点。
INSERT INTO `Emails_Queue` (`cols`) VALUES (val)
或者你可以让cron动态创建它们。
SELECT `cols` FROM `Emails_Queue` WHERE `Not_Sent` = TRUE AND `Timestamp` <= NOW() LIMIT 0,50
然后发送电子邮件。
UPDATE `Emails_Queue` SET `Not_Sent` = FALSE WHERE `User` = ?
每周通过cron执行以下操作。
UPDATE `Emails_Queue` SET `Not_Sent` = TRUE WHERE `Not_Sent` = FALSE