如何为PHP应用程序设置滴灌电子邮件系统

时间:2014-01-13 14:34:27

标签: php email cakephp

我的网络应用程序正在使用CakePHP 2.4,我计划构建"drip" email功能,以便随时提供后续电子邮件。这是现代网站中一个非常常见的功能,但我很惊讶我能找到的资源很少。

我的问题:这样做是否有既定模式?我对如何做到有一些想法,但我不想重新发明轮子。

(我快速搜索了一下,然后我空了。)

注意:我知道像MailChimp这样的服务可以做到这一点,但我的“滴水”需要动态完成,因为它们与可能已经或可能没有发生的用户操作相关联。例如:如果用户尚未完成其个人资料,我希望每3天发送一封电子邮件。一旦他们这样做,他们应该停止滴水。

2 个答案:

答案 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表:

  • id(INT)
  • type(INT或ENUM)这将映射到特定类型的滴水及其相应的条件等
  • user_id(INT)链接到将收到电子邮件的用户的外键
  • user_email *(VARCHAR)(可选)用户的电子邮件地址
  • count(INT)跟踪发送用于限制滴水次数的次数
  • last_sent(datetime)跟踪上次发送用于维持间隔的日期

当发生可能与滴水有关的动作时,我会检查此表并相应地添加/删除预定的滴水。例如,当用户完成他们的个人资料时,我会检查此表并删除相应的滴水。 (&lt; - 这是这种方法的缺点,IMO。)我担心这一部分,因为一些滴水取决于各种因素,这些因素可能难以在整个代码中跟踪。

每天晚上,一个cron作业会循环播放,并发送与每个type对应的电子邮件,这些电子邮件与每个对应的代码中设置的间隔相匹配。作业会增加count字段,也可能删除已超出的记录(可能在作业结束时查询)。