【问题标题】:Sending an email with SQL results in cakePHP在 cakePHP 中发送带有 SQL 结果的电子邮件
【发布时间】:2012-07-02 11:50:27
【问题描述】:

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

谢谢

【问题讨论】:

    标签: php cakephp


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。我知道您的代码可以解决 foreach 内存问题,但我仍然对如何从电子邮件本身的查询中获取结果一无所知。
    【解决方案2】:

    电子邮件的“视图”实际上是一个元素。它位于视图/元素/电子邮件下。那里有 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 组件。有关如何使用它的更多详细信息,请参阅the book

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-08
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 2011-12-06
      • 2018-07-16
      • 1970-01-01
      相关资源
      最近更新 更多