Codeigniter电子邮件错误处理

时间:2011-06-19 16:16:39

标签: php email codeigniter smtp

CI电子邮件send()函数仅返回true或false。有没有办法得到更详细的原因,为什么发送失败?我正在使用SMTP。

3 个答案:

答案 0 :(得分:15)

您可以使用电子邮件调试程序进一步检查发生的情况:

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

来自Codeigniter Email Class Reference

如果您需要将调试器输出作为字符串,则可以使用output buffer来捕获输出:

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

更新版本中的Codeigniter要求$auto_clear parameter of the email->send() function显式为FALSE,以便不清除消息和调试,如果未能通过FALSE,则会有效地终止调试器函数。

答案 1 :(得分:8)

print_debugger()功能可以使用,但它会在底部附加电子邮件标题和消息。如果你想要的只是一个调试消息的数组(包括成功和错误消息),你可以考虑扩展Email类的功能,如下所示:

<?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';
}

参考:https://www.codeigniter.com/user_guide/general/creating_libraries.html的“扩展本地库”部分。

答案 2 :(得分:-1)

您可以查看邮件日志。如果邮件错误,那么你应该有一个记录,说明为什么在那里。

虽然这取决于您的系统,但我不确定它们的位置。