Для Yii существует несколько расширений для отправки почты. Основные ( http://www.yiiframework.com/extension/mail/, http://www.yiiframework.com/extension/mailer/ ) представляют собой обертки для отправки через популярные библиотеки Swift и Php-mailer. Предлагаемое еще одно расширение отличается архитектурным решением. Письмо описывается объектом, проходящим через одно или несколько поведений yii behaviors. Сами поведения конфигурируются в yii конфиге. В расширение входят несколько заготовок: для Swift Mailer и PhpMailer, для записи отправляемых писем в файлы; для сохранения в памяти (для тестирования). В случае необходимости легко расширить или написать свое специфическое поведение. Интерфейсы расширения разработаны из предположения, что для описания отправляемых с сайта писем, удобно использовать шаблоны, наподобие стандартных Yii представлений. А такие свойства писем как тема, layout письма, вложения и другие свойства удобно описывать прямо в шаблоне.
Ссылки:
https://github.com/kraut-dps/dpsMailer/
http://www.yiiframework.com/extension/dpsmailer
Установка:
Для работы расширения достаточно скопировать папку dpsmailer в папку проекта protected/extensions.
Варианты использования:
Отправка письма:
Код: Выделить всё
Yii::app()->dpsMailer->sendByView(
array( 'to@example.com' => 'получатель' ), // определяем кому отправляется письмо
'emailTpl', // view шаблона письма
array(
'sUsername' => 'Участник',
'sLogoPicPath' => '/path/to/logo.gif',
'sFilePath' => '/path/to/attachment.txt',
)
);
Код: Выделить всё
<? /** @var dpsEmailController $this */
$this->setSubject( 'Тема письма' ); // указываем тему
$this->setLayout( 'emailLayoutTpl' ); // какой макет
$this->attach( $sFilePath ); // приложим файлик
?>
Привет <?= $sUsername ?>!
Макет письма /path/to/protected/views/mail/emailLayoutTpl.php:
Код: Выделить всё
<? /** @var dpsEmailController $this */ ?>
<img src="<?= $this->embed( $sLogoPicPath ) ?>"/>
<?= $content ?>
Код: Выделить всё
...
‘components’ =>
...,
'dpsMailer' => array(
'class' => 'ext.dpsMailer.components.dpsMailer',
'sViewPath' => '/path/to/protected/views/mail', // путь к шаблонам
'aFrom' => array( 'no-reply@example.com' => 'Администрация' ), // от кого будут отправляться письма по умолчанию
'aBehaviors' => array(
'swift' => array(
'class' => 'ext.dpsMailer.behaviors.dpsSwiftMailerBehavior',
'sLibPath'=> '/path/to/lib/swift/Swift-5.0.0/lib', // путь к папке, c библиотекой swift http://swiftmailer.org/
'sTransport' => 'Swift_SmtpTransport',
'aOptions' => array(// настройки swift
'Host' => 'smtp.gmail.com',
'Port' => 465,
'Encryption' => 'ssl',
'Username' => '[username]',
'Password' => '[password]',
),
),
),
),
...
PhpMailer Gmail:
Код: Выделить всё
...
'aBehaviors' => array(
'phpMailer' => array(
'class' => 'ext.dpsMailer.behaviors.dpsPhpMailerBehavior',
'sLibPath'=> Yii::getPathOfAlias( 'application.xlib' ) . '/php-mailer.5.2.1',
'aOptions' => array( // настройки php-mailer
'Mailer' => 'smtp',
'Host' => 'smtp.gmail.com',
'CharSet' => 'utf-8',
'SMTPAuth' => true,
'SMTPSecure' => 'ssl',
'Port' => 465,
'Username' => '[username]',
'Password' => '[password]',
),
),
),
...
Сохранение отправляемых писем в файл:
Код: Выделить всё
...
'aBehaviors' => array(
'file' => array(
'class' => 'ext.dpsMailer.behaviors.dpsFileMailerBehavior',
'sDir' =>Yii::getPathOfAlias( 'application.runtime' ) . '/emails', // директория для eml писем
),
),
...
Сохранение отправляемых писем в памяти, для проверок в тестах:
Код: Выделить всё
...
'aBehaviors' => array(
'memory' => array(
'class' => 'ext.dpsMailer.behaviors.dpsMemoryMailerBehavior',
),
),
...
Получение последнего отправленного письма из тестов:
Код: Выделить всё
$oEmailEvent = Yii::app()->dpsMailer->getBehavior( 'memory' )->getLastEmail( 'to@example.com' );
Код: Выделить всё
$oEmailEvent = Yii::app()->dpsMailer->getBehavior( 'memory' )->getLastEmails();
Код: Выделить всё
...
'aBehaviors' => array(
'cache' => array(
'class' => 'ext.dpsMailer.behaviors.dpsCacheMailerBehavior',
),
),
...
Кейс динамического добавления поведения ( например для странички тестирования шаблонов в администраторской панели ):
Код: Выделить всё
// выключаем все поведения
Yii::app()->dpsMailer->setSendersEnable( array() );
// динамически добавляем поведение сохранения писем в памяти
Yii::app()->dpsMailer->attachBehavior( array(
'preview' => array(
'class' => 'ext.dpsMailer.behaviors.dpsMemoryMailerBehavior'
),
) );
// отправка тестового письма
...
// получаем объект с данными письма
$oEmailEvent = Yii::app()->dpsMailer->getBehavior( 'preview' )->getLastEmail();
Балансировка между отправщиками:
Код: Выделить всё
'components' => array(
…,
'dpsMailer' => array(
…,
'aBehaviors' => array(
'mailer1' => …,
'mailer2' => …,
'mailer3' => …,
),
'cBalance' =>function( $aSenders, dpsEmailEvent $oEmailEvent ) {
// распределяем нагрузку ( располагая тут информацией о загрузке
// отправщиков, можно сделать полноценный балансировщик )
$iNum = mt_rand( 1, 3 );
$aSenders[ 'mailer1' ] = $iNum == 1;
$aSenders[ 'mailer2' ] = $iNum == 2;
$aSenders[ 'mailer3' ] = $iNum == 3;
return $aSenders;
},
),
…,
),
Код: Выделить всё
console.php:
return array(
…
'behaviors' => array( 'ext.dpsMailer.components.dpsRenderConsoleBehavior' ),
'components' => array(
…,
),
…
);
Код: Выделить всё
// специальный объект для передачи дополнительных параметров
$oForceEmailEvent = new dpsEmailEvent();
$oForceEmailEvent->aCc = array( 'cc@example.com' => '' );
Yii::app()->dpsMailer->sendByView(
array( 'to@example.com' => 'получатель' ), // определяем кому отправляется письмо
'emailTpl', // ник шаблона письма
array( 'sUsername' => 'Участник' ), // параметры для вставки в шаблон
$oForceEmailEvent // объект с дополнительными параметрами
);