Потребовалось разослать информационное сообщение зарегистрированным пользователям сайта.
Обычно я не делаю рассылок, поэтому для этого случая у меня нет какого то постоянного решения, компонента, плагина.
Сервис email рассылок отверг сразу — ради одного раза не хотелось заморачиваться, платить, ждать модерации своего письма, да и сливать базу адресов своих пользователей на сторонний сервис лишний раз тоже не хотелось бы.
Немного поискал готовые скрипты, ничего интересного не нашёл и появилось такое решение.
Рассылка прошла нормально, если не считать того, что, судя по всему, некоторые почтовые сервисы бросают мои письма в папку спам, но это не проблема данного решения, это уже другая тема.
загружаю этот файл sitenews.txt в папку /languages/ru/letters
SQL запрос в myphp
Содержимое файла:
Ниже комментарии к основному SQL запросу, для тех, кто не понял, они помогут настроить запрос под свои обстоятельства. Я использовал ряд условий.
1. Рассылать будем только тем кто не удалён и не заблокирован
2. а так же тем, кому ещё не отправляли
3. Пользователям, в адресах которых содержится определённый домен рассылать не будем. Скорее всего, вам это не нужно, можете удалить это условие в двух запросах. Мне это было нужно, поэтому у меня так.
4. Рассылаем только пользователям из группы 1 (пользователи) и группы 10 (своя группа).
4. И ещё одно условие.
Я рассылаю только тем пользователям, который в настройках своего профиля НЕ запретили уведомления о личных сообщениях и комментариях с сайта на свой email
5. Ну и лимит за один проход. Я отправлял по одному письму.
В настройках страницы указываем, что эта страница доступна только админу. В тело страницы через опцию "внешний файл" вставляют наш скрипт
Теперь, чтобы отправить первое письмо, просто откройте эту страницу в браузере. Чтобы повторить нажмите F5. Можно поставив автозапуск, раскомментировать последнюю строку в коде или поставить на cron. Но в случае с CRON, очевидно, придётся открыть доступ к странице. В таком случае можно использовать GET параметр с секретным ключём, чтобы избежать несанкционированного запуска скрипта, здесь описывать это не буду.
Дальше текст не имеет отношения к инструкции, просто заметки на тему
Я знал, что у меня на хостинге имеется лимит в 1500 исходящих email в сутки. Запустил скрипт на автообновление страницы еще и в двух вкладках браузера сразу. И когда уже было отправлено 850 писем (быстро) обнаружил, что на хостинге так же имеется лимит в 150 писем в час...
Пришлось остановиться и ждать около часа пока обновится лимит. Потом продолжил пачками по 100 — 120 писем в час.
Как я понимаю, из первой партии 850 писем отправлены и доставлены были только первые 150. Остальные 700 отправлены не были из-за ограничения хостинга, но мой скрипт проставил в базе данных отметку (1), что письма отправлены.
Теперь, чтобы всё же отправить письма тем, кого я упустил, думаю сделать вот что…
После обхода всей базы в базе данных сброшу значение столбца emailsent на 0 для всех пользователей.
в коде закомментирую строку
, чтобы при запуске скрипта письмо не отправлялось.
Запущу скрипт на автообновлении, после прохода 150 строк с пользователям, раскомментирую закомментированную часть кода и продолжу отправку писем, пока общий счетчик отправленных писем не приблизится опять к 850, но теперь с учётом часового лимита на хостинге.
Обычно я не делаю рассылок, поэтому для этого случая у меня нет какого то постоянного решения, компонента, плагина.
Сервис email рассылок отверг сразу — ради одного раза не хотелось заморачиваться, платить, ждать модерации своего письма, да и сливать базу адресов своих пользователей на сторонний сервис лишний раз тоже не хотелось бы.
Немного поискал готовые скрипты, ничего интересного не нашёл и появилось такое решение.
Рассылка прошла нормально, если не считать того, что, судя по всему, некоторые почтовые сервисы бросают мои письма в папку спам, но это не проблема данного решения, это уже другая тема.
1. Создаю текстовый файт sitenews.txt с содержимым примерно таким
[subject:Обновления на сайте] Здравствуйте! Здесь какой то текст письма. В качестве примера форматирования письма можно посмотреть как устроен текстовый файл /languages/ru/letters/newcomment.txt и поменяв там текст, сохранить в новый текстовый файл --------- С уважением, администрация сайта сайт.ру
2. В базе данных в таблицу cms_users добавляю столбец `emailsent`
Здесь я буду отмечать факт отправки письма в рамках рассылки этому пользователю. Изначально по умолчанию значение ячейки 0, после отправки письма этому пользователю оно будет меняться на 1. При осуществлении рассылки скрипт будет брать только те адреса, в которых статус всё ещё 0.SQL запрос в myphp
ALTER TABLE `cms_users` ADD `emailsent` INT(1) NOT NULL DEFAULT '0' AFTER `openid`;
3. Создаю файл sitenews.php
Этот файл кидаю в папку /includes/myphp/Содержимое файла:
<?php //подключаем базу и файл с содержимым письма $inDB = cmsDatabase::getInstance(); $letter = cmsCore::getLanguageTextFile('sitenews'); //комментарии к запросу далее в посте $sql = "SELECT u.email, u.id FROM cms_users u LEFT JOIN cms_user_profiles p ON p.user_id = u.id WHERE u.is_deleted = 0 AND u.is_locked = 0 and u.emailsent = 0 AND u.email NOT LIKE '%yandex.ru%' AND u.email NOT LIKE '%gmail.com%' AND (u.group_id = 1 OR u.group_id = 10) AND p.email_newmsg = 1 LIMIT 1"; $result = $inDB->query($sql); while ($item = $inDB->fetch_assoc($result)){ //отправляем письмо методами системы. cmsCore::mailText($item['email'], '', $letter); //проставляем отметку об отправке письма этому пользователю $inDB->query("UPDATE cms_users SET emailsent = 1 WHERE id = '{$item['id']}'"); echo $item['email']; echo 'ok'; } //подсчитаем сколько писем отправлено и сколько осталось. Запрос такой же как первый, но здесь не будем устанавливать лимит. $sql = "SELECT u.email, u.id FROM cms_users u LEFT JOIN cms_user_profiles p ON p.user_id = u.id WHERE u.is_deleted = 0 AND u.is_locked = 0 and u.emailsent = 0 AND u.email NOT LIKE '%yandex.ru%' AND u.email NOT LIKE '%gmail.com%' AND (u.group_id = 1 OR u.group_id = 10) AND p.email_newmsg = 1"; $result = $inDB->query($sql); $all_users = $inDB->num_rows($result); $total_sent = $inDB->rows_count('cms_users', "emailsent = 1"); echo 'всего отправлено: '.$total_sent; echo 'осталось: '.$all_users; //cmsCore::mailText('myadress@gmail.com', '', $letter); //выше тестовая отправка на свой адрес. Чтобы использовать, раскомментировать строку и указать свой адрес. //header("Refresh: 2;"); //автообновление страницы с подключенным скриптом для автозапуска скрипта каждый 2 секунд, если лень жать F5 ?>
1. Рассылать будем только тем кто не удалён и не заблокирован
WHERE u.is_deleted = 0 AND u.is_locked = 0
and u.emailsent = 0
AND u.email NOT LIKE '%yandex.ru%' AND u.email NOT LIKE '%gmail.com%'
AND (u.group_id = 1 OR u.group_id = 10)
Я рассылаю только тем пользователям, который в настройках своего профиля НЕ запретили уведомления о личных сообщениях и комментариях с сайта на свой email
AND p.email_newmsg = 1
5. Ну и лимит за один проход. Я отправлял по одному письму.
LIMIT 1";
4. Через админку сайта создаю страницу с любым названием и адресом.
В настройках страницы указываем, что эта страница доступна только админу. В тело страницы через опцию "внешний файл" вставляют наш скрипт
{ФАЙЛ=sitenews.php}
Дальше текст не имеет отношения к инструкции, просто заметки на тему
Я знал, что у меня на хостинге имеется лимит в 1500 исходящих email в сутки. Запустил скрипт на автообновление страницы еще и в двух вкладках браузера сразу. И когда уже было отправлено 850 писем (быстро) обнаружил, что на хостинге так же имеется лимит в 150 писем в час...
Пришлось остановиться и ждать около часа пока обновится лимит. Потом продолжил пачками по 100 — 120 писем в час.
Как я понимаю, из первой партии 850 писем отправлены и доставлены были только первые 150. Остальные 700 отправлены не были из-за ограничения хостинга, но мой скрипт проставил в базе данных отметку (1), что письма отправлены.
Теперь, чтобы всё же отправить письма тем, кого я упустил, думаю сделать вот что…
После обхода всей базы в базе данных сброшу значение столбца emailsent на 0 для всех пользователей.
UPDATE `cms_users` SET `emailsent`= 0;
// cmsCore::mailText($item['email'], '', $letter);
Запущу скрипт на автообновлении, после прохода 150 строк с пользователям, раскомментирую закомментированную часть кода и продолжу отправку писем, пока общий счетчик отправленных писем не приблизится опять к 850, но теперь с учётом часового лимита на хостинге.
Реклама #
Нил™ 4 года назад #