2011-06-19 80 views
14

CI電子郵件send()函數只返回true或false。有沒有辦法得到更詳細的原因,爲什麼發送失敗?我正在使用SMTP。Codeigniter電子郵件錯誤處理

+0

您是否正在使用[內置CI錯誤處理例程和設置](http://codeigniter.com/user_guide/general/errors.html)? – hakre

+0

可能重複:http://stackoverflow.com/questions/5777352/error-when-sending-smtp-email-with-google-and-codeigniter – hakre

+0

如果這是在生產中,我通常關閉所有的錯誤記錄。如果我將錯誤報告設置爲無,CI錯誤處理日誌功能是否仍然有效? – samxli

回答

0

你可以檢查你的郵件日誌。如果郵件出錯,那麼你應該有一個記錄說明爲什麼在那裏。

雖然這取決於您的系統,但我不確定它們的位置。

+0

你如何設置CI電子郵件類的電子郵件日誌? – samxli

12

您可以進一步檢查所發生的事情通過電子郵件調試器:

$r = $this->send(); 
if (!$r) 
    $this->email->print_debugger() 
    ; 

Codeigniter Email Class Reference

如果您需要調試器輸出作爲一個字符串,你可以趕上輸出與output buffer

$errors = array(); 
... # Loop 
$r = $this->send(); 
if (!$r) { 
    ob_start(); 
    $this->email->print_debugger(); 
    $error = ob_end_clean(); 
    $errors[] = $error; 
} 
... # Loop end 
+0

我需要調試器輸出到一個字符串,因爲我將錯誤返回到前端(通過json)。任何方式來做到這一點? – samxli

+0

我編輯了答案,向您展示如何將調試器輸出分配給變量。 – hakre

+0

我有一個發送羣發電子郵件的循環發送()。如果電子郵件成功,我會將成功消息放入json中。如果失敗,我可以使用ob_end_clean(),但是有使用它的副作用,因爲它會在循環中? – samxli

8

print_debugger()功能會起作用,但它附加在底部的電子郵件頭和消息。如果你想要的是調試信息(包括成功和錯誤消息)的數組,你可以考慮延長電子郵件類的功能如下:

<?php 

class MY_Email extends CI_Email 
{ 

    public function clear_debugger_messages() 
    { 
    $this->_debug_msg = array(); 
    } 

    public function get_debugger_messages() 
    { 
    return $this->_debug_msg; 
    } 
} 

你會希望把這個在在您的./application/libraries文件夾中名爲MY_Email.php的文件。 CodeIgniter會自動識別這個類的存在並用它來代替它的默認類。

如果你想獲得調試信息的列表(陣列),然後你可以這樣做:

$this->email->get_debugger_messages(); 

如果你通過循環消息和不希望包括來自以前的嘗試調試信息,你可以這樣做:

foreach ($email_addresses as $email_address) 
{ 
    $this->email->to($emai_address); 

    if (! $this->email->send()) 
    { 
    echo 'Failed'; 

    // Loop through the debugger messages. 
    foreach ($this->email->get_debugger_messages() as $debugger_message) 
     echo $debugger_message; 

    // Remove the debugger messages as they're not necessary for the next attempt. 
    $this->email->clear_debugger_messages(); 
    } 
    else 
    echo 'Sent'; 
} 

參考:的http://ellislab.com/codeigniter/user-guide/general/creating_libraries.html 「擴展本地庫」 部分。

+0

很酷。感謝分享。 – hakre

+0

這個解決方案看起來非常合適,因爲我已經重寫了電子郵件類的一些部分。我會試試看! – samxli

+0

@samxli - 我已經更新了我的示例,以防萬一您希望在循環訪問電子郵件地址時清除調試器之間的嘗試消息。我添加了一個'clear_debugger_messages'函數並提供了一個詳細的例子。如果你想在所有的嘗試完成後得到所有的調試器消息,那麼不要清除它們,最後你會得到一個完整的數組。 –