Рассылка email через cron в LiveStreet
Как же сделать?
Зайти в config.php. Прописать:
$config['module']['notify']['per_process'] это может быть даже 88. У меня в минуту опрашивает кучу серверов в CS обработчик, а точнее 88 штук. Это на нагрузке даже видно не будет.
Если нет, написать. Но перед этим чекнуть файл Notify.class.php с функцией(методом):
Это нас интересует, короче если есть все норм: if(Config::Get('module.notify.delayed'))…
Ищем файл /include/cron/notify.php, переименуем для примера в хеш md5: 4c4774733c707459281b171927fae1fd.php
Идем в ISP 4 если он у вас и пишем в cron задачу на 2 минуты, можно и больше но до 5 чтобы все хорошо было:
Сейчас на серверах столько RAM что даже парится за такие вещи не надо.
F: Для чего --delete-after?
A: Для того чтобы не было кучи просто кучи страшной логов о каждом GET запросе.
Если у вас нет wget установите: apt-get install wget.
Если у вас ISP 5 и тупит с задачей, идем в папку: /var/spool/cron/crontabs/
И ваше имя пользователя, с какого будем делать cron.
Заходим в него пишем:
Также не забываем удалить файл: /include/cron/.htaccess. Или переименовать его, короче чтобы не было:
Есть минус. Это если вы шлете восстановление пароля, например. Тогда надо будет ждать. Чтобы этого не было. Вам это не нравится и т.д. Идем в /classes/modules/notify/Notify.class.php. Ищем:
Допишем например для загубленного пароля и для рассылки инвайтов:
Список шаблонов:
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.
Не забываем рассылать через smtp. Это для Яндекс.PDD:
Ну и тест драйв на напоследок.
Вы создали топик например:
В таблицу notify_task пишется сообщение какое должно идти на рассылку.
И все доходит:
Я протестировал на 3 пользователях. Но могу и на тысяче.
Зайти в 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 комментариев