【问题标题】:Codeigniter Email error handlingCodeigniter 电子邮件错误处理
【发布时间】:2011-09-18 05:10:20
【问题描述】:

CI Email send() 函数只返回 true 或 false。有没有办法获得发送失败的更详细原因?我正在使用 SMTP。

【问题讨论】:

  • 如果这是在生产中,我通常会关闭所有的错误记录。如果我将错误报告设置为无,CI 错误处理日志功能是否仍然有效?
  • 你不应该在生产环境中关闭错误日志,只关闭错误报告:如果有错误,禁用错误报告不会阻止日志文件被写入。 (CI error handling)
  • Email 类在内部记录它拥有的错误,无论错误是否在名为$_debug_msg 的变量中被抑制。我已经为您提供了一个答案,该答案扩展到了 Email 类的功能,并允许您检索数组或调试消息。

标签: php email codeigniter smtp


【解决方案1】:

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

$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,则有效地终止调试器功能。

【讨论】:

  • 我需要将调试器输出到字符串,因为我将错误返回到前端(通过 json)。有什么办法吗?
  • 我已经编辑了答案,向您展示了如何将调试器输出也分配给变量。
  • 我在一个循环中有 send() 用于发送大量电子邮件。如果电子邮件成功,我将成功消息放入 json。如果失败,我可以使用 ob_end_clean(),但使用它是否有副作用,因为它将处于循环中?
  • 我不知道你的申请,你没有在你的问题中展示或告诉过任何这些。所以很难说。您可以将$error 设为一个数组,这样它就可以只包含多个错误消息。或者你连接字符串。再次添加一些代码作为示例。
  • 从 3.1.0 版开始(也可能在以前的版本中) print_debugger() 已经返回一个字符串,而不是输出。所以包装这个函数的 ob_start() 和 ob_get_clean() 会得到一个空字符串。您必须直接执行: $error = $this->email->print_debugger();
【解决方案2】:

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($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 的“扩展原生库”部分。

【讨论】:

  • 这个解决方案看起来很合适,因为我已经覆盖了电子邮件类的一些部分。我试试看!
  • @samxli - 我已经更新了我的示例,以防万一您想在遍历电子邮件地址时清除两次尝试之间的调试器消息。我添加了一个clear_debugger_messages 函数并提供了一个详细的示例。如果您想在所有尝试完成后获取所有调试器消息,只需不要清除它们,最后您将获得一个完整的数组。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2011-06-12
    • 2014-06-07
    • 2015-03-17
    • 2016-05-06
    • 2018-05-24
    • 2016-09-02
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多