Отправка писем по БД подписчиков - 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; ?>
⚠️ **GitHub.com Fallback** ⚠️