CakeEmail отладка - PullRequest
       4

CakeEmail отладка

3 голосов
/ 21 марта 2012

Я пытаюсь настроить тестовое электронное письмо в моем контроллере, которое выводит электронное письмо так, как оно будет выглядеть, без фактической отправки электронного письма. Я использую 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 режим отладки:

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

Как вывести электронную почту? Я искал Google и вернулся ни с чем.

Ответы [ 3 ]

8 голосов
/ 10 декабря 2012

Метод 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, я планирую предоставить предварительный просмотр своей электронной почты в браузере.Есть два метода, которые нужно рассмотреть:

  • Разобрать 'message', возвращаемое send (), и вывести соответствующие разделы.
  • Просто обработать мой шаблон электронной почты как обычный шаблон Cake и вывестиэтот результат.

Я постараюсь обновить свой ответ, как только я реализовал решение.

5 голосов
/ 21 марта 2012

Построить CakeEmail с включенным журналом:

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

Следующий код является выдержкой из метода send () классов CakeEmail, он должен быть достаточно понятен.

    $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;

Таким образом, ваша электронная почта окажется в этом файле журнала.

Если вам не нравится это, не стесняйтесь писать свой собственный транспортный класс и регистрировать в базе данных, сеанс или просто отлаживать () вывод в вашем транспортном классе, делайте, как вам нравится!

1 голос
/ 18 октября 2014

Можно просмотреть вашу электронную почту и то, как она будет выглядеть, фактически не отправляя ее.Я обнаружил, что это изящный маленький трюк и он довольно полезен, хотя может показаться немного «хакерским»:

Хитрость заключается в том, чтобы перевести вашу электронную почту, включая любые данные, в определенный макет и шаблон, а затем отобразить эту структуру передотправив его с помощью компонента Email.Я придумал следующую функцию для проверки электронной почты (отладки):

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 немного по-другому.Вам нужно будет использовать inline-styles (CSS) и выполнить межпрограммную проверку, чтобы убедиться, что все на месте.Эта функция в основном используется для проверки того, что данные данные структурированы и правильно отображаются в моих электронных письмах.

...