就是这样,我如何使用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);
但邮件实际上并未发送。任何人都对这种方法有任何暗示吗?
答案 0 :(得分:4)
所以“在后台”意味着您要处理“带外”发送的邮件。这是为了给用户提供快速响应,并且能够在用户收到反馈后(或者如您所说,在单独的线程中)处理电子邮件发送等慢速操作。
有很多方法可以实现这一目标,包括:
最简单的方法可能是使用每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
中的值并分流到{{1} (http://api.cakephp.org/class/cake-email)
完成后,您只需从命令行(或从您的cron)调用控制台。