Exemplo n.º 1
0
/**
 * Функция отправляет письма
 */
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;
}
Exemplo n.º 2
0
<?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;
    }
}