- Установка расширения YiiMailer в Yii
- Простая отправка писем
- Отправка писем через SMTP
- Дополнительные настройки перед отправкой письма
- Подробный пример отправки писем через (SMTP)
Будем использовать это расширение: https://github.com/vernes/YiiMailer
Расширение YiiMailer основано на библиотеке PHPMailer, а также доработана для Yii следующими функциями:
- Поддержка макетов
- Возможность работы с представлениями Yii
- Поддержка перевод (мультиязычность)
- Возможность отправлять сообщения из веб-приложения и консоли
- Возможность отправлять HTML сообщения с вложенными изображениями
- Поддержка режима тестирования для сохранения сообщений электронной почты вместо отправки
Установка расширения YiiMailer в Yii
Для начала необходимо скачать расширение github или с сайта.
Скопировать содержимое архива (папка YiiMailer) в папку protected/extensions
Добавьте файл настроек, /protected/config/mail.php:
<?php
return array(
'viewPath' => 'application.views.mail', //путь к папке с представлениями view
'layoutPath' => 'application.views.layouts', //путь к папке с макетами layouts
//путь к папке с изображениями (для отправки из консоли)
'baseDirPath' => 'webroot.images.mail',
'savePath' => 'webroot.assets.mail', //путь к папке для сохранения писем (тестовый режим)
'testMode' => false, //тестовый режим
'layout' => 'mail', //основной макет (layout)
'CharSet' => 'UTF-8', //кодировка
//текст для тех у кого не включено отображение писем содержащих HTML
'AltBody' => Yii::t('YiiMailer', 'You need an HTML capable viewer to read this message.'),
//языковые настройки ошибок и прочего
'language' => array(
'authenticate' => Yii::t('YiiMailer', 'SMTP Error: Could not authenticate.'),
'connect_host' => Yii::t('YiiMailer', 'SMTP Error: Could not connect to SMTP host.'),
'data_not_accepted' => Yii::t('YiiMailer', 'SMTP Error: Data not accepted.'),
'empty_message' => Yii::t('YiiMailer', 'Message body empty'),
'encoding' => Yii::t('YiiMailer', 'Unknown encoding: '),
'execute' => Yii::t('YiiMailer', 'Could not execute: '),
'file_access' => Yii::t('YiiMailer', 'Could not access file: '),
'file_open' => Yii::t('YiiMailer', 'File Error: Could not open file: '),
'from_failed' => Yii::t('YiiMailer', 'The following From address failed: '),
'instantiate' => Yii::t('YiiMailer', 'Could not instantiate mail function.'),
'invalid_address' => Yii::t('YiiMailer', 'Invalid address'),
'mailer_not_supported' => Yii::t('YiiMailer', ' mailer is not supported.'),
'provide_address' => Yii::t('YiiMailer', 'You must provide at least one recipient email address.'),
'recipients_failed' => Yii::t('YiiMailer', 'SMTP Error: The following recipients failed: '),
'signing' => Yii::t('YiiMailer', 'Signing Error: '),
'smtp_connect_failed' => Yii::t('YiiMailer', 'SMTP Connect() failed.'),
'smtp_error' => Yii::t('YiiMailer', 'SMTP server error: '),
'variable_set' => Yii::t('YiiMailer', 'Cannot set or reset variable: ')
),
);
Минимальная настройка для корректной отправки писем.
Откройте основной файл конфигураций и добавьте расширение в элемент массива import /protected/config/config.php (строка 11):
<?php
return array(
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
//...
'import'=>array(
'application.models.*',
'application.components.*',
'ext.YiiMailer.YiiMailer',
),
);
Далее необходимо добавить файл с HTML макетом письма, путь к нему содержит элемент массива настроек layoutPath (файл: /protected/config/mail.php, строка 5), по умолчанию это путь /protected/views/layouts/mail.php. Если вы используете свою тему, то замените путь layoutPath в /protected/config/mail.php на свою тему, например: webroot.themes.myThemeName.views.templates.sendMail (/themes/myThemeName/views/templates/sendMail/mail.php). Добавим макет со следующим содержимым (/protected/views/layouts/mail.php):<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
</head>
<body>
<?php echo $content ?>
</body>
</html>
Сам макет письма можно внедрить любой, на свой вкус, $content - передаваемое содержимое письма или view.
С минимальной настройкой закончили, можем перейти к отправке писем.
Простая отправка писем
В данном примере будет описана простая отправка писем, без SMTP.
После установки и настройки расширения YiiMailer, переходим в контроллер/экшен, который будет отправлять письмо и добавляем код для отправки в нужном месте:
$mail = new YiiMailer();
$mail->setFrom('from@example.com', 'Test User');
$mail->setTo('to@example.com');
$mail->setSubject('Тема письма');
$mail->setBody('Содержание письма');
if ($mail->send()) {
Yii::app()->user->setFlash('contact','Письмо успешно отправлено');
} else {
Yii::app()->user->setFlash('error','Ошибка при отправке письма: '.$mail->getError());
}
Отправка писем через SMTP
Для того чтобы отправлять письма через SMTP, достаточно добавить настройки SMTP в конец массива файла /protected/config/mail.php, пример отправки писем через gmail:
'Mailer' => 'smtp', 'Host' => 'smtp.gmail.com', 'Port' => 465, 'SMTPSecure' => 'ssl', 'SMTPAuth' => true, 'Username' => 'yourEmail@gmail.com', 'Password' => '********',
В итоге файл настроек /protected/config/mail.php примет следующий вид:
<?php
return array(
'viewPath' => 'application.views.mail',
'layoutPath' => 'application.views.layouts',
'baseDirPath' => 'webroot.images.mail',
'savePath' => 'webroot.assets.mail',
'testMode' => false,
'layout' => 'mail',
'CharSet' => 'UTF-8',
'AltBody' => Yii::t('YiiMailer', 'You need an HTML capable viewer to read this message.'),
'language' => array(
'authenticate' => Yii::t('YiiMailer', 'SMTP Error: Could not authenticate.'),
'connect_host' => Yii::t('YiiMailer', 'SMTP Error: Could not connect to SMTP host.'),
'data_not_accepted' => Yii::t('YiiMailer', 'SMTP Error: Data not accepted.'),
'empty_message' => Yii::t('YiiMailer', 'Message body empty'),
'encoding' => Yii::t('YiiMailer', 'Unknown encoding: '),
'execute' => Yii::t('YiiMailer', 'Could not execute: '),
'file_access' => Yii::t('YiiMailer', 'Could not access file: '),
'file_open' => Yii::t('YiiMailer', 'File Error: Could not open file: '),
'from_failed' => Yii::t('YiiMailer', 'The following From address failed: '),
'instantiate' => Yii::t('YiiMailer', 'Could not instantiate mail function.'),
'invalid_address' => Yii::t('YiiMailer', 'Invalid address'),
'mailer_not_supported' => Yii::t('YiiMailer', ' mailer is not supported.'),
'provide_address' => Yii::t('YiiMailer', 'You must provide at least one recipient email address.'),
'recipients_failed' => Yii::t('YiiMailer', 'SMTP Error: The following recipients failed: '),
'signing' => Yii::t('YiiMailer', 'Signing Error: '),
'smtp_connect_failed' => Yii::t('YiiMailer', 'SMTP Connect() failed.'),
'smtp_error' => Yii::t('YiiMailer', 'SMTP server error: '),
'variable_set' => Yii::t('YiiMailer', 'Cannot set or reset variable: ')
),
'Mailer' => 'smtp',
'Host' => 'smtp.gmail.com',
'Port' => 465,
'SMTPSecure' => 'ssl',
'SMTPAuth' => true,
'Username' => 'yourEmail@gmail.com',
'Password' => '********',
);
Отправка письма вызывается как и в обычном режиме:
$mail = new YiiMailer();
$mail->setFrom('from@example.com', 'Test User');
$mail->setTo('to@example.com');
$mail->setSubject('Тема письма');
$mail->setBody('Содержание письма');
if ($mail->send()) {
Yii::app()->user->setFlash('contact','Письмо успешно отправлено');
} else {
Yii::app()->user->setFlash('error','Ошибка при отправке письма: ' . $mail->getError());
}
Так же настроить отправку через SMTP можно перед отправкой самого сообщения, например для отправки писем с разных почтовых ящиков в зависимости от действия пользователя, делается это следующим образом:
$mail->setSmtp('smtp.gmail.com', 465, 'ssl', true, 'yourEmail@gmail.com', '********');
Подробнее:
$mail = new YiiMailer();
$mail->setSmtp('smtp.gmail.com', 465, 'ssl', true, 'yourEmail@gmail.com', '********');
$mail->setFrom('from@example.com', 'Test User');
$mail->setTo('to@example.com');
$mail->setSubject('Тема письма');
$mail->setBody('Содержание письма');
if ($mail->send()) {
Yii::app()->user->setFlash('contact','Письмо успешно отправлено');
} else {
Yii::app()->user->setFlash('error','Ошибка при отправке письма: ' . $mail->getError());
}
Дополнительные настройки перед отправкой письма
Задать layout
Перед отправкой письма можно установить макет (layout) отличный от того, что указан в основных настройках расширения, например в зависимости от вызванного пользователем действия (action), макет письма будет отличаться:
$mail->setLayout('layoutName');
Задать view
Так же при отправке письма можно использовать свое представление (view):
$mail->setView('viewName');
$mail->setData(
array(
'header' => 'Привет, это тест',
'body' => 'Текст тестового письма'
)
);
Список получателей
Указывать получателей можно в массиве, пример:
$mail->setTo('test@example.com');
$mail->setTo(array('test@example.com', 'test2@example.com'));
$mail->setTo(array('test@example.com' => 'Test User', 'test2@example.com'));
Отправка писем с вложением
Для отправки писем с вложением используется метод setAttachment(), который принимает имя файла или массив из файлов для вложения:
$mail->setAttachment('/path/to/file.pdf');
$mail->setAttachment(array('/path/to/file.pdf', '/file2.doc'));
$mail->setAttachment(array('/path/to/file.pdf' => 'Good file', '/file2.doc' => 'Good doc file'));
Тестовый режим
Для проверки содержимого письма можно включить тестовый режим, в основном файл настроек /protected/config/mail.php нужно включить testMode и указать папку для сохранения писем:
'savePath' => 'webroot.assets.mail', 'testMode' => true,
Подробный пример отправки писем через (SMTP)
Контроллер (Controller):
$mail = new YiiMailer();
//Если настройки не заданы в файле
$mail->setSmtp('smtp.gmail.com', 465, 'ssl', true, 'yourEmail@gmail.com', '********');
$mail->setLayout('layoutName');
$mail->setView('viewName');
$mail->setSubject('Тема письма');
$mail->setData(
array(
'header' => 'Привет, это тест',
'body' => '<p>Текст <b>тестового</b> письма!</p>'
)
);
$mail->setAttachment(array('/path/to/file.pdf'=>'Good file'));
$mail->setFrom('from@example.com', 'Test User');
$mail->setTo(array('test@example.com', 'test2@example.com'));
if ($mail->send()) {
Yii::app()->user->setFlash('contact','Письмо успешно отправлено');
} else {
Yii::app()->user->setFlash('error','Ошибка при отправке письма: ' . $mail->getError());
}
Макет (Layout) (/protected/views/layouts/layoutName.php):
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
</head>
<body>
<?php echo $content ?>
</body>
</html>
Представление (View) (/protected/views/mail/viewName.php):
<h1><?= $header; ?></h1> <?= $body ; ?> <small>Подпись ;)</small>
Готово, приятной работы...
devreadwrite.com

Подборка адаптивных шаблонов для вашей CMS
Статьи по
Как получить и установить HTTPS сертификат на сайта

Комментарии
Комментарии отсутствуют, Вы можете быть первым