2011-06-19 15 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

これが本番環境にある場合は、通常、すべてのエラーログをオフにします。エラー報告をnoneに設定しても、CIエラー処理ログ機能は動作しますか? – samxli

答えて

0

メールログを確認できます。メールのエラーが出た場合は、その理由を示すレコードが必要です。

システムに依存しますが、どこに配置されるのかわかりません。

+0

CI電子メールクラスで電子メールログをどのように設定しますか? – samxli

12

あなたはさらに、電子メールのデバッガを使用して何が起こったのかを調べることができます:Codeigniter Email Class Referenceから

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

あなたは文字列としてデバッガ出力が必要な場合は、あなただけのoutput bufferで出力をキャッチすることができます:print_debugger()機能が動作します

$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

大量のメールを送信するためのループ内にsend()があります。電子メールが成功すれば、私は成功メッセージをjsonに入れます。失敗した場合、私はob_end_clean()を使うことができますが、これはループの中にあるので、これを使用する副作用はありますか? – samxli

8

が、それは底に電子メールヘッダーとメッセージを追加します。あなたが望むすべてが(両方の成功とエラーメッセージを含む)デバッグメッセージの配列がある場合は、次のように電子メールのクラスの機能を拡張検討することもでき:

<?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'関数を追加し、詳細な例を提供しました。すべての試行が完了した後にすべてのデバッガメッセージを取得したい場合は、単にデバッグメッセージをクリアしないと、最後に完全な配列が得られます。 –

関連する問題