CakeEmail调试

时间:2012-03-21 01:09:39

标签: cakephp cakephp-2.0

我正在尝试在我的控制器中设置测试电子邮件,以便按原样输出电子邮件,而不会实际发送电子邮件。我正在使用CakePHP 2.1

在我的控制器顶部,我有:

App::uses('CakeEmail', 'Network/Email');

在我的控制器中,方法是:

$email = new CakeEmail('default');  
$email->from(array('me@example.com' => 'My Site'));  
$email->to('you@example.com');  
$email->subject('About');  
$email->send('My message');

在我的电子邮件配置中,我将$ default设置为Debug模式:

public $default = array(
    'transport' => 'Debug',
    'from' => 'you@localhost.com',
    //'charset' => 'utf-8',
    //'headerCharset' => 'utf-8',
);

如何输出电子邮件?我已经搜索过谷歌并且一无所获。

3 个答案:

答案 0 :(得分:8)

send()方法实际上返回一个包含电子邮件标题和正文的数组(每个都作为字符串)。因此,如果您正在编写单元测试,则可以搜索这些字符串以查看它们是否包含应有的内容。

如果要在不发送电子邮件的情况下运行send命令,可以将传输方法更改为“调试”传输,这将通过格式化电子邮件的动作而不实际发送它。

例如:

$email = new CakeEmail();
$email->transport('Debug');
$response = $email->send();
echo $response['headers']; // headers as string
echo $response['message']; // message body with attachments

请注意,如果您要发送HTML电子邮件和/或使用附件,则正文将以某种编码形式包含这些项目。如果您要发送普通和HTML编码的电子邮件,则某些内容将出现两次(一次是普通的,再次是HTML)。

与Drawrdesign一样,我打算在浏览器中预览我的电子邮件。有两种方法需要考虑:

  • 解析send()返回的'message'并输出相关内容 部分。
  • 只需将我的电子邮件模板渲染为普通的Cake模板即可 输出结果。

一旦我实施了解决方案,我会尝试更新我的答案。

答案 1 :(得分:5)

在启用日志的情况下构建CakeEmail:

$Email = new CakeEmail(array('log' => true));

下面的代码是CakeEmail类send()方法的摘录,应该是非常自我解释的。

    $contents = $this->transportClass()->send($this);
    if (!empty($this->_config['log'])) {
        $level = LOG_DEBUG;
        if ($this->_config['log'] !== true) {
            $level = $this->_config['log'];
        }
        CakeLog::write($level, PHP_EOL . $contents['headers'] . PHP_EOL . $contents['message']);
    }
    return $contents;

因此,您的电子邮件将以该日志文件结束。

如果您不喜欢这样,可以自由编写自己的传输类并登录到数据库,会话或只是调试()传输类中的输出,请按照您的喜好进行操作!

答案 2 :(得分:1)

可以查看您的电子邮件以及未实际发送的内容。这是我发现的一个巧妙的小技巧,非常有用,虽然它可能有点“hacky”:

诀窍是将包含任何数据的电子邮件呈现到特定的布局和模板中,然后在使用电子邮件组件发送之前显示此结构。我想出了以下函数来测试电子邮件(调试它们):

public function debugEmail() {

    // set some data for your email
    $data = 'foo';
    $this->set(compact('data'));    

    // setup layout and a View instance
    $this->layout = 'Emails/html/default';
    $View = new View($this, false);

    // render the email template including the layout into a variable
    $html = $View->render('../Emails/html/cron/your_template');

    // print the contents on screen (do NOT use pr() here!)
    print_r($html);
    exit;
}

该示例利用布局设置为默认的html电子邮件布局和名为your_template的模板。它简单地将给定布局中框架的电子邮件模板呈现为变量并将其打印在屏幕上。浏览器将解释HTML,您将看到您的电子邮件的样子。

注意:某些电子邮件客户端会显示您的html略有不同。您将需要使用内联样式(CSS)并执行跨程序检查以验证所有内容是否到位。该功能主要用于检查给定数据是否在我的电子邮件中正确构建和显示。