【问题标题】:How to send an email in background with CakePHP?如何使用 CakePHP 在后台发送电子邮件?
【发布时间】:2012-08-29 09:37:29
【问题描述】:

就是这样,我如何使用 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);

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

【问题讨论】:

  • 详细说明in background。在特定事件之后?事件完成后使用电子邮件组件触发电子邮件。每隔一小时?使用 cron

标签: email cakephp background


【解决方案1】:

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

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

  • 工作人员/消息队列
  • Cron 作业

最简单的方法可能是使用每 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)调用控制台。

【讨论】:

  • 感谢@Predominant 的回复。这是一个很好的解决方案,但我需要在处理请求的同时(或之后)发送邮件。
  • 我最终将其设置为正确答案,因为我没有找到更好的解决方案,这可能是实现我想要的一个技巧。非常感谢您的回答!
  • 几年前我写了一篇关于如何将其作为一个简单的插件来做到这一点的博客文章,stephenspeakman.co.uk/cakephp-sending-emails-in-the-background - 可以轻松地将其放入项目中并重用。
  • 我建议不要使用'from'作为列名,这是因为'from'用作关键字。请看:stackoverflow.com/questions/4544051/…
猜你喜欢
  • 1970-01-01
  • 2014-01-17
  • 2011-09-13
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 2012-01-13
相关资源
最近更新 更多