0

我需要通过电子邮件向所有用户发送 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 代码在控制器或视图中获取产品?

谢谢

4

2 回答 2

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() 选项中的偏移量。就我而言,我只是检查是否有未处理的记录,如果是,我会处理并等待片刻进行下一次尝试。

于 2012-07-02T12:18:54.073 回答
1

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

你可以在那里做你的 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 组件。有关如何使用它的更多详细信息,请参阅本书。

于 2012-07-02T15:11:02.797 回答