我正在编写一个小的php-cli脚本,它将遍历我的个人收件箱,然后通过网关向我发送短信。
我的问题是:
如同每10分钟通过cron启动脚本一样,如果我的收件箱中有一封电子邮件在下一个脚本启动之前未读取,那么我将收到2个短信。
是否有人(伪代码会这样做)知道php5中的最佳做法是什么,以确保只发送1条短信?
我目前正在学习的是将消息ID存储在sqlite数据库中并标记字段是否已发送短信 - 但想知道是否有更简单的方法?
答案 0 :(得分:1)
您不需要存储任何东西。如果我理解正确,您只需要程序在最近10分钟内收到新的未读电子邮件时向您发送消息。在那种情况下,你能不能做到以下几点?
foreach($inbox[] as $message){
if(($message.isUnread) && ($message.receiveTime > NOW() - 10 minutes)){
$sendMessage = TRUE;
}
}
if($sendMessage){
sendMessage();
}
我不知道您是如何访问数据的,所以上述内容不太可能按原样使用。假设您可以按读取状态和日期到达来过滤收件箱的内容,但原则上不应该这样做吗?
答案 1 :(得分:0)
我目前正在学习的是将消息ID存储在sqlite数据库中并标记字段是否已发送SMS
这是最简单直接的方法之一。无论存储方法如何,您都必须在某处保留已查看但未读取的消息ID列表。也可以在一个简单,自包含的SQLite文件中。我想你可以将它们保存在平面文件的列表中。根据定义,这更简单,但它真的更容易吗?
答案 2 :(得分:0)
我没有看到你在某个地方没有坚持的情况下离开。
那些东西应该是不断增加的性质 - 消息ID可能,时间戳肯定。只要您可以查看它并确定新消息是否已经到达。
如果您希望与SMS通信的是,有未读消息,我认为不需要保留更多的单个ID或时间戳。
答案 3 :(得分:0)
经过几个小时的睡眠(从早上4点开始观看澳大利亚对阵德国,世界杯),我想出了一个更好的方法,比使用sqlite DB稍微复杂一些,但有一些额外的好处。
我正在使用imap_mail将SMS发送到网关,并将SMS通知的message_id存储为外发电子邮件中的自定义“X-Relationship:”标头,然后将邮件复制到我的已发送邮件。
然后,通知程序只扫描我的已发送邮件,以查看我已发送邮件中是否存在X-Relationship邮件头。
这是我发送到SMS网关的电子邮件的记录(已发送项目) - 似乎运行良好。