2

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

这一切都非常出色,并极大地改进了我们的应用程序。

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

再次一切正常(正常)。

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

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

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

4

1 回答 1

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可能包含没有附件数据的主体数据,因此值得尝试 append $this->_body,而不是$this->_finalbody函数。我还没有测试过这个,所以我不确定。

希望这会有所帮助!

于 2012-08-27T17:21:44.167 回答