Codeigniter电子邮件错误处理

sam*_*xli 18 php email smtp codeigniter

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

hak*_*kre 17

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

$r = $this->send(FALSE);
if (!$r)
  $this->email->print_debugger()
  ;
Run Code Online (Sandbox Code Playgroud)

来自Codeigniter电子邮件类参考.

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

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

笨在最近的版本需要的明确FALSE $auto_clear 的参数email->send()功能,以不清除消息和调试,可有效查杀在线调试功能,如果你不及格FALSE.

  • 从3.1.0版开始(可能在以前的版本中也是如此),print_debugger()已经返回了字符串,而不是输出。因此,包装此函数的ob_start()和ob_get_clean()将获得一个空字符串。您必须直接执行:$ error = $ this-> email-> print_debugger(); (2认同)

Fra*_*nes 9

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

您需要将它放在./application/libraries文件夹中名为MY_Email.php的文件中.CodeIgniter将自动识别此类的存在并使用它而不是它的默认类.

如果要获取调试消息的列表(数组),则可以执行以下操作:

$this->email->get_debugger_messages();
Run Code Online (Sandbox Code Playgroud)

如果您正在循环浏览消息并且不想包含先前尝试的调试器消息,则可以执行以下操作:

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';
}
Run Code Online (Sandbox Code Playgroud)

参考:https://www.codeigniter.com/user_guide/general/creating_libraries.html的"扩展本机库"部分.


mar*_*olf -1

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

我不确定它们将位于哪里,但这取决于您的系统。