Отправка почты
Сайт отправляет письма: подтверждение регистрации, уведомление о комментарии. В CakePHP за это отвечает класс Mailer. Способ доставки — транспорт — задают в настройках, а текст письма пишут шаблоном, как страницу.
Настройка
Транспорт описан в разделе EmailTransport. Параметры почтового сервера записывают в config/app_local.php:
// config/app_local.php
'EmailTransport' => [
'default' => [
'className' => 'Smtp',
'host' => 'smtp.example.com',
'port' => 587,
'username' => 'blog@example.com',
'password' => 'secret',
'tls' => true,
],
],Адрес отправителя по умолчанию задаёт раздел Email в config/app.php: ключ from профиля default.
Простое письмо
// src/Controller/ArticlesController.php
use Cake\Mailer\Mailer;
$mailer = new Mailer('default');
$mailer
->setTo('anna@example.com')
->setSubject('Новая статья')
->deliver('В блоге вышла новая статья.');Mailer('default') берёт профиль default из настроек. deliver() отправляет письмо с переданным текстом. Поместите код в действие add() после успешного сохранения — на адрес придёт письмо.
Свой класс писем
Письма одного раздела собирают в класс в папке src/Mailer:
bin/cake bake mailer User// src/Mailer/UserMailer.php
namespace App\Mailer;
use App\Model\Entity\User;
use Cake\Mailer\Mailer;
class UserMailer extends Mailer
{
public function welcome(User $user): void
{
$this
->setTo($user->email)
->setSubject('Добро пожаловать')
->setViewVars(['user' => $user]);
}
}Каждый метод — одно письмо. setViewVars() передаёт переменные в шаблон письма, как set() в контроллере.
Шаблон письма
Шаблон называется по имени метода. Создайте templates/email/text/welcome.php:
Здравствуйте!
Вы зарегистрировались в блоге с адресом <?= $user->email ?>.Это текстовое письмо, поэтому тегов в нём нет. Для письма с разметкой создают второй файл — templates/email/html/welcome.php — и вызывают в методе setEmailFormat('both').
Отправка
// src/Controller/UsersController.php
use Cake\Mailer\MailerAwareTrait;
class UsersController extends AppController
{
use MailerAwareTrait;
public function add()
{
// ... сохранение пользователя
$this->getMailer('User')->send('welcome', [$user]);
}
}getMailer('User') создаёт UserMailer, send() вызывает метод welcome() с аргументами из массива и отправляет письмо. После регистрации пользователь получит приветствие.
Методы письма
| Метод | Что задаёт |
|---|---|
setTo(), setCc(), setBcc() | Получатели |
setFrom() | Отправитель |
setSubject() | Тема |
setEmailFormat('html') | Формат: text, html, both |
setAttachments(['/path/file.pdf']) | Вложения |
Частая ошибка
На компьютере разработчика почтового сервера обычно нет, и отправка заканчивается ошибкой соединения. Для разработки задайте транспорту 'className' => 'Debug': письмо никуда не уходит, а его содержимое возвращает метод send() — массив с ключами headers и message можно вывести через debug().