3

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

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

如果不可能,我怎么能使用 PHPmail函数呢?(仅当这是一个好方法时)

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

先感谢您。

编辑2:我正在尝试使用该CakeEmail::deliver()方法,因为我从文档中读到:

有时您需要一种快速启动电子邮件的方法,并且您不一定要提前设置一堆配置。CakeEmail::deliver() 就是为此目的而设计的。

我正在尝试这个:

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

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

4

1 回答 1

4

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

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

  • 工人/消息队列
  • 定时任务

最简单的方法可能是使用每 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并分流到CakeEmail(http://api.cakephp.org/class/cake-email)

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

于 2012-09-05T00:46:30.490 回答