Yii2 відправка пошти

302

Від автора: вітаю вас, друзі. Ми продовжуємо цикл статей, присвячених знайомству з фреймворком Yii2. У цій статті ми поговоримо про те, як відбувається в Yii2 відправка пошти. Зі статті ви дізнаєтеся, як налаштувати фреймворк і як відправити лист на реальний email.

Практично на будь-якому сайті так чи інакше виникає необхідність у відправленні пошти. Це може бути банальна форма зворотного зв’язку, через яку користувач має можливість написати адміністратору сайту. Це може бути замовлення товарів в інтернет-магазині, коли менеджеру магазину необхідно доставити лист з повідомленням про нове замовлення. Варіанти можуть бути різні, але суть одна – практично на будь-якому сайті необхідний такий функціонал.

Як же реалізувати це завдання в Yii? Зробити це досить просто. Фреймворк пропонує розширення swiftmailer, що нам потрібно просто налаштувати. Налаштовується воно у файлі config\web.php. Ось налаштування класу swiftmailer за замовчуванням:

‘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,
],

Yii2 відправка пошти

Зверніть увагу на налаштування useFileTransport зі значенням true. Дане значення встановлює заглушку, і лист не відправляється реально, його відправка просто емулюється. Файл листа при цьому буде збережено в папці runtime\mail.

Давайте протестуємо відправку. Для цього нам навіть нічого не потрібно писати, оскільки в Yii вже є контактна форма за адресою http://yii.loc/site/contact:

Yii2 відправка пошти

За роботу даної форми відповідає дію actionContact контролера SiteController. Сама форма налаштовується в моделі ContactForm. У моделі визначаються властивості, які відповідають за поля форми, метод rules, що задає правила валідації, метод attributeLabels, яким можна задати назви полів у label і, нарешті, метод contact, який і надсилає лист.

Yii2 відправка пошти

Саме метод contact моделі і викликається в дії контролера. В якості параметра він передає email адміністратора, який вказаний у параметрах (файл config\params.php). Давайте спробуємо відправити лист. Після формування листа на сторінці ми побачимо відповідне повідомлення, а в папці runtime\mail з’явиться файл листи.

Yii2 відправка пошти

Як я вже зазначав, відправка листа при цьому реально не відбулася. Як же навчити Yii відправляти повідомлення на реальний email? Для цього нам необхідно повернутися в файл config\web.php і налаштувати відправку пошти. Для початку значення useFileTransport необхідно виставити в false, а потім додати масив налаштувань transport з налаштуваннями SMTP обраного поштовика. Для прикладу я використовую SMTP yandex.ru:

‘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’ => ‘[email protected]’,
‘password’ => ‘oc_2017’,
‘port’ => ‘465’,
‘encryption’ => ‘ssl’,
],
],

Також внесемо невелика зміна в метод contact моделі. У параметрі setFrom вкажемо email (також можна додати і параметри, щоб використовувати в подальшому повторно, email адміністратора), через який буде надісланий email, оскільки відправник повинен бути реальним. В іншому випадку листа не буде відправлено.

public function contact($email)
{
if ($this->validate()) {
Yii::$app->mailer->compose()
->setTo($email)
->setFrom([‘[email protected]’ => $this->name])
->setSubject($this->subject)
->setTextBody($this->body)
->send();
return true;
}
return false;
}

Тепер перевіримо, чи працює новий функціонал. Після відправки форми тепер лист не потрапляє в тимчасову папку, а реально доставляється на вказаний email. Як бачимо, це не дуже складно.

На цьому у мене все. Більше про фреймворку ви можете дізнатися з наших безкоштовних або платних уроків. Також створення найпростішого блогу на Yii2 можна подивитися в цьому циклі уроків.