使用print_debugger捕获电子邮件smtp错误而不附加转储

时间:2012-08-27 15:57:37

标签: php codeigniter email smtp

场景:我有许多Codeigniter应用程序,我正在改进电子邮件传送系统以使用数据库队列。所以我的应用程序会记录所有需要发送到数据库的电子邮件。我每分钟运行一次cron作业来检查这个数据库队列并发送任何待处理的电子邮件(根据需要限制到我的服务器限制)。

这一切都非常有效,并且大大改善了我们的应用程序。

部分功能是它会记录未发送电子邮件的时间,并会在稍后再次重试。作为该过程的一部分,我更新数据库以在发送尝试期间包含任何错误消息,以便稍后进行调试。我用$ this-> email-> print_debugger()。

执行此操作

再一次正常工作(通常)。

问题是如果附件包含在电子邮件中,附件“数据”会作为print_debugger()的一部分进行转储 - 因此我的数据库会被附件数据的大量文本转储粉碎。

我尝试了什么:所以我去找了codeigniter的Email.php类,认为我可以将库扩展到不包含print_debugger()函数中的附件数据 - 但似乎从该函数返回的错误实际上来自另一个函数中的SMTP服务器本身。我无法找到一种方法来阻止错误发生的附件数据。

问题/挑战:任何人都可以看到我可以捕获SMTP错误的方式,以及电子邮件标题 - 但不是附件数据?我很乐意接受不捕获任何电子邮件正文(因为我知道在我的数据库队列中是什么)。

1 个答案:

答案 0 :(得分:1)

我相信你可以扩展库。这是当前的功能:

public function print_debugger()
{
    $msg = '';

    if (count($this->_debug_msg) > 0)
    {
        foreach ($this->_debug_msg as $val)
        {
            $msg .= $val;
        }
    }

    $msg .= "<pre>".$this->_header_str."\n".htmlspecialchars($this->_subject)."\n".htmlspecialchars($this->_finalbody).'</pre>';
    return $msg;
}

返回的内容有四个主要部分:

  • _debug_msg - 调试消息
  • _header_str - 电子邮件的标题
  • _subject - 电子邮件的主题
  • _finalbody - 消息正文附件数据

在没有_finalbody的情况下实现类似的功能应该会为您提供所需的输出但没有正文和附件数据。

这是一个示例解决方案,(类'MY_Email'位于:application/libraries/MY_Email.php):

class MY_Email extends CI_Email
{
    public function my_print_debugger()
    {
        $msg = '';

        if (count($this->_debug_msg) > 0)
        {
            foreach ($this->_debug_msg as $val)
            {
                $msg .= $val;
            }
        }

        $msg .= "<pre>".$this->_header_str."\n".htmlspecialchars($this->_subject)."\n".'</pre>';
        return $msg;
    }
}

查看该类的代码,我认为$_body可能包含没有附件数据的正文数据,因此值得尝试附加$this->_body而不是$this->_finalbody到功能。我还没有测试过,所以我不确定。

希望这有帮助!