Отправка писем по БД подписчиков - uniqcle/Yii2 GitHub Wiki
Создаем новую модель в console/models/News.php
для выборки новостей и их подготовки
namespace console\models;
use Yii;
class News
{
const STATUS_NOT_SEND = 1;
//Получить данные
public static function getNewsList(){
$sql = "SELECT * FROM news WHERE status = ". self::STATUS_NOT_SEND;
$result = Yii::$app->db->createCommand($sql)->queryAll();
return self::prepareNewsList( $result );
}
//Обработать данные. Обрезать до нужного размера
public static function prepareNewsList( $result ){
if( !empty($result) && is_array($result) ){
foreach($result as &$item){
$item['content'] = Yii::$app->stringHelper->getShort($item['content']);
}
}
return $result;
}
}
Класс StringHelper
переносим в common/components/StringHelper
для удобства работы
namespace common\components;
use Yii;
class StringHelper
{
public $limit; //Определяем св-во limit
public function __construct(){
$this->limit = Yii::$app->params["shortTextLimit"];
}
//Укорачивание текста. На входе принимает какой-то аргумент
public function getShort($string, $limit = null){
//Если в методе задан limit, то используем его. Если не задан по-умолч. , то берем из параметров.
if( empty( $limit )){
$limit = $this->limit;
}
return substr($string, 0, $limit );
}
}
Также создаем новую модель Subscribers
в console/models/Subscribers.php
для работы с получателями
namespace console\models;
use Yii;
class Subscribers
{
public static function getSubscribersList(){
$sql = "SELECT * FROM subscribers; ";
return Yii::$app->db->createCommand($sql)->queryAll();
}
}
В common/config/main.php
в раздел components
добавляем
...
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'viewPath' => '@common/mail',
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.yandex.ru',
'username' => 'u****@yandex.ru', //От кого приходит почта
'password' => '*****',
'port' => '465',
'encryption' => 'ssl', // у яндекса SSL
],
'useFileTransport' => false, // будем отправлять реальные сообщения, а не в файл
],
...
Создаем новый класс console/controllers/SendController.php
. Он будет необходимо для запуска php yii send/run
namespace console\controllers;
use yii\console\Controller;
use console\models\News;
use console\models\Subscribers;
use console\models\Sending;
class SendController extends Controller
{
public function actionRun(){
$newsList = News::getNewsList();
$subscribersList = Subscribers::getSubscribersList();
//Модель отправки писем
Sending::run($newsList, $subscribersList);
}
}
Не забываем добавить в параметры common/config/params-local.php
Они нам понадобятся в Модели Sending
'adminEmail' => 'u****@yandex.ru',
'adminName' => 'Andrey'
Создаем новую модель console/models/Sending
, кот. и будет непосредственно заниматься отправкой писем
namespace console\models;
use Yii;
class Sending
{
public static function run($newsList, $subscribersList){
$adminEmail = Yii::$app->params['adminEmail'];
$adminName = Yii::$app->params['adminName'];
$textTitle = "Текст заголовка";
foreach($subscribersList as $subscriber):
$result = Yii::$app->mailer->compose('contact', [ //шаблон contact в common/mail
'subscriber' => $subscriber,
'newsList' => $newsList
])
->setFrom( [$adminEmail => $adminName] )
->setTo( $subscriber['email'] ) // кому отправляем
->setSubject( 'Письма с рассылкой' ) // тема письма
/* ->setTextBody('Текст...') // Закомментировать, если передаем в View
->setHtmlBody('Текст...')*/
->send();
endforeach;
}
}
Вид самого письма можно создать в common/mail/contact.php
или common/view/mail/contact.php
<h2>Привет, <?=$subscriber['name'] ?></h2>
<p>Свежие новости: </p>
<?php foreach($newsList as $item): ?>
<h3><?=$item['title']; ?></h3>
<p><?=$item['content']; ?></p>
<?php endforeach; ?>