我的网络应用程序正在使用CakePHP 2.4,我计划构建"drip" email功能,以便随时提供后续电子邮件。这是现代网站中一个非常常见的功能,但我很惊讶我能找到的资源很少。
我的问题:这样做是否有既定模式?我对如何做到有一些想法,但我不想重新发明轮子。
(我快速搜索了一下,然后我空了。)
注意:我知道像MailChimp这样的服务可以做到这一点,但我的“滴水”需要动态完成,因为它们与可能已经或可能没有发生的用户操作相关联。例如:如果用户尚未完成其个人资料,我希望每3天发送一封电子邮件。一旦他们这样做,他们应该停止滴水。
答案 0 :(得分:2)
根据要求。
基本上它更多的是逻辑/工作流程问题。
在您的情况下,您希望在3天后和之后每隔3天警告用户他们的个人资料不完整。
首先,你需要一些方法来检测他们的配置文件是不完整的,在这种情况下,我将使用标志字段IsComplete 0/1。默认为0(不完整)。我们还想知道用户注册的日期,因此我们将使用一个简单的mysql时间戳字段填充mysql日期,格式为yyyy-mm-dd H:i:s,我们还想知道用户的日期是最后一封电子邮件。为此,我们将使用另一个mysql字段,这次是相同格式的日期时间字段yyyy-mm-dd H:i:s。
所以我们的用户db现在看起来像这样(注意mysql语法不正确)
IsComplete TINYINT 1 DEFAULT 0,
SignupDate TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
LastWarnDate DATETIME DEFAULT NULL
上次警告日期的NULL非常重要!
在您的前端用户个人资料编辑/更新页面上,您只需将以下内容添加到保存位
if (PSEUDO_CODE_ALL_FIELDS_ARE_COMPELTED==TRUE) {
"UPDATE tblusers SET IsComplete=1";
}
现在我们有了这一点,让我们看一下基本逻辑。
每天只需一次滴灌邮件需要检查您的数据库是否有待处理的操作,然后根据需要发送通知电子邮件。我们可以通过在linux crond上运行的基本无头cron任务来实现这一点。你可以在google上找到通过cron运行php脚本的例子。第一次响应正是你想要的。我不会进入那个,而是更多地进入实际的cron脚本。
现在我们知道用户何时注册了您的网站,我们知道他们的个人资料是否完整以及我们上次警告他们的时间。 我们的cronjob非常简单,所有它必须做的是检查配置文件完成,如果没有,然后检查日期和发送电子邮件。
$query = "SELECT EmailAddress,SignupDate,LastWarnDate FROM tblusers WHERE IsComplete=0"; //we don't need to bring back the completed users so for speed we look at uncomplete only
if (strlen($query->LastWarnDate) < 5) { // this is a little nasty but will work NULL is in the db field which returns 4 characters on strlen so a quick check that its < 5 means that we don't have a proper date in the field. There's better ways of doing this i'm being brief
// ok no last warn date so check sign up date vs now
if (DATE_DIFF($query->SignupDate,now()) >=3) {
//3 days or longer since signups so do first warn
"update tblusers SET LastWarnDate=NOW()";
mail(); //standard php mail function for sending email you can use swiftmail or another component if you like
} // its been less than 3 days so do nothing no need for an else
} else {
//we have a last warn date so check warn date vs now
if (DATE_DIFF($query->LastWarnDate,now()) >=3) {
//3 days or longer since last warn date so update last warn date to now and email
"update tblusers SET LastWarnDate=NOW()";
mail(); //standard php mail function for sending email you can use swiftmail or another component if you like
} //its been less than 3 days so do nothing no need for an else
}
因此,这是非常基本的逻辑流程,并且示例不是有效的PHP,但您应该能够将您的最终解决方案基于代码。
安排cron作业每晚在午夜运行,你就完成了。
答案 1 :(得分:0)
正如@Dave根据他的回答所讨论的那样,我正在考虑在专用的桌子上跟踪滴水,以便给自己带来更大的灵活性......
使用以下字段创建drips
表:
当发生可能与滴水有关的动作时,我会检查此表并相应地添加/删除预定的滴水。例如,当用户完成他们的个人资料时,我会检查此表并删除相应的滴水。 (&lt; - 这是这种方法的缺点,IMO。)我担心这一部分,因为一些滴水取决于各种因素,这些因素可能难以在整个代码中跟踪。
每天晚上,一个cron作业会循环播放,并发送与每个type
对应的电子邮件,这些电子邮件与每个对应的代码中设置的间隔相匹配。作业会增加count
字段,也可能删除已超出的记录(可能在作业结束时查询)。