От автора: приветствую вас, друзья. Мы продолжаем цикл статей, посвященных знакомству с фреймворком Yii2. В этой статье мы с вами познакомимся с таким вопросом, как отправка почты в Yii2. Для этого мы можем использовать специальное расширение swiftmailer, настройку которого и рассмотрим в данной статье.
Итак, для отправки почтовых сообщений с сайта Yii2 использует популярное расширение swiftmailer. Его настройка производится в файле конфигурации config/web.php, где мы можем найти дефолтную конфигурацию данного компонента:
Как видим, в качестве компонента отправки почты – mailer – используется соответствующий класс и дополнительно используется только одна опция – useFileTransport со значением true. Данная опция позволяет тестировать отправку почты, т.е. письмо будет формироваться, но отправляться не будет, а будет сохраняться в файл.
Давайте попробуем сформировать и отправить тестовое письмо. Для этого достаточно использовать следующий базовый код:
1 2 3 4 5 6 7 |
Yii::$app->mailer->compose() ->setFrom('from@domain.com') ->setTo('to@domain.com') ->setSubject('Тема сообщения') ->setTextBody('Текст сообщения') ->setHtmlBody('<b>текст сообщения в формате HTML</b>') ->send(); |
Давайте поместим его в экшен главной страницы и обновим ее:
Теперь заглянем в папку runtime/mail – именно туда и сохраняет фреймворк тестовые письма. Если такая папка появилась (изначально ее нет) и в ней есть файл с расширением .eml – значит компонент работает в тестовом режиме и можно настроить его и переходить в режим «боевой».
Для этого нам необходимо отключить тестовый режим (‘useFileTransport’ => false) и указать настройки используемого SMTP (хост, логин, пароль, порт, протокол) в файле конфигурации:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', // send all mails to a file by default. You have to set // 'useFileTransport' to false and configure a transport // for the mailer to send real emails. 'useFileTransport' => false, 'transport' => [ 'class' => 'Swift_SmtpTransport', 'host' => 'smtp.ukr.net', // e.g. smtp.mandrillapp.com or smtp.gmail.com 'username' => 'user@ukr.net', 'password' => 'password', 'port' => '2525', // Port 25 is a very common port too 'encryption' => 'ssl', // It is often used, check your provider or mail server specs ], ], |
В примере я использовал SMTP сервиса ukr.net. Значениями username и password необходимо использовать почту и пароль от нее на данном сервисе. Также можно использовать и любой другой SMTP.
Осталось внести изменения в код отправки письма. В метод setFrom мы должны передать email, который и используется для отправки письма. Также можно передать параметр в виде массива, где ключом будет искомый email, а значением – текст, который будет подставлен в поле От. Ну и, конечно же, укажем реальный email получателя в методе setTo:
1 2 3 4 5 6 7 |
Yii::$app->mailer->compose() ->setFrom(['testishop2@ukr.net' => 'Письмо с сайта']) ->setTo('email получателя') ->setSubject('Тема сообщения') ->setTextBody('Текст сообщения') ->setHtmlBody('<b>текст сообщения в формате HTML</b>') ->send(); |
Попробуем обновить страницу и проверим email получателя. Если все сработало, тогда там мы увидим полученное письмо:
Отлично, работает! А что если нам нужно отправить большое письмо? Конечно, мы можем сформировать его в методе setHtmlBody или сформировать в некоторой переменной, которую и передать параметром в setHtmlBody. Но есть куда более правильный способ. В метод compose мы можем передать параметры. Первый параметр — это вид, в котором мы и разместим необходимый HTML код письма. Вид поместим в папку mail в корне проекта. Вторым параметром мы можем передать массив переменных, которые можно использовать в искомом виде.
В качестве примера давайте сформируем простенькую табличку. Вид назовем test.php и используем в нем массив данных $names.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<table style="border: 1px solid #ddd; border-collapse: collapse; width: 100%;"> <thead> <tr style="background: #f9f9f9;"> <th style="padding: 8px; border: 1px solid #ddd;">#</th> <th style="padding: 8px; border: 1px solid #ddd;">Имя</th> </tr> </thead> <tbody> <?php $i = 1; foreach($names as $name): ?> <tr> <td style="padding: 8px; border: 1px solid #ddd;"><?= $i ?></td> <td style="padding: 8px; border: 1px solid #ddd;"><?= $name ?></td> </tr> <?php $i++; endforeach; ?> </tbody> </table> |
И укажем необходимые данные в методе compose, при этом методы setTextBody и setHtmlBody нам больше не нужны, поскольку текст письма будет взят из вида, поэтому удалите или закомментируйте вызов указанных методов:
1 2 3 4 5 6 7 8 |
$names = ['Иванов', 'Петров', 'Сидоров']; Yii::$app->mailer->compose('test', ['names' => $names]) ->setFrom(['testishop2@ukr.net' => 'Письмо с сайта']) ->setTo('email получателя') ->setSubject('Тема сообщения!') //->setTextBody('Текст сообщения') //->setHtmlBody('<b>текст сообщения в формате HTML</b>') ->send(); |
Попробуем обновить страницу сайта и проверим email получателя, там должно быть письмо с примерно таким содержимым:
Все просто, не так ли? На этом сегодня все. Больше о фреймворке вы можете узнать из наших бесплатных или платных уроков. Также создание простейшего блога на Yii2 можно посмотреть в этом цикле уроков.