От автора: приветствую вас, друзья. Мы продолжаем цикл статей, посвященных знакомству с фреймворком Yii2. В этой статье мы поговорим о том, как происходит в Yii2 отправка почты. Из статьи вы узнаете, как настроить фреймворк и как отправить письмо на реальный email.
Практически на любом сайте так или иначе возникает необходимость в отправке почты. Это может быть банальная форма обратной связи, через которую пользователь имеет возможность написать администратору сайта. Это может быть заказ товаров в интернет-магазине, когда менеджеру магазина необходимо доставить письмо с уведомлением о новом заказе. Варианты могут быть разные, но суть одна – практически на любом сайте необходим такой функционал.
Как же реализовать эту задачу в Yii? Сделать это достаточно просто. Фреймворк предлагает расширение swiftmailer, которое нам нужно просто настроить. Настраивается оно в файле config\web.php. Вот настройки класса swiftmailer по умолчанию:
1 2 3 4 5 6 7 |
'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' => true, ], |
Обратите внимание на настройку useFileTransport со значением true. Данное значение устанавливает заглушку, и письмо не отправляется реально, его отправка просто эмулируется. Файл письма при этом будет сохранен в папку runtime\mail.
Давайте протестируем отправку. Для этого нам даже ничего не потребуется писать, поскольку в Yii уже есть контактная форма по адресу //yii.loc/site/contact:
За работу данной формы отвечает действие actionContact контроллера SiteController. Сама форма настраивается в модели ContactForm. В модели определяются свойства, отвечающие за поля формы, метод rules, задающий правила валидации, метод attributeLabels, которым можно задать названия полей в label и, наконец, метод contact, который и отправляет письмо.
Именно метод contact модели и вызывается в действии контроллера. В качестве параметра он передает email администратора, который указан в параметрах (файл config\params.php). Давайте попробуем отправить письмо. После формирования письма на странице мы увидим соответствующее сообщение, а в папке runtime\mail появится файл письма.
Как я уже отмечал, отправка письма при этом реально не произошла. Как же научить Yii отправлять сообщение на реальный email? Для этого нам необходимо вернуться в файл config\web.php и настроить отправку почты. Для начала значение useFileTransport необходимо выставить в false, а затем добавить массив настроек transport с настройками SMTP выбранного почтовика. Для примера я использую SMTP yandex.ru:
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.yandex.ru', 'username' => 'your login', 'password' => 'your password', 'port' => '465', 'encryption' => 'ssl', ], ], |
Также внесем небольшое изменение в метод contact модели. В параметре setFrom укажем email (также его можно добавить и в параметры, чтобы использовать в дальнейшем повторно, как email администратора), через который будет отправлен email, поскольку отправитель должен быть реальным. В противном случае письмо не будет отправлено.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public function contact($email) { if ($this->validate()) { Yii::$app->mailer->compose() ->setTo($email) ->setFrom(['your email' => $this->name]) ->setSubject($this->subject) ->setTextBody($this->body) ->send(); return true; } return false; } |
Теперь проверим, работает ли новый функционал. После отправки формы теперь письмо не попадает во временную папку, а реально доставляется на указанный email. Как видим, это не очень сложно.
На этом у меня все. Больше о фреймворке вы можете узнать из наших бесплатных или платных уроков. Также создание простейшего блога на Yii2 можно посмотреть в этом цикле уроков.
Комментарии (2)