/** * Функция отправляет письма */ function sendMail() { // Явное указание на использование глобальных переменных global $localhostPath, $dbConnect, $prefix, $maxMailSend, $maxMailSendInDay, $log, $timeout; // Устанавливаем значение "по умолчанию" переменной статуса завершения функции $status = false; // Формирвоание текста сообщения о наличии файла "stop.txt" $stopFileExistlogMessage = date('d.m.Y H:i:s') . ": Выполнение предыдущей версии скрипта еще не завершено!"; // Формирвоание текста сообщения о наличии файла "gotLimit.txt" $gotlimitFileExistlogMessage = date('d.m.Y H:i:s') . ": Достигнут суточный лимит отправляемых писем. Рассылку необходимо возобновить вручную через 24 часа!"; // Если файла "gotLimit.txt" на сервере нет // Если файла "stop.txt" на сервере нет // Если соединение с БД установлено // И параметры скрипта переопределены // И максимальное количество отправляемых за раз писем не равно 0 if (!checkFileExists('gotLimit.txt', $gotlimitFileExistlogMessage) && !checkFileExists('stop.txt', $stopFileExistlogMessage) && dbConnect() && setParams() && $maxMailSend !== 0) { // Создаем файл "stop.txt" createFile('stop.txt', 'stop'); // Если есть активные почтовые рассылки, получаем параметры первой активной рассылки if ($mail = getMailingGroup()) { // Добавляем сообщение о начале работы скрипта в массив лога $log[] = date('d.m.Y H:i:s') . ": Начало работы скрипта!"; // Получение списка адресатов, кому были отправлены письма $whoSent = $mail['whoSent'] ? explode(',', $mail['whoSent']) : array(); // Получаем массив категорий материалов рассылки $categories = $mail['categories'] ? array_diff(explode(',', $mail['categories']), array('', ' ', null)) : array(); // Получаем количество отправленных писем из отчера за предыдущий день $sendedYesterday = getYesterdayReportData(); // Определение количества отправленных писем $sendedInAllTime = $mail['log'] > count($whoSent) ? $mail['log'] : count($whoSent); // Подсчитываем, сколько еще можно отправить писем за этот день, не превышая лимитов хостинга $needToSend = $maxMailSendInDay + $sendedYesterday - $sendedInAllTime; // Переопределение максимального количества отправляемых за раз писем $maxMailSend = $needToSend >= $maxMailSend ? $maxMailSend : $needToSend; // Если не достигнут суточный лимит количества отправляемых писем if ($needToSend > 0) { // Получение списка подписчиков активной рассылки $subscribers = getSubscribers($categories, $mail['log']); // Если массив подписчиков не пуст if (!empty($subscribers)) { // Закрываем текущее соединение с БД, во избежание зазрыва соединения по таймауту mysql_close($dbConnect); // Обход массива подписчиков foreach ($subscribers as $subscriber) { // Если количество отправленных писем меньше максимального количества отправляемых писем за раз // И подписчику еще не отправлялось письмо if ($countMailSend < $maxMailSend && !in_array($subscriber['email'], $whoSent)) { // Установка временного интервала между отправками писем в 10 секунд sleep($timeout); // Определение значения по умолчанию сгенерированной строки, добавляемой к телу письма $generatorStr = ''; // Если параметр "Подключать словарь генерации случайного текста?" рассылки установлен в позицию "Да" if ($mail['generator'] == 1) { // Получение сгенерированной строки случайного текста $generator = generator(); // Если строка не сгенерирована if (!$generator) { // Переход к следующей итерации цикла continue; } // Добавляем сгенерированную строчку случайного текста $generatorStr = $generator; } /* --------- Генерация письма -------- */ // Тема письма $subject = $mail['subject']; // Формируем тело письма для отправки // Подставляем Имя пльзователя в тело в шаблон письма если есть маркер -{fio}- $body = str_replace('-{fio}-', $subscriber['fio'], $mail['textemail']); // Подставляем Email пльзователя в тело в шаблон письма если есть маркер -{fio}- $body = str_replace('-{email}-', $subscriber['email'], $body); // Добавление сгенерированной строки к телу письма $body .= $generatorStr; // Формируем заголовок письма $headers = "MIME-Version: 1.0\r\n"; $headers .= "Content-type: text/html; charset=utf-8\r\n"; $headers .= "From: " . $mail['myemail'] . "\r\n"; $headers .= "Reply-To: " . $mail['myemail'] . "\r\n"; /* --------- Отправка письма -------- */ // Отправка письма адресату $sendingMail = mail($subscriber['email'], $subject, $body, $headers); /* --------- Проверка результата операции отправки -------- */ // Если письмо успешно отправлено if ($sendingMail) { // Добавляем E-mail адрес подписчика в массив адресатов, кому уже отправлены письма $whoSent[] = $subscriber['email']; // Формируем запрос на обновление списка отправленных у подписчика $updateSubscriberInfo[] = "(" . $subscriber['id'] . ", '" . addslashes($subscriber['downloadedDocs'] . "\r\n" . $mail['id'] . ". " . $mail['subject'] . " (" . date('H:i:s d.m.y') . ")") . "')"; $log[] = 'Письмо c id=' . $mail['id'] . ' успешно отправлено адресату ' . $subscriber['email']; } else { // Добавляем сообщение об ошибке в массив лога ошибок $log[] = 'Письмо c id=' . $mail['id'] . ' не отправлено на е-mail ' . $subscriber['email']; } // Удаление переменных unset($body, $subject, $header); // Увеличиваем общий счетчик отправленных писем на единицу $countMailSend++; } else { // Переход к следующей итерации цикла continue; } } // Формируем запрос в БД на обновление информации о рассылке $query = "UPDATE `" . $prefix . "subscribers_emails` SET `log`=" . ($mail['log'] + $countMailSend) . ", `whoSent`='" . implode(',', $whoSent) . "', `noteMail`='" . $mail['noteMail'] . "\r\n" . date('H:i:s d.m.Y') . ":Отправлено всего на " . count($whoSent) . " e-mail адресов' WHERE `id`=" . $mail['id']; } else { // Формируем запрос в БД на обновление информации о рассылке $query = "UPDATE `" . $prefix . "subscribers_emails` SET `log`=0, `published`=-1, `send_date`='" . date('Y-m-d H:i:s') . "', `whoSent`='" . implode(',', $whoSent) . "', `noteMail`='" . $mail['noteMail'] . "\r\n" . date('H:i:s d.m.Y') . ":Отправлено всего на " . count($whoSent) . " e-mail адресов' WHERE `id`=" . $mail['id']; } // Восстанавливаем отключенное ранее соединение с БД dbConnect(); // Отправка запроса в БД и получение результата $resultToDb = mysql_query($query, $dbConnect); // Если последняя операция MySQL вернула сообщение об ошибке (не пустую строку) if (!$resultToDb) { // Добавленеи сообщения об ошибках операции в MySQL в массив лога ошибок $log[] = "MySQL query error: " . mysql_error() . ' (' . $query . ')'; } // Если массив запросов на обновление списка отправленных материалов подписчику не пустой if ($updateSubscriberInfo) { // Преобразовываем массив в строку $updateSubscriberInfo = implode(',', $updateSubscriberInfo); // Формируем строку запроса в БД на внесение изменений в данные подписчиков в БД $updateSubscriberInfo = 'INSERT INTO `' . $prefix . 'subscribers` (`id`, `downloadedDocs`) VALUES' . $updateSubscriberInfo . ' ON DUPLICATE KEY UPDATE `downloadedDocs` = VALUES(`downloadedDocs`)'; // Отправка запроса в БД и получение результата $res = mysql_query($updateSubscriberInfo, $dbConnect); if (!$res) { // Добавленеи сообщения об ошибках операции в MySQL в массив лога ошибок $log[] = "MySQL query error: " . mysql_error() . ' (' . $query . ')'; } } } else { // Добавленеи сообщение о достижении суточного лимита в массив лога ошибок $log[] = "Достигнут суточный лимит отправляемых писем. Рассылка будет возобновлена завтра!"; // Проверяем, существует ли файл "dayReport.txt" на сервере if (file_exists($localhostPath . 'dayReport.txt')) { // Удаление файла "dayReport.txt" unlink($localhostPath . 'dayReport.txt'); } // Вызываем функцию создания файла отчета об общем количестве отправленных писем по текущей рассылке createFile('dayReport.txt', count($whoSent)); // Вызываем функцию создания файла createFile('gotLimit.txt', 'true'); } // Добавляем сообщение об окончании работы скрипта в массив лога $log[] = date('d.m.Y H:i:s') . ": Завершение работы скрипта!"; } else { // Добавляем сообщение об окончании работы скрипта в массив лога $log[] = date('d.m.Y H:i:s') . ": Рассылка не ведется! Нет активных почтовых рассылок!"; } // Удаление файла "stop" unlink($localhostPath . 'stop.txt'); // Устанавливаем значение переменной статуса завершения функции $status = true; } // Закрываем текущее соединение с БД mysql_close($dbConnect); // Записываем логи в файл writeToLog(); // Завершаем выполнение работы скрипта. Выходим из функции return $status; }
<?php include_once 'lib/RSS.php'; include_once 'lib/rb/rb.php'; R::setup('mysql:host=217.117.1.177:3306;dbname=mhealth', 'm_health', 'm_health'); $start_apply = strtotime('2013-09-01'); $fresh_start_apply = date('YmdHis', $start_apply); $start = strtotime('2013-10-01'); $fresh_start = date('YmdHis', $start); $end = strtotime('2013-10-30'); $fresh_end = date('YmdHis', $end); //echo $start; $subs = getSubscribers($_REQUEST['id']); $user = ''; $mtn = array('234803', '234806', '234703', '234706', '234810', '234813', '234814', '234816'); foreach ($subs as $sub) { $phone_number = substr($sub['user_phone'], 1); if (!array_search(substr($phone_number, 0, 6), $mtn)) { continue; } $user = "******" . $sub['category_id'] . "|{$fresh_start_apply}|20370101000000|0|0|2|{$fresh_start}|{$fresh_end}|{$fresh_end}|23401220000001412|<br/>"; echo $user; } function getSubscribers($id) { $subs = R::getAll("select * from subscription where category_id='{$id}'"); if ($subs) { return $subs; } }