Отправка электронной почты в CakePHP 3



При создании большинства сайтов часто возникает необходимость многократной отправки электронных сообщений различным пользователям. Чтобы производить подобные отправки из любой части приложения в CakePHP 3 существует класс Mailer. Этот класс также может использоваться для хранения нескольких конфигураций электронной почты в одном месте, что помогает поддерживать код в стиле DRY и устраняет помехи конфигурации электронной почты из других областей вашего приложения. В этой статье я покажу шаги для правильной настройки и работы функции отправки электронной почты в приложении на базе фреймворка CakePHP 3.

ПРИМЕЧАНИЕ. В первую очередь, чтобы отправлять электронные письма из CakePHP 3, вам необходимо выполнить настройки сервера электронной почты в самом приложении:

//исправьте следующие элементы в массиве файла config/app.php 
    'EmailTransport' => [
        'default' => [
            'className' => 'Mail',
            // В SMTP-транспорте используются следующие ключи
            'host' => 'localhost',
            'port' => 25,
            'timeout' => 30,
            'username' => 'логин', 
            'password' => 'пароль',
            'client' => null,
            'tls' => null,
            'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
        ], 
    ],

    'Email' => [
        'default' => [
            'transport' => 'default',
            'from' => ['Mihail.T@mycakephp.ru' => 'Блог MyCakePHP.ru'],
            //'charset' => 'utf-8',
            //'headerCharset' => 'utf-8',
        ],
    ],

Как уже говорилось выше, в этом примере мы будем использовать класс CakePHP 3 - Mailer. Далее приведены шаги для настройки функции отправки электронной почты:

  • Создайте новый экземпляр класса Mailer с любым именем в соответствии с вашими предпочтениями. В примере будет использоваться имя SendEmail. Быстро создать этот класс вам поможет консоль кейка. Откройте командную строку в каталоге проекта и выполните следующую команду:

    // Если у вас Windows, то используйте обратный слэш (например bin\cake bake mailer SendEmail).
    bin/cake bake mailer SendEmail

    Это создаст необходимый файл макета в каталоге - src/Template/Layout/Email/html с именем send_email.ctp и такой же файл в каталоге src/Template/Layout/Email/text. А так же создает новый каталог Mailer с файлом класса SendEmailMailer.php для нашего имени SendEmail;
  • Теперь добавьте публичный метод с именем SendEmail в класс SendEmailMailer (файл src/Mailer/SendEmailMailer.php), как показано ниже (мы будем отправлять сообщение в формате html, используя соответствующие шаблоны вида):
    public function sendEmail($user)
        {
            return $this
            ->setTo($user->mail) //адрес получателя
            ->setSubject('Пример отправки сообщения пользователю') //тема сообщения
            ->setEmailFormat('html') //формат сообщения
            ->setLayout('send_email') //используемый макет (src/Template/Layout/Email/html/send_email.ctp)
            ->setTemplate('default') //используемый шаблон (src/Template/Email/html/default.ctp)
            ->set(['content'=>'<h1>'.sprintf('Здравствуйте %s', $user->name).'</h1><br> <p>Это тестовое сообщение, отправленное Вам при изучении урока 
    <a href="https://mycakephp.ru/blog/Otpravka-elektronnoy-pochty-v-CakePHP-3.html" target="_blank" rel=" noopener noreferrer">
    Отправка электронной почты в CakePHP 3</a></p>']); //текст сообщения 
        }
    Так как мы решили отправлять сообщения в html формате, то наши шаблоны видов будут выглядеть подобным образом:
    <!--файл src/Template/Layout/Email/html/send_email.ctp-->
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
    <html>
    <head>
        <title><?= $this->fetch('title') ?></title>
        <style type="text/css">
            h1{
                margin: 0;
            }
        </style>
    </head>
    <body>
        <?= $this->fetch('content') ?>
    </body>
    </html>
    //файл src/Template/Email/html/default.ctp
    <?php
    echo $content;
  • Далее, в каком либо контроллере, например «UsersController» вверху добавьте use Cake\Mailer\MailerAwareTrait, а внутри сласса UsersController, перед экшенами, добавьте use MailerAwareTrait, как показано ниже:
    namespace App\Controller;
    
    use Cake\Mailer\MailerAwareTrait;
    
    class UsersController extends AppController
    {
        use MailerAwareTrait;
    
        public function register() //экшен регистрации пользователя
        {
            $user = $this->Users->newEntity();
            if ($this->request->is('post')) {
                $user = $this->Users->patchEntity($user, $this->request->getData())
                if ($this->Users->save($user)) {
                    $this->getMailer('SendEmail')->send('sendEmail', [$user]); //отправка сообщения об успешной регистрации
                }
            }
            $this->set('user', $user);
        }
    }

$this->getMailer('SendEmail')->send('sendEmail', [$user]) вы можете добавлять в любых методах, в которых хотите выполнить отправку электронной почты. 'SendEmail' - это имя класса Mailer, которое мы создали с помощью консоли кейка, 'sendEmail' - это имя метода, присутствующее в классе SendEmail, а [$ user] - это любые данные в форме «ARRAY». И если вы выполнили всё правильно, то электронное письмо будет отправлено адресату.

Таким образом, согласно приведенному выше примеру, мы можем легко отправлять электронные письма в CakePHP 3. Дополнительную информацию о настройке многократно отправляемых сообщений вы можете посмотреть на официальном сайте кейка (информация там уже представлена на русском языке).