Php 在没有附件转储的情况下使用print_调试器捕获电子邮件smtp错误

Php 在没有附件转储的情况下使用print_调试器捕获电子邮件smtp错误,php,codeigniter,email,smtp,Php,Codeigniter,Email,Smtp,场景:我有许多Codeigniter应用程序,我正在改进电子邮件传递系统以使用数据库队列。因此,我的应用程序记录所有需要发送到数据库的电子邮件。我每分钟运行一个cron作业来检查这个数据库队列,并发送任何挂起的电子邮件(根据需要限制到我的服务器限制) 它的工作非常出色,极大地改进了我们的应用程序 该功能的一部分是,它会在电子邮件未发送时进行记录,并在稍后重试。作为该过程的一部分,我将更新数据库,以便在发送尝试期间包含任何错误消息,以便稍后进行调试。我用$this->email->print\u

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

它的工作非常出色,极大地改进了我们的应用程序

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

再次确认所有工作正常(正常)

问题是如果电子邮件中包含附件,则附件“数据”将作为print_debugger()的一部分转储-因此我的数据库将被大量文本转储的附件数据破坏

我尝试的内容:因此,我查看了codeigniter的Email.php类,认为我可以扩展该库,使其在print_debugger()函数中不包含附件数据-但从该函数返回的错误似乎实际上来自另一个函数中的SMTP服务器本身。我看不到阻止附件数据通过错误的方法


问题/挑战:有人能看到我捕获SMTP错误和电子邮件头的方法吗?但不能捕获附件数据吗?我也很乐意接受不捕获任何电子邮件正文(因为我知道数据库队列中的内容)。

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

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;
}
'; 返回$msg; } }
通过查看类的代码,我认为
$\u body
可能包含没有附件数据的body数据,因此值得尝试将
$this->\u body
而不是
$this->\u finalbody
附加到函数中。我还没有测试过这个,所以我不确定


希望这有帮助

谢谢-我已经试过了-结果是_debug_msg实际上包含了错误和正文(带有附件数据)-所以它不能被拆分嗯,这很奇怪-我已经玩了一段时间了,我已经浏览了好几次库。似乎第1153行:
$attachment[$z++]=chunk_split(base64_encode(fread($fp,$file))负责将附件数据添加到
\u finalbody
,该附件数据由
打印调试程序转储。我仍然认为重写
print\u debugger
方法并引用
\u body
而不是
\u finalbody
应该是可行的。如果您确定附件数据肯定在
\u debug\u msg
中,那么您是否可以发布调试消息?感谢您的测试,如果您可以暂时注释掉第1153行并查看是否仍然转储了附件数据,那将非常有趣。好的-我看了更多-似乎_debug_msg实际上是一个字符串数组。如果我将print_调试器更改为仅使用第一个字符串,我只会收到smtp错误消息,并且我不必存储所有的头、正文、附件等-因此这很完美是的-我已经将其作为建议功能发布在github codeigniter页面上任何说“cron作业每分钟运行一次”的内容都会让我畏缩。你为什么这么说?这是一个每分钟60分钟的请求,这算不了什么?如果你使用IMAP,请使用IDLE。如果您在本地存储中有电子邮件,请使用Procmail(如果您不在类Unix平台上,则使用本地近似值)。
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;
    }
}