Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Отправка почты

Сайт отправляет письма: подтверждение регистрации, уведомление о комментарии. В 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().

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.