2012-09-04 19 views
3

就是這樣,我怎樣才能用CakePHP在後臺發送電子郵件,最好使用開箱即用的電子郵件組件?如何使用CakePHP發送郵件後臺?

編輯:在後臺我的意思是在另一個線程,或者至少允許控制器方法完成併發送響應給用戶。我想運行一個函數,向用戶返回「OK」,然後發送一封電子郵件。

如果這是不可能的,我怎麼能使用PHP mail功能呢? (僅當這是一個好方法時)

不知道它是否重要,但我使用的是SMTP。

預先感謝您。

編輯2:我試圖使用CakeEmail::deliver()方法,因爲我從the documentation閱讀:

有時你需要一個快速的方法來火了一封電子郵件,你不一定要做到提前設置一堆配置。 CakeEmail :: deliver()是爲此目的而設計的。

我想這一點:

CakeEmail::deliver('[email protected]', 'Test', 'Test', 
       array('from' => '[email protected]'), true); 

但郵件實際上沒有被髮送。任何人對此方法有任何暗示?

+0

詳細闡述'在背景中'。特定事件發生後?事件完成後,使用電子郵件組件啓動電子郵件。每隔一小時?使用cron – Ross

+0

@Ross查看我的編輯 – sonxurxo

回答

4

所以「在後臺」意味着你想處理郵件發送「帶外」。這是爲了給用戶一個快速響應,並且能夠在用戶反饋後(或者如你所說,在單獨的線程中)處理像電子郵件發送那樣的緩慢操作。

有許多的方式來實現這一目標,其中包括:

  • 工人/消息隊列
  • cron作業

最簡單的方法可能是使用一個觸發關閉cron作業每15或30秒。

我推薦的方法是查看工作人員和隊列,並使用諸如0mqRabbitMQ之類的內容來排列發送電子郵件的請求,並在請求之外處理該請求。

如果您想要執行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); 
    } 
} 

Message模型上的send()方法的實現取決於您,但它只會傳遞值s從$message傳遞並分流到CakeEmail(http://api.cakephp.org/class/cake-email)

一旦完成,您可以從命令行調用控制檯(或從你的cron)。

+0

謝謝@Predominant您的回覆。這是一個很好的解決方案,但我需要在處理請求的同時(或之後)發送郵件。 – sonxurxo

+0

我終於把這個設定爲正確的答案,因爲我沒有找到更好的解決方案,這可以成爲我想要的東西。非常感謝您在答案中的努力! – sonxurxo

+0

幾年前,我寫了一篇關於如何做這個插件的博客文章,http://www.stephenspeakman.co.uk/cakephp-sending-emails-in-the-background/ - 可以很容易地將其插入一個項目和重用。 – HelloSpeakman