2012-07-02 70 views
0

我需要通過電子郵件發送我的所有用戶在CakePHP 2.發送帶有SQL結果的電子郵件在CakePHP

我有以下代碼來獲取所有用戶電子郵件每日產品列表。

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

現在我明白了,我可以用一個HTML模板,這和解析值,但我真的需要實際的觀點本身內部foreach循環和發送產品的表。

什麼是最佳實踐? CakePHP代碼在控制器或視圖中獲取產品?

感謝

回答

1

電子郵件的「視圖」實際上是一個元素。它在Views/Elements/email下。有兩個文件夾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

2

的最佳實踐,這將是使用shell來發送電子郵件了。爲了避免內存不足,您應該以大塊方式閱讀用戶及其產品,而不是同時閱讀。

在foreach循環中,您需要爲每個用戶獲取數據,並將其設置爲任何其他變量,然後在html模板中可用,然後您可以在其中呈現所有產品。

這裏是一個外殼部分(縮短)的代碼,處理數據:

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()選項中的偏移量。在我的情況下,我只是檢查是否有未經處理的記錄,如果是的話,我會處理,然後等待片刻做下一次嘗試。

+0

感謝您的回覆。我知道你的代碼可以解決foreach內存問題,但我仍然對我如何從郵件本身的查詢中得到結果有點無知。 – AshHimself

+0

我的答案的第二段。 – burzum