如何使用CakePHP在后台发送电子邮件?

时间:2012-09-04 17:15:09

标签: email cakephp background

就是这样,我如何使用CakePHP在后台发送电子邮件,最好使用开箱即用的电子邮件组件?

编辑:在后台我的意思是在另一个线程中,或者至少允许控制器方法完成并将响应发送给用户。我想运行一个函数,向用户返回“OK”,然后发送电子邮件。

如果不可能,我怎么能使用PHP mail函数呢? (只有这是一个好方法)

不知道是否重要,但我使用的是SMTP。

提前谢谢。

编辑2:我正在尝试使用CakeEmail::deliver()方法,因为我从the documentation读到:

  

有时您需要快速发布电子邮件,而且您不一定要提前设置一堆配置。 CakeEmail :: deliver()用于此目的。

我正在尝试这个:

CakeEmail::deliver('myemail@mydomain.com', 'Test', 'Test',
                array('from' => 'localhost@localhost.com'), true);

但邮件实际上并未发送。任何人都对这种方法有任何暗示吗?

1 个答案:

答案 0 :(得分:4)

所以“在后台”意味着您要处理“带外”发送的邮件。这是为了给用户提供快速响应,并且能够在用户收到反馈后(或者如您所说,在单独的线程中)处理电子邮件发送等慢速操作。

有很多方法可以实现这一目标,包括:

  • 工人/消息队列
  • Cron job

最简单的方法可能是使用每15或30秒发出一次的cron作业。

我推荐的方法是查看工作人员和队列,并使用0mqRabbitMQ之类的方法对发送电子邮件的请求进行排队,并在请求之外处理。

如果您想要执行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中的值并分流到{{1} (http://api.cakephp.org/class/cake-email)

完成后,您只需从命令行(或从您的cron)调用控制台。