Рассылка email через cron в LiveStreet

Как же сделать?

Зайти в config.php. Прописать:
$config['module']['notify']['delayed'] = true; // Указывает на необходимость использовать режим отложенной рассылки сообщений на email
$config['module']['notify']['insert_single'] = false; // Если опция установлена в true, систему будет собирать записи заданий удаленной публикации, для вставки их в базу единым INSERT
$config['module']['notify']['per_process'] = 30; // Количество отложенных заданий, обрабатываемых одним крон-процессом

$config['module']['notify']['per_process'] это может быть даже 88. У меня в минуту опрашивает кучу серверов в CS обработчик, а точнее 88 штук. Это на нагрузке даже видно не будет.

Если нет, написать. Но перед этим чекнуть файл Notify.class.php с функцией(методом):

/**
	 * Универсальный метод отправки уведомлений на email
	 *
	 * @param ModuleUser_EntityUser|string $oUserTo Кому отправляем (пользователь или email)
	 * @param string $sTemplate Шаблон для отправки
	 * @param string $sSubject Тема письма
	 * @param array $aAssign Ассоциативный массив для загрузки переменных в шаблон письма
	 * @param string|null $sPluginName Плагин из которого происходит отправка
	 */
	public function Send($oUserTo,$sTemplate,$sSubject,$aAssign=array(),$sPluginName=null) {
		if ($oUserTo instanceof ModuleUser_EntityUser) {
			$sMail=$oUserTo->getMail();
			$sName=$oUserTo->getLogin();
		} else {
			$sMail=$oUserTo;
			$sName='';
		}
		/**
		 * Передаём в шаблон переменные
		 */
		foreach ($aAssign as $k=>$v) {
			$this->oViewerLocal->Assign($k,$v);
		}
		/**
		 * Формируем шаблон
		 */
		$sBody=$this->oViewerLocal->Fetch($this->GetTemplatePath($sTemplate,$sPluginName));
		/**
		 * Если в конфигураторе указан отложенный метод отправки,
		 * то добавляем задание в массив. В противном случае,
		 * сразу отсылаем на email
		 */
		if(Config::Get('module.notify.delayed')) {
			$oNotifyTask=Engine::GetEntity(
				'Notify_Task',
				array(
					'user_mail'      => $sMail,
					'user_login'     => $sName,
					'notify_text'    => $sBody,
					'notify_subject' => $sSubject,
					'date_created'   => date("Y-m-d H:i:s"),
					'notify_task_status' => self::NOTIFY_TASK_STATUS_NULL,
				)
			);
			if(Config::Get('module.notify.insert_single')) {
				$this->aTask[] = $oNotifyTask;
			} else {
				$this->oMapper->AddTask($oNotifyTask);
			}
		} else {
			/**
			 * Отправляем мыло
			 */
			$this->Mail_SetAdress($sMail,$sName);
			$this->Mail_SetSubject($sSubject);
			$this->Mail_SetBody($sBody);
			$this->Mail_setHTML();
			$this->Mail_Send();
		}
	}


Это нас интересует, короче если есть все норм: if(Config::Get('module.notify.delayed'))

Ищем файл /include/cron/notify.php, переименуем для примера в хеш md5: 4c4774733c707459281b171927fae1fd.php

Идем в ISP 4 если он у вас и пишем в cron задачу на 2 минуты, можно и больше но до 5 чтобы все хорошо было:
wget --delete-after http://домен.ком/include/cron/4c4774733c707459281b171927fae1fd.php

Сейчас на серверах столько RAM что даже парится за такие вещи не надо.

F: Для чего --delete-after?
A: Для того чтобы не было кучи просто кучи страшной логов о каждом GET запросе.

Если у вас нет wget установите: apt-get install wget.

Если у вас ISP 5 и тупит с задачей, идем в папку: /var/spool/cron/crontabs/
И ваше имя пользователя, с какого будем делать cron.
Заходим в него пишем:
*/02 * * * * wget --delete-after http://домен.ком/include/cron/4c4774733c707459281b171927fae1fd.php >/dev/null 2>&1


Также не забываем удалить файл: /include/cron/.htaccess. Или переименовать его, короче чтобы не было:


Есть минус. Это если вы шлете восстановление пароля, например. Тогда надо будет ждать. Чтобы этого не было. Вам это не нравится и т.д. Идем в /classes/modules/notify/Notify.class.php. Ищем:

if(Config::Get('module.notify.delayed')) {


Допишем например для загубленного пароля и для рассылки инвайтов:

if(Config::Get('module.notify.delayed') && ($sTemplate != 'notify.reminder_code.tpl' && $sTemplate != 'notify.invite.tpl')) {


Список шаблонов:
notify.comment_new.tpl — Отправляет юзеру уведомление о новом комментарии в его топике
notify.comment_reply.tpl — Отправляет юзеру уведомление об ответе на его комментарий
notify.topic_new.tpl — Отправляет юзеру уведомление о новом топике в блоге, в котором он состоит
notify.reactivation.tpl — Отправляет уведомление с новым линком активации
notify.registration_activate.tpl — Отправляет уведомление при регистрации с активацией
notify.registration.tpl — Отправляет уведомление о регистрации
notify.invite.tpl — Отправляет инвайт
notify.talk_new.tpl — Отправляет уведомление при новом личном сообщении
notify.talk_comment_new.tpl — Отправляет уведомление о новом сообщение в личке
notify.user_friend_new.tpl — Отправляет пользователю сообщение о добавлении его в друзья
notify.blog_invite_new.tpl — Отправляет пользователю сообщение о приглашение его в закрытый блог
notify.reminder_code.tpl — Уведомление при восстановлении пароля
notify.reminder_password.tpl — Уведомление с новым паролем после его восставновления
notify.wall.reply.tpl — Уведомление при ответе на сообщение на стене
notify.wall.new.tpl — Уведомление о новом сообщение на стене

Или конструкция чтобы только пользователям блога рассылало через cron.
if(Config::Get('module.notify.delayed') && ($sTemplate == 'notify.topic_new.tpl')) {


Не забываем рассылать через smtp. Это для Яндекс.PDD:
$config['sys']['mail']['type']       = 'smtp';                 // Какой тип отправки использовать
$config['sys']['mail']['from_email']       = 'lol@vova1234.com';      // Мыло с которого отправляются все уведомления
$config['sys']['mail']['from_name']        = 'Почтовик Vova1234';  // Имя с которого отправляются все уведомления
$config['sys']['mail']['charset']          = 'UTF-8';                // Какую кодировку использовать в письмах
$config['sys']['mail']['smtp']['host']     = 'smtp.yandex.ru';            // Настройки SMTP - хост
$config['sys']['mail']['smtp']['port']     = 465;                     // Настройки SMTP - порт
$config['sys']['mail']['smtp']['user']     = 'lol@vova1234.com';      // Настройки SMTP - пользователь
$config['sys']['mail']['smtp']['password'] = 'youloginit?';           // Настройки SMTP - пароль
$config['sys']['mail']['smtp']['secure']   = 'ssl';                   // Настройки SMTP - протокол шифрования: tls, ssl
$config['sys']['mail']['smtp']['auth']     = true;                   // Использовать авторизацию при отправке


Ну и тест драйв на напоследок.
Вы создали топик например:


В таблицу notify_task пишется сообщение какое должно идти на рассылку.


И все доходит:


Я протестировал на 3 пользователях. Но могу и на тысяче.

0 комментариев

Оставить комментарий




Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.