发送带有SQL的电子邮件会导致cakePHP

时间:2012-07-02 11:50:27

标签: php cakephp

我需要通过电子邮件向所有用户发送cakePHP 2中的每日产品列表。

我有以下代码来获取所有用户的电子邮件。

$users = $this->User->find('all', array('fields' => array('email')));
foreach ($users as $user) {
    $this->Email->reset();
    $this->Email->from     = '<no-reply@test.com.au>';
    $this->Email->to       =  $user['email'];
    $this->Email->subject  =  "Daily Products" ;
    $this->Email->sendAs   = 'html';
    $this->Email->send();
}

现在我明白我可以使用html模板并解析它的值,但我真的需要在实际视图中使用foreach循环并发送产品表。

最佳做法是什么?在控制器或视图中使用cakePHP代码来获取产品?

由于

2 个答案:

答案 0 :(得分:2)

最佳做法是使用shell发送电子邮件。为避免内存不足,您应该以块的形式而不是所有内容同时阅读用户及其产品。

在foreach循环中,您需要获取每个用户的数据并将其设置为()它将在html模板中可用的任何其他变量,然后您可以在那里渲染所有产品。

以下是来自处理数据的shell的一些(缩短的)代码:

public function main() {
    $this->loop();
}


public function loop() {
    try {
        while (true) {
            if (!$this->poll()) {
                $this->out(__('Nothing more to process, sleeping...'));
                sleep($this->sleep);
            }
        }
    } catch (Exception $e) {
        $this->out($e->getMessage());
        $this->log($e->getMessage(), 'processing');
    }
}

public function poll() {
    $this->out('Polling...');
    $result = $this->Model->getFirstUnprocessed();

    if ($result === false) {
        return false;
    }

    // do something with the result here

    return true;
}

这应该足以让你有个主意。要以块的形式读取用户,您需要在find()选项中增加偏移量。在我的情况下,我只检查是否有未经处理的记录,如果是,我处理并等待片刻进行下一次尝试。

答案 1 :(得分:1)

电子邮件的“视图”实际上是一个元素。它在Views / Elements / email下。 htmltext有2个文件夹,两者都用于保存各自的模板。

你可以在那里做你的foreach,然后确保在控制器中设置布局:

$this->Email->sendAs = 'html'; // Can also be 'text' or 'both' (for multipart).
$this->Email->layout = 'foo'; // Would include Views/Elements/email/html/foo.ctp

虽然自CakePHP 2.0以来不推荐使用Email组件,但您应该使用CakeEmail组件。有关如何使用该功能的详细信息,请参阅the book