因此,“在后台”意味着您要处理“带外”发送的邮件。这是为了给用户一个快速的响应,并且能够在用户有反馈后处理慢的操作,比如发送电子邮件(或者如你所说,在一个单独的线程中)。
有多种方法可以实现这一目标,包括:
最简单的方法可能是使用每 15 或 30 秒触发一次的 cron 作业。
我推荐的方法是查看工作人员和队列,并使用0mq或RabbitMQ之类的东西来排队发送电子邮件的请求,并在请求之外处理它。
如果您想执行一项 cron 作业,而不是在用户发起的请求中发送电子邮件,您将创建一个新模型来表示您的出站电子邮件请求,并将该数据存储到您的数据库中。让我们以这个模型Message
为例。
CREATE TABLE `messages` (
`id` CHAR(36) NOT NULL PRIMARY KEY,
`to` VARCHAR(255) NOT NULL,
`from` VARCHAR(255) NOT NULL,
`subject` VARCHAR(255) NOT NULL,
`body` TEXT,
`sent` TINYINT(1) NOT NULL DEFAULT 0,
`created` DATETIME
);
创建一个抓取Message
模型的控制台,并查找“未发送”消息:
$messages = $this->Message->findAllBySent(0);
创建自己的send()
方法来简化事情,并处理所有未发送的消息:
foreach ($messages as $message) {
if ($this->Message->send($message)) {
// Sending was a success, update the database
$this->Message->id = $message['Message']['id'];
$this->Message->saveField('sent', 1, false);
}
}
send()
模型上方法的实现Message
取决于您,但它只会将传入的值传递$message
并分流到CakeEmail
(http://api.cakephp.org/class/cake-email)
完成后,您可以从命令行(或从您的 cron)调用控制台。