Codeigniter电子邮件错误处理


Codeigniter Email error handling

CI电子邮件send()函数只返回true或false。有没有办法更详细地了解发送失败的原因?我正在使用SMTP。

您可以使用电子邮件调试器来进一步检查发生了什么

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

来自Codeigniter电子邮件类参考。

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

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

最近版本中的Codeigniter要求email->send()函数的$auto_clear参数显式为FALSE,以便不清除消息和调试,如果未能传递FALSE,则会有效地终止调试器函数。

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

您可能希望将其放在您的中名为MY_Email.php的文件中/应用程序/库文件夹。CodeIgniter将自动识别这个类的存在,并使用它来代替它的默认类。

当您想要获得调试消息的列表(数组)时,您可以这样做:

$this->email->get_debugger_messages();

如果您正在循环消息,并且不想包含以前尝试的调试器消息,您可以这样做:

foreach ($email_addresses as $email_address)
{
  $this->email->to($email_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.

代码点火器3:

if ( $this->email->send() ) {
    echo 'Your Email has successfully been sent.';
} else {
    $errors = $this->email->print_debugger();
    print_r($errors);
}

您可以查看邮件日志。如果邮件出错,那么你应该有一个记录,说明原因。

我不确定他们会在哪里,尽管这取决于你的系统。