我有一个网站,每个用户都可以选择在每天选择的时间接收每日电子邮件提醒(为简单起见,假设使用相同的时区)。
因此,在他的个人资料中有一个输入框,其中包含“一天中的时间以接收电子邮件提醒”。
如何在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作业中。似乎有点草率。
有人有更好的解决方案吗?
让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
AND之类的组合键,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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句