You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1153 lines
33 KiB
1153 lines
33 KiB
<?php |
|
|
|
/** |
|
* Класс работы с рассылками |
|
* |
|
* @package AVE.cms |
|
* @subpackage module_mailer |
|
* @filesource |
|
*/ |
|
|
|
class mailer |
|
{ |
|
/** |
|
* Данные |
|
*/ |
|
// Путь к директории с шаблонами модуля |
|
var $tpl_dir; |
|
|
|
/** |
|
* Внутренние методы класса |
|
*/ |
|
/** |
|
* Метод проверки на синтаксис и уникальность email-а внутри списка рассылки |
|
* |
|
* @param string $email e-mail |
|
* @param int $list_id id списка рассылки |
|
* |
|
* @return int |
|
* 0: неверный синтаксис или пустой запрос |
|
* 1: всё отлично |
|
* 2: email уже есть в базе |
|
*/ |
|
function _mailerCheckEmail($email='',$list_id=null) |
|
{ |
|
if (!$email || !preg_match('/^[^ <>@,\\\\\/]+@[^ <>@,\\\\\/]+\.[^ <>@,\\\\\/]+$/i',$email)) |
|
{ |
|
return 0; |
|
} |
|
$list_id = (int)trim($list_id); |
|
if ($list_id) |
|
{ |
|
global $AVE_DB; |
|
$check = (int)$AVE_DB->Query(" |
|
SELECT * |
|
FROM " . PREFIX . "_module_mailer_receivers |
|
WHERE email = '" . $email . "' AND list_id=" . $list_id |
|
)->NumRows(); |
|
return (($check==0) ? 1 : 2); |
|
} |
|
else return 1; |
|
} |
|
|
|
/** |
|
* Метод сохранения вложений из $_FILES['attach'] |
|
* |
|
* @return array $attach массив путей к файлам |
|
*/ |
|
function _mailerAttach() |
|
{ |
|
// проверяем наличие файлов в форме |
|
if ($_FILES['attach']) $files = $_FILES['attach']; |
|
else return false; |
|
//$maxsize = 5000 * 1024; // 5mb |
|
$attach = array(); |
|
$attach_dir = BASE_DIR . '/' . ATTACH_DIR . '/'; |
|
|
|
foreach ($files['tmp_name'] as $i => $file) |
|
{ |
|
if ($file) |
|
{ |
|
// проверяем ограничение на размер |
|
if ($maxsize && filesize($file) > $maxsize) continue; |
|
// преобразуем имя файла |
|
$file_name = str_replace(' ','',mb_strtolower(trim($files['name'][$i]))); |
|
// проверяем на наличие файла с таким же именем в папке назначения |
|
if (file_exists($attach_dir . $file_name)) |
|
{ |
|
$file_name = rand(1000, 9999) . '_' . $file_name; |
|
} |
|
// перекидываем файл из врем. дир. в папку назначения |
|
$file_path = $attach_dir . $file_name; |
|
@move_uploaded_file($file, $file_path); |
|
$attach[] = $file_path; |
|
} |
|
} |
|
return $attach; |
|
} |
|
|
|
/** |
|
* Метод получения прикреплённого файла |
|
* |
|
* @param string $file имя файла |
|
*/ |
|
function _mailerGetFile($file) |
|
{ |
|
@ob_start(); |
|
header('Pragma: public'); |
|
header('Expires: 0'); |
|
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); |
|
header('Cache-Control: private',false); |
|
header('Content-Type: application/octet-stream'); |
|
header('Content-Disposition: attachment; filename=' . basename($file)); |
|
header('Content-Transfer-Encoding: binary'); |
|
header('Content-Length: ' . @filesize($file)); |
|
@set_time_limit(0); |
|
@readfile($file); |
|
} |
|
|
|
/** |
|
* Метод удаления получателя |
|
* |
|
* @param string $id id получателя |
|
*/ |
|
function _mailerDelReceiver($id=null,$public=false) |
|
{ |
|
global $AVE_DB; |
|
if ($public) |
|
{ |
|
$email = $AVE_DB->Query(" |
|
SELECT email |
|
FROM " . PREFIX . "_module_mailer_receivers |
|
WHERE id = ". $id |
|
)->FetchRow()->email; |
|
} |
|
$AVE_DB->Query(" |
|
DELETE |
|
FROM " . PREFIX . "_module_mailer_receivers |
|
WHERE id = ". $id |
|
); |
|
if ($public) return $email; |
|
else exit; |
|
} |
|
|
|
/** |
|
* Метод добавления получателя в список |
|
*/ |
|
function _mailerAddReceiver($list_id,$status,$email,$lname=null,$fname=null,$mname=null,$com=null,$update=false) |
|
{ |
|
global $AVE_DB; |
|
$check = $this->_mailerCheckEmail(trim($email),$list_id); |
|
if($check == 1) |
|
{ |
|
$AVE_DB->Query(" |
|
INSERT |
|
INTO " . PREFIX . "_module_mailer_receivers |
|
SET |
|
list_id = '" . (int)$list_id . "', |
|
status = '" . (int)$status . "', |
|
email = '" . trim($email) . "', |
|
lastname = '" . trim($lname) . "', |
|
firstname = '" . trim($fname) . "', |
|
middlename = '" . trim($mname) . "', |
|
comments = '" . trim($com) . "', |
|
date = '" . time() . "' |
|
"); |
|
} |
|
elseif($check == 2 && $update) |
|
{ |
|
$AVE_DB->Query(" |
|
UPDATE " . PREFIX . "_module_mailer_receivers |
|
SET |
|
status = '" . (int)$status . "', |
|
lastname = '" . trim($lname) . "', |
|
firstname = '" . trim($fname) . "', |
|
middlename = '" . trim($mname) . "', |
|
comments = '" . trim($com) . "', |
|
date = '" . time() . "' |
|
WHERE list_id=" . $list_id . " AND email='" . trim($email) . "' |
|
"); |
|
} |
|
return $check; |
|
} |
|
|
|
/** |
|
* Внешние методы класса |
|
*/ |
|
|
|
/** |
|
* Вывод списка рассылок |
|
*/ |
|
function mailerShowMails() |
|
{ |
|
global $AVE_DB, $AVE_Template; |
|
|
|
// Постраничная навигация |
|
$limit = 20; |
|
$num = $AVE_DB->Query(" |
|
SELECT COUNT(*) |
|
FROM " . PREFIX . "_module_mailer_mails |
|
WHERE sent='1' |
|
ORDER BY date DESC |
|
")->GetCell(); |
|
$pages = @ceil($num / $limit); |
|
$start = get_current_page() * $limit - $limit; |
|
|
|
// Поиск |
|
if ($_POST['search']) |
|
{ |
|
$AVE_Template->assign('search', $_POST['search']); |
|
$AVE_Template->assign('search_words', $_POST['search_words']); |
|
foreach ($_POST['search'] as $field => $true) |
|
{ |
|
if ($true) $where[] = $field . " LIKE '%" . $_POST['search_words'] . "%'"; |
|
} |
|
$where = implode(' OR ',$where); |
|
$mails_var = array('tpl','sent','find'); |
|
} |
|
else $mails_var = array('tpl','sent'); |
|
|
|
// Создаём три переменные с письмами |
|
foreach ($mails_var as $mail_var) |
|
{ |
|
// Запросы к бд |
|
switch ($mail_var) |
|
{ |
|
// Черновики |
|
case 'tpl': |
|
$sql = $AVE_DB->Query(" |
|
SELECT * |
|
FROM " . PREFIX . "_module_mailer_mails |
|
WHERE sent='0' |
|
ORDER BY id DESC |
|
"); |
|
break; |
|
|
|
// Отправленные |
|
case 'sent': |
|
$sql = $AVE_DB->Query(" |
|
SELECT * |
|
FROM " . PREFIX . "_module_mailer_mails |
|
WHERE sent='1' |
|
ORDER BY date DESC |
|
LIMIT " . $start . "," . $limit |
|
); |
|
break; |
|
|
|
// Поиск |
|
case 'find': |
|
$sql = $AVE_DB->Query(" |
|
SELECT * |
|
FROM " . PREFIX . "_module_mailer_mails |
|
WHERE sent='1' AND (" . $where . ") |
|
"); |
|
break; |
|
} |
|
|
|
while ($row = $sql->FetchRow()) |
|
{ |
|
// получатели из групп |
|
$s = $AVE_DB->Query(" |
|
SELECT user_group_name |
|
FROM " . PREFIX . "_user_groups |
|
WHERE user_group = '" . implode(' OR user_group = ', explode(';', $row->to_groups)) . "' |
|
"); |
|
$e = array(); |
|
while ($r = $s->FetchRow()) |
|
{ |
|
array_push($e, $r); |
|
} |
|
$row->to_groups = $e; |
|
// получатели из списков |
|
$s = $AVE_DB->Query(" |
|
SELECT id, title |
|
FROM " . PREFIX . "_module_mailer_lists |
|
WHERE id = '" . implode(' OR id = ', explode(';', $row->to_lists)) . "' |
|
"); |
|
$e = array(); |
|
while ($r = $s->FetchRow()) |
|
{ |
|
array_push($e, $r); |
|
} |
|
$row->to_lists = $e; |
|
// доп. получатели |
|
if ($row->to_add) $row->to_add = explode(';',$row->to_add); |
|
// вложения |
|
$attach = explode(';',$row->attach); |
|
$row->attach = array(); |
|
foreach ($attach as $attachment) |
|
{ |
|
array_push($row->attach,array('name' => basename($attachment),'path'=>$attachment)); |
|
} |
|
// имя автора рассылки |
|
$row->author_name = get_username_by_id($row->author_id); |
|
$mails[$mail_var][] = $row; |
|
} |
|
} |
|
|
|
if ($num > $limit) |
|
{ |
|
$page_nav = '<a class="pnav" href="index.php?do=modules&action=modedit&mod=mailer&moduleaction=1&page={s}&cp=' . SESSION . '">{t}</a>'; |
|
$page_nav = get_pagination($pages, 'page', $page_nav); |
|
$AVE_Template->assign('page_nav', $page_nav); |
|
} |
|
$AVE_Template->assign('mails', $mails); |
|
$AVE_Template->assign('content', $AVE_Template->fetch($this->tpl_dir . 'admin_show_mails.tpl')); |
|
} |
|
|
|
/** |
|
* Метод создания новой рассылки |
|
*/ |
|
function mailerEditMail() |
|
{ |
|
global $AVE_DB, $AVE_Template, $AVE_User; |
|
|
|
if (!$_REQUEST['id'] && !$_REQUEST['copy_id']) |
|
{ |
|
$mail -> from_name = get_settings('mail_from_name'); |
|
$mail -> from_email = get_settings('mail_from'); |
|
$mail -> type = 'html'; |
|
$mail -> body = $AVE_Template->get_config_vars('MAILER_MAILS_TEXT_D') . "\r\n\r\n\r\n\r\n" . get_settings('mail_signature'); |
|
$mail -> appeal = $AVE_Template->get_config_vars('MAILER_MAILS_APPEAL_D'); |
|
$mail -> saveattach = 1; |
|
} |
|
else |
|
{ |
|
$mail = $AVE_DB->Query(" |
|
SELECT * |
|
FROM " . PREFIX . "_module_mailer_mails |
|
WHERE id=" . (($_REQUEST['id']) ? $_REQUEST['id'] : $_REQUEST['copy_id']) |
|
) -> FetchRow(); |
|
|
|
if ($_REQUEST['copy_id']) |
|
{ |
|
$mail->id = null; |
|
$mail->sent = 0; |
|
} |
|
$mail -> to_groups = explode(';',$mail -> to_groups); |
|
$mail -> to_lists = explode(';',$mail -> to_lists); |
|
} |
|
|
|
$mail -> site_name = get_settings('site_name'); |
|
$mail -> usergroups = $AVE_User->userGroupListGet(2); |
|
$sql = $AVE_DB->Query(" |
|
SELECT * |
|
FROM " . PREFIX . "_module_mailer_lists |
|
ORDER BY id DESC |
|
"); |
|
$lists = array(); |
|
while ($row = $sql -> FetchRow()) |
|
{ |
|
$lists[$row->id] = $row->title; |
|
} |
|
$mail -> lists = $lists; |
|
|
|
$_SESSION['use_editor'] = get_settings('use_editor'); |
|
$AVE_Template->assign('mail', $mail); |
|
$AVE_Template->assign('test_email', get_user_rec_by_id($_SESSION['user_id'])->email); |
|
$AVE_Template->assign('content', $AVE_Template->fetch($this->tpl_dir . 'admin_edit_mail.tpl')); |
|
} |
|
|
|
/** |
|
* Метод сохранения/удаления/подготовки к отправке рассылки |
|
*/ |
|
function mailerSaveMail($mail_id=null, $act='') |
|
{ |
|
global $AVE_DB, $AVE_Template, $AVE_User; |
|
|
|
// удаление |
|
if ($act=='delete' && $mail_id) |
|
{ |
|
$AVE_DB->Query(" |
|
DELETE |
|
FROM " . PREFIX . "_module_mailer_mails |
|
WHERE id=" . $mail_id |
|
); |
|
header('Location:index.php?do=modules&action=modedit&mod=mailer&moduleaction=1&cp=' . SESSION . ($_REQUEST['page']?'&page='.$_REQUEST['page']:'')); |
|
exit; |
|
} |
|
|
|
// сохранение, отправка |
|
|
|
// записываем вложения, если оправка |
|
if ($act == 'send') $attach = $this->_mailerAttach(); |
|
|
|
if (!$mail_id) |
|
{ |
|
$AVE_DB->Query(" |
|
INSERT |
|
INTO " . PREFIX . "_module_mailer_mails |
|
SET |
|
id = '', |
|
author_id = '" . $_SESSION['user_id'] . "', |
|
date = '" . time() . "', |
|
from_name = '" . trim($_POST['from_name']) . "', |
|
from_email = '" . trim($_POST['from_email']) . "', |
|
from_copy = '" . $_POST['from_copy'] . "', |
|
to_groups = '" . implode(';',$_POST['to_groups']) . "', |
|
to_lists = '" . implode(';',$_POST['to_lists']) . "', |
|
to_add = '" . $_POST['to_add'] . "', |
|
subject = '" . trim($_POST['subject']) . "', |
|
type = '" . $_POST['type'] . "', |
|
appeal = '" . trim($_POST['appeal']) . "', |
|
body = '" . trim($_POST['body']) . "', |
|
saveattach = '" . $_POST['saveattach'] . "', |
|
timing = '" . $_POST['timing'] . "', |
|
attach = '" . @implode(';',$attach) . "', |
|
sent = '0' |
|
"); |
|
$mail_id = $AVE_DB->Query(" |
|
SELECT LAST_INSERT_ID(id) |
|
FROM " . PREFIX . "_module_mailer_mails |
|
ORDER BY id DESC LIMIT 1 |
|
")->GetCell(); |
|
|
|
reportLog($_SESSION['user_name'] . ' - создал(а) рассылку "' . trim($_POST['subject']) . '" (' . $mail_id . ')', 2, 2); |
|
} |
|
else |
|
{ |
|
$AVE_DB->Query(" |
|
UPDATE " . PREFIX . "_module_mailer_mails |
|
SET |
|
from_name = '" . trim($_POST['from_name']) . "', |
|
from_email = '" . trim($_POST['from_email']) . "', |
|
from_copy = '" . $_POST['from_copy'] . "', |
|
to_groups = '" . implode(';',$_POST['to_groups']) . "', |
|
to_lists = '" . implode(';',$_POST['to_lists']) . "', |
|
to_add = '" . $_POST['to_add'] . "', |
|
subject = '" . trim($_POST['subject']) . "', |
|
type = '" . $_POST['type'] . "', |
|
appeal = '" . trim($_POST['appeal']) . "', |
|
body = '" . trim($_POST['body']) . "', |
|
saveattach = '" . $_POST['saveattach'] . "', |
|
timing = '" . $_POST['timing'] . "', |
|
attach = '" . @implode(';',$attach) . "', |
|
sent = '0' |
|
WHERE id=" . $mail_id |
|
); |
|
reportLog($_SESSION['user_name'] . ' - отредактировал(а) рассылку "' . trim($_POST['subject']) . '" (' . $mail_id . ')', 2, 2); |
|
} |
|
|
|
// отправка |
|
if ($act == 'send') { |
|
|
|
// Сохраняем все данные в одну переменную |
|
unset($_SESSION['mailer'][$mail_id]); |
|
$mailer = $_POST; |
|
|
|
// номер рассылки |
|
$mailer['id'] = $mail_id; |
|
|
|
// сохраняем вложения |
|
$mailer['attach'] = $attach; |
|
|
|
// создаём массив получателей |
|
$mailer['receivers'] = array(); |
|
$receivers = array(); |
|
|
|
// получатели из списков |
|
if($mailer['to_lists']) |
|
{ |
|
$rec_lists = $AVE_DB->Query(" |
|
SELECT * |
|
FROM " . PREFIX . "_module_mailer_receivers |
|
WHERE list_id = " . implode(' OR list_id = ',$mailer['to_lists']) |
|
); |
|
while ($rec = $rec_lists->FetchRow()) |
|
{ |
|
if(!in_array($rec->email,$receivers) && (int)$rec->status == 1) |
|
{ |
|
$rec -> id = 'L' . $rec -> id; |
|
array_push($mailer['receivers'], $rec); |
|
array_push($receivers, $rec->email); |
|
} |
|
} |
|
unset($rec); |
|
} |
|
|
|
// получатели из групп |
|
if($mailer['to_groups']) |
|
{ |
|
$rec_groups = $AVE_DB->Query(" |
|
SELECT id,email,lastname,firstname,user_group |
|
FROM " . PREFIX . "_users |
|
WHERE user_group = " . implode(' OR user_group = ',$mailer['to_groups']) |
|
); |
|
|
|
while ($rec = $rec_groups->FetchRow()) |
|
{ |
|
if(!in_array($rec->email,$receivers)) |
|
{ |
|
$rec -> id = 'G' . $rec -> id; |
|
array_push($mailer['receivers'], $rec); |
|
array_push($receivers, $rec->email); |
|
} |
|
} |
|
unset($rec); |
|
} |
|
|
|
// дополнительные получатели |
|
$rec_add = explode(';',$mailer['to_add']); |
|
foreach ($rec_add as $rec_add_num => $rec_add_1) |
|
{ |
|
$rec_add_1 = trim($rec_add_1); |
|
if($rec_add_1 && !in_array($rec_add_1,$receivers) && $this->_mailerCheckEmail($rec_add_1) == 1) |
|
{ |
|
$rec = array(); |
|
$rec['id'] = 'A' . $rec_add_num; |
|
$rec['email'] = $rec_add_1; |
|
$rec = array2object($rec); |
|
array_push($mailer['receivers'], $rec); |
|
array_push($receivers, $rec->email); |
|
} |
|
} |
|
unset($rec); |
|
|
|
// отправитель в копию, если просили |
|
if ($mailer['from_copy'] && !in_array($mailer['from_email'],$receivers)) |
|
{ |
|
$rec = array(); |
|
$rec['id'] = 'C' . $mailer['author_id']; |
|
$rec['email'] = trim($mailer['from_email']); |
|
$rec = array2object($rec); |
|
array_push($mailer['receivers'], $rec); |
|
} |
|
|
|
// считаем получателей |
|
$mailer['number'] = count($mailer['receivers']); |
|
$mailer['count'] = 1; |
|
|
|
// записываем все данные в сессию |
|
$_SESSION['mailer'][$mail_id] = $mailer; |
|
|
|
reportLog($_SESSION['user_name'] . ' - запустил(а) процесс отправки рассылки "' . trim($mailer['subject']) . '" (' . $mail_id . ')', 2, 2); |
|
} |
|
|
|
// если сохранение через ajax, выходим |
|
if ($act == 'ajaxsave' || $act == 'send') |
|
{ |
|
echo $mail_id; |
|
exit; |
|
} |
|
elseif ($act == 'go' || $act == 'delete') |
|
{ |
|
header('Location:index.php?do=modules&action=modedit&mod=mailer&moduleaction=1&cp='.SESSION); |
|
} |
|
} |
|
|
|
/** |
|
* Метод отправки рассылки |
|
*/ |
|
function mailerSendMail() { |
|
global $AVE_DB; |
|
|
|
// получаем id рассылки |
|
$mail_id = $_REQUEST['mail_id']; |
|
|
|
// шлём письмо, используя данные сессии |
|
if ($_SESSION['mailer'][$mail_id]['count'] <= $_SESSION['mailer'][$mail_id]['number']) |
|
{ |
|
//берём следующего получателя |
|
$rec = array_shift($_SESSION['mailer'][$mail_id]['receivers']); |
|
|
|
// Уникальный id письма: %номер рассылки%-%id получателя% |
|
$id = $_SESSION['mailer'][$mail_id]['id'] . '-' . $rec -> id; |
|
|
|
// Обращение к получателю |
|
$name = trim($rec->lastname . ' ' . $rec->firstname . ' ' . $rec->middlename); |
|
if (!$name) |
|
{ |
|
$name = $_SESSION['mailer'][$mail_id]['appeal']; |
|
} |
|
$body = str_replace( |
|
array('%NAME%' ,'%ID%' ,'%SHOW%'), |
|
array($name ,$id ,'http://'.$_SERVER['SERVER_NAME'].'/index.php?module=mailer&action=show&id='.$mail_id.'&onlycontent=1'), |
|
$_SESSION['mailer'][$mail_id]['body']); |
|
|
|
// Посылаем письмо |
|
send_mail( |
|
$rec->email, |
|
$body, |
|
trim($_SESSION['mailer'][$mail_id]['subject']), |
|
trim($_SESSION['mailer'][$mail_id]['from_email']), |
|
trim($_SESSION['mailer'][$mail_id]['from_name']), |
|
trim($_SESSION['mailer'][$mail_id]['type']), |
|
$_SESSION['mailer'][$mail_id]['attach'], |
|
false,false |
|
); |
|
|
|
// записываем отправленных в базу, чтобы если что знать, кому уже отправились письма |
|
$_SESSION['mailer'][$mail_id]['done'][] = $rec->email; |
|
|
|
$AVE_DB->Query(" |
|
UPDATE " . PREFIX . "_module_mailer_mails |
|
SET |
|
date = '" . time() . "', |
|
done = '" . implode(';',$_SESSION['mailer'][$mail_id]['done']) . "', |
|
sent = '1' |
|
WHERE id=" . $mail_id |
|
); |
|
|
|
$count = (int)$_SESSION['mailer'][$mail_id]['count']; |
|
$timing = (int)$_SESSION['mailer'][$mail_id]['timing']; |
|
$number = (int)$_SESSION['mailer'][$mail_id]['number']; |
|
|
|
// округлённый процент выполнения |
|
$result = floor($count / $number * 100); |
|
|
|
// если просили отсылать по частям и осталось много писем, ставим процесс на паузу) |
|
if($timing != 0 && $count % $timing == 0 && $number - $count > 10) $result = 'pause'; |
|
|
|
// считаем |
|
$_SESSION['mailer'][$mail_id]['count']++; |
|
|
|
// возвращаем в AJAX число |
|
echo $result; |
|
} |
|
else |
|
{ |
|
// Удаляем вложения, если просили |
|
if ($_SESSION['mailer'][$mail_id]['attach'] && !(int)$_SESSION['mailer'][$mail_id]['saveattach']) |
|
{ |
|
foreach ($_SESSION['mailer'][$mail_id]['attach'] as $file) |
|
{ |
|
@unlink($file); |
|
} |
|
} |
|
reportLog($_SESSION['user_name'] . ' - процесс отправки рассылки "' . trim($_SESSION['mailer']['subject']) . '" (' . $mail_id . ') завершён', 2, 2); |
|
unset ($_SESSION['mailer'][$mail_id]); |
|
echo 'finish'; |
|
} |
|
exit; |
|
} |
|
|
|
/** |
|
* Вывод списков рассылок |
|
*/ |
|
function mailerShowLists() |
|
{ |
|
global $AVE_DB, $AVE_Template; |
|
|
|
if ($_POST['del']) |
|
{ |
|
foreach ($_POST['del'] as $id => $del) |
|
{ |
|
$AVE_DB->Query(" |
|
DELETE |
|
FROM " . PREFIX . "_module_mailer_lists |
|
WHERE id = '". $id ."' |
|
"); |
|
} |
|
} |
|
|
|
$limit = 20; |
|
$num = $AVE_DB->Query(" |
|
SELECT COUNT(*) |
|
FROM " . PREFIX . "_module_mailer_lists |
|
ORDER BY id DESC |
|
")->GetCell(); |
|
$pages = @ceil($num / $limit); |
|
$start = get_current_page() * $limit - $limit; |
|
|
|
$sql = $AVE_DB->Query(" |
|
SELECT * |
|
FROM " . PREFIX . "_module_mailer_lists |
|
ORDER BY id DESC |
|
LIMIT " . $start . "," . $limit . " |
|
"); |
|
|
|
$lists = array(); |
|
while ($row = $sql->FetchRow()) |
|
{ |
|
$count = $AVE_DB->Query(" |
|
SELECT COUNT(*) |
|
FROM " . PREFIX . "_module_mailer_receivers |
|
WHERE list_id=" . $row->id |
|
)->GetCell(); |
|
$row -> number = (($count) ? $count : 0); |
|
$row -> author_name = get_username_by_id($row->author_id); |
|
array_push($lists, $row); |
|
} |
|
if ($num > $limit) |
|
{ |
|
$page_nav = '<a class="pnav" href="index.php?do=modules&action=modedit&mod=mailer&moduleaction=showlists&page={s}&cp=' . SESSION . '">{t}</a>'; |
|
$page_nav = get_pagination($pages, 'page', $page_nav); |
|
$AVE_Template->assign('page_nav', $page_nav); |
|
} |
|
$AVE_Template->assign('lists',$lists); |
|
$AVE_Template->assign('content', $AVE_Template->fetch($this->tpl_dir . 'admin_show_lists.tpl')); |
|
} |
|
|
|
/** |
|
* Метод загрузки/удаления/создания/редактирования списка рассылки |
|
*/ |
|
function mailerEditList() |
|
{ |
|
global $AVE_DB, $AVE_Template; |
|
|
|
if ($_REQUEST['wipe'] && $_REQUEST['id']) |
|
{ |
|
$AVE_DB->Query(" |
|
DELETE |
|
FROM " . PREFIX . "_module_mailer_receivers |
|
WHERE list_id=" . $_REQUEST['id'] |
|
); |
|
header('Location:index.php?do=modules&action=modedit&mod=mailer&moduleaction=showlists&cp=' . SESSION . ($_REQUEST['page']?'&page='.$_REQUEST['page']:'')); |
|
exit; |
|
} |
|
elseif ($_REQUEST['download'] && $_REQUEST['id']) |
|
{ |
|
$listname = $AVE_DB->Query(" |
|
SELECT title |
|
FROM " . PREFIX . "_module_mailer_lists |
|
WHERE id=" . $_REQUEST['id'] |
|
)->GetCell(); |
|
$file = ''; |
|
|
|
$receivers = $AVE_DB->Query(" |
|
SELECT * |
|
FROM " . PREFIX . "_module_mailer_receivers |
|
WHERE list_id=" . $_REQUEST['id'] |
|
); |
|
while ($rec = $receivers->FetchRow()) |
|
{ |
|
$file .= $rec->email . ';' . $rec->lastname . ';' . $rec->firstname . ';' . $rec->middlename . ';' . $rec->comments . "\r\n"; |
|
} |
|
|
|
header('Content-Type: text/plain'); |
|
header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT'); |
|
header('Content-Disposition: attachment; filename=' . $listname . '.csv'); |
|
header('Content-Length: ' . strlen($file)); |
|
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); |
|
header('Pragma: public'); |
|
echo $file; |
|
exit; |
|
} |
|
elseif ($_REQUEST['delete'] && $_REQUEST['id']) |
|
{ |
|
$AVE_DB->Query(" |
|
DELETE |
|
FROM " . PREFIX . "_module_mailer_lists |
|
WHERE id=" . $_REQUEST['id'] |
|
); |
|
header('Location:index.php?do=modules&action=modedit&mod=mailer&moduleaction=showlists&cp=' . SESSION . ($_REQUEST['page']?'&page='.$_REQUEST['page']:'')); |
|
exit; |
|
} |
|
|
|
if ($_REQUEST['id']) |
|
{ |
|
$list = $AVE_DB->Query(" |
|
SELECT * |
|
FROM " . PREFIX . "_module_mailer_lists |
|
WHERE id=" . $_REQUEST['id'] |
|
)->FetchRow(); |
|
|
|
$limit = 20; |
|
$num = $AVE_DB->Query(" |
|
SELECT COUNT(*) |
|
FROM " . PREFIX . "_module_mailer_receivers |
|
WHERE list_id=" . $_REQUEST['id'] . " |
|
ORDER BY id DESC |
|
")->GetCell(); |
|
$pages = @ceil($num / $limit); |
|
$start = get_current_page() * $limit - $limit; |
|
|
|
$sql = $AVE_DB->Query(" |
|
SELECT * |
|
FROM " . PREFIX . "_module_mailer_receivers |
|
WHERE list_id=" . $_REQUEST['id'] . " |
|
ORDER BY id DESC |
|
LIMIT " . $start . ',' . $limit . " |
|
"); |
|
|
|
$receivers = array(); |
|
while ($row = $sql->FetchRow()) |
|
{ |
|
array_push($receivers,$row); |
|
} |
|
|
|
if ($num > $limit) |
|
{ |
|
$page_nav = '<a class="pnav" href="index.php?do=modules&action=modedit&mod=mailer&moduleaction=editlist&id=' . $_REQUEST['id'] . '&page={s}&cp=' . SESSION . '">{t}</a>'; |
|
$page_nav = get_pagination($pages, 'page', $page_nav); |
|
$AVE_Template->assign('page_nav', $page_nav); |
|
} |
|
|
|
$AVE_Template->assign('list',$list); |
|
$AVE_Template->assign('receivers',$receivers); |
|
} |
|
$AVE_Template->assign('content', $AVE_Template->fetch($this->tpl_dir . 'admin_edit_list.tpl')); |
|
} |
|
|
|
/** |
|
* Метод сохранения списка рассылки |
|
*/ |
|
function mailerSaveList() |
|
{ |
|
global $AVE_DB,$AVE_Template; |
|
if (!$_REQUEST['id']) |
|
{ |
|
$AVE_DB->Query(" |
|
INSERT |
|
INTO " . PREFIX . "_module_mailer_lists |
|
SET |
|
id = '', |
|
title = '" . trim($_POST['title']) . "', |
|
descr = '" . $_POST['descr'] . "', |
|
author_id = '" . (int)$_SESSION['user_id'] . "', |
|
date = '" . time() . "' |
|
"); |
|
$list_id = $AVE_DB->Query(" |
|
SELECT LAST_INSERT_ID(id) |
|
FROM " . PREFIX . "_module_mailer_lists |
|
ORDER BY id DESC LIMIT 1 |
|
")->GetCell(); |
|
|
|
reportLog($_SESSION['user_name'] . ' - создал(а) список рассылки "' . trim($_POST['title']) . '" (' . $list_id . ')', 2, 2); |
|
} |
|
else |
|
{ |
|
$list_id = $_REQUEST['id']; |
|
$AVE_DB->Query(" |
|
UPDATE " . PREFIX . "_module_mailer_lists |
|
SET |
|
title = '" . trim($_POST['title']) . "', |
|
descr = '" . $_POST['descr'] . "' |
|
WHERE id=" . $list_id |
|
); |
|
reportLog($_SESSION['user_name'] . ' - отредактировал(а) список рассылки "' . trim($_POST['title']) . '" (' . $list_id . ')', 2, 2); |
|
} |
|
if ($_POST['status']) |
|
{ |
|
foreach ($_POST['status'] as $rec_id => $status) |
|
{ |
|
$AVE_DB->Query(" |
|
UPDATE " . PREFIX . "_module_mailer_receivers |
|
SET |
|
status = '" . $status . "' |
|
WHERE id=" . $rec_id |
|
); |
|
} |
|
} |
|
if ($_POST['new']) |
|
{ |
|
foreach ($_POST['new'] as $rec_id => $rec_row) |
|
{ |
|
$rec_row['email'] = trim($rec_row['email']); |
|
$this -> _mailerAddReceiver($list_id,$rec_row['status'],$rec_row['email'],$rec_row['lastn'],$rec_row['firstn'],$rec_row['midn'],$rec_row['comments']); |
|
} |
|
} |
|
if ($_POST['edit']) |
|
{ |
|
foreach ($_POST['edit'] as $rec_id => $rec_row) |
|
{ |
|
$AVE_DB->Query(" |
|
UPDATE " . PREFIX . "_module_mailer_receivers |
|
SET |
|
lastname = '" . $rec_row['lastn'] . "', |
|
firstname = '" . $rec_row['firstn'] . "', |
|
middlename = '" . $rec_row['midn'] . "', |
|
comments = '" . $rec_row['comments'] . "' |
|
WHERE id=" . $rec_id |
|
); |
|
} |
|
} |
|
if ($_POST['import'] && $_POST['import_delim_1'] && $_POST['import_delim_2'] && $_POST['import_delim_1'] != $_POST['import_delim_2']) |
|
{ |
|
$delim_1 = stripslashes($_POST['import_delim_1']); |
|
$delim_2 = stripslashes($_POST['import_delim_2']); |
|
|
|
if ($delim_1 == "\\r\\n") $delim_1 = "\r\n"; |
|
if ($delim_2 == "\\r\\n") $delim_2 = "\r\n"; |
|
|
|
$import = explode($delim_1,$_POST['import']); |
|
foreach ($import as $receiver) |
|
{ |
|
$receiver = explode($delim_2,$receiver); |
|
$this->_mailerAddReceiver($list_id,1,$receiver[0],$receiver[1],$receiver[2],$receiver[3],$receiver[4]); |
|
} |
|
} |
|
|
|
if ($_FILES['import_file']) |
|
{ |
|
$file_type = end(explode('.',$_FILES['import_file']['name'])); |
|
|
|
if ($file_type == 'csv') |
|
{ |
|
$import = file_get_contents($_FILES['import_file']['tmp_name']); |
|
$file_ok = true; |
|
if (mb_check_encoding($import,'UTF-8') || mb_check_encoding($import,'cp1251')) |
|
{ |
|
if (mb_check_encoding($import,'cp1251')) |
|
{ |
|
$import = @iconv('cp1251','UTF-8',$import); |
|
} |
|
else $file_ok = false; |
|
} |
|
if ($file_ok) |
|
{ |
|
$import = explode("\r\n",$import); |
|
foreach ($import as $receiver) |
|
{ |
|
$receiver = explode(($_POST['import_file_delim']) ? $_POST['import_file_delim'] : ';',$receiver); |
|
$this->_mailerAddReceiver($list_id,1,$receiver[0],$receiver[1],$receiver[2],$receiver[3],$receiver[4]); |
|
} |
|
} |
|
} |
|
} |
|
$_SESSION['mailer']['list_import_delim_1'] = $_POST['import_delim_1']; |
|
$_SESSION['mailer']['list_import_delim_2'] = $_POST['import_delim_2']; |
|
$_SESSION['mailer']['list_import_delim_csv'] = $_POST['import_file_delim']; |
|
header('Location:index.php?do=modules&action=modedit&mod=mailer&moduleaction=' . (($_REQUEST['return'] == 1) ? 'editlist&id=' . $list_id : 'showlists') . ($_POST['page']?'&page='.$_POST['page']:'') . '&cp=' . SESSION); |
|
exit; |
|
} |
|
|
|
/** |
|
* Метод подписки |
|
*/ |
|
function mailerSubscribe() |
|
{ |
|
global $AVE_DB,$AVE_Template; |
|
|
|
$result = $this->_mailerAddReceiver($_POST['list_id'],1,$_POST['email'],$_POST['lname'],$_POST['fname'],$_POST['mname']); |
|
|
|
if ($result == 2) |
|
{ |
|
$rec = $AVE_DB->Query(" |
|
SELECT id, status |
|
FROM " . PREFIX . "_module_mailer_receivers |
|
WHERE list_id=" . $_POST['list_id'] . " AND email = '" . trim($_POST['email']) . "' |
|
")->FetchRow(); |
|
if ((int)$rec->status == 2) $result = 1; |
|
|
|
$this->_mailerAddReceiver($_POST['list_id'],1,$_POST['email'],$_POST['lname'],$_POST['fname'],$_POST['mname'],'',true); |
|
} |
|
return $result; |
|
} |
|
|
|
/** |
|
* Метод "отписки" |
|
*/ |
|
function mailerUnsubscribe() |
|
{ |
|
global $AVE_DB,$AVE_Template; |
|
|
|
$list_id = trim($_POST['list_id']); |
|
$email = trim($_POST['email']); |
|
|
|
$sql = $AVE_DB->Query(" |
|
SELECT id, status |
|
FROM " . PREFIX . "_module_mailer_receivers |
|
WHERE list_id = ". $list_id . " AND email = '" . $email . "' |
|
")->FetchRow(); |
|
|
|
if (!$sql || (int)$sql->status == 2) |
|
{ |
|
return 0; |
|
} |
|
else |
|
{ |
|
$AVE_DB->Query(" |
|
UPDATE ". PREFIX . "_module_mailer_receivers |
|
SET |
|
status = '2' |
|
WHERE id = ". $sql->id |
|
); |
|
return 1; |
|
} |
|
} |
|
|
|
/** |
|
* Метод тестовой отправки |
|
*/ |
|
function mailerTestSend($id,$emails) |
|
{ |
|
global $AVE_DB,$AVE_Template; |
|
|
|
// Сохраняем письмо перед отправкой |
|
$this->mailerSaveMail($id); |
|
|
|
// Отправляем каждому адресату, если правильный email |
|
foreach (explode(';',$emails) as $email) |
|
{ |
|
$email = trim($email); |
|
if ($this->_mailerCheckEmail($email) == 1) |
|
{ |
|
// Формируем тело |
|
$body = str_replace( |
|
array('%NAME%' ,'%SHOW%'), |
|
array($_POST['appeal'] ,'http://'.$_SERVER['SERVER_NAME'].'/index.php?module=mailer&action=show&id='.$id.'&onlycontent=1'), |
|
$_POST['body']); |
|
|
|
// Отправляем с вложениями |
|
send_mail( |
|
$email, |
|
$body, |
|
trim($_POST['subject']), |
|
trim($_POST['from_email']), |
|
trim($_POST['from_name']), |
|
trim($_POST['type']), |
|
$this->_mailerAttach(), |
|
false,false |
|
); |
|
$emails_new[] = $email; |
|
} |
|
} |
|
reportLog($_SESSION['user_name'] . ' - разослал(а) тестовую рассылку "' . trim($_POST['subject']) . '" (' . $id . ') по адресам: ' . implode(', ',$emails_new), 2, 2); |
|
return $emails_new; |
|
} |
|
|
|
/** |
|
* Метод мульти-добавления получателей |
|
*/ |
|
function mailerMultiAdd() |
|
{ |
|
global $AVE_DB, $AVE_Template; |
|
$sql = $AVE_DB->Query(" |
|
SELECT * |
|
FROM " . PREFIX . "_module_mailer_lists |
|
ORDER BY id DESC |
|
"); |
|
while ($row = $sql->FetchRow()) |
|
{ |
|
$lists[] = $row; |
|
} |
|
|
|
$AVE_Template->assign('lists', $lists); |
|
$AVE_Template->assign('content', $AVE_Template->fetch($this->tpl_dir . 'admin_multi_add.tpl')); |
|
} |
|
|
|
/** |
|
* Метод сохранения получателей из мульти-добавления |
|
*/ |
|
function mailerMultiSave() |
|
{ |
|
global $AVE_DB; |
|
foreach ($_POST['lists'] as $list_id) |
|
{ |
|
foreach ($_POST['new'] as $rec) |
|
{ |
|
$this->_mailerAddReceiver($list_id,$rec['status'],$rec['email'],$rec['lastn'],$rec['firstn'],$rec['midn'],$rec['comments'],false); |
|
} |
|
} |
|
$_SESSION['mailer']['multi_add'] = $_POST['lists']; |
|
reportLog($_SESSION['user_name'] . ' - выполнил(а) мульти-добавление получателей в списки: ' . implode(', ',$_POST['lists']), 2, 2); |
|
header('Location:index.php?do=modules&action=modedit&mod=mailer&moduleaction=' . ($_REQUEST['return'] ? 'multiadd' : 'showlists') . '&cp=' . SESSION); |
|
} |
|
|
|
/** |
|
* Метод подсчёта получателей при создании рассылки |
|
*/ |
|
function mailerCountMail($mail_id) |
|
{ |
|
global $AVE_DB, $AVE_Template; |
|
|
|
$mailer = $AVE_DB->Query(" |
|
SELECT subject, to_lists, to_groups, to_add, from_email, from_copy |
|
FROM " . PREFIX . "_module_mailer_mails |
|
WHERE id=" . $mail_id |
|
)->FetchRow(); |
|
$mailer->to_lists = explode(';',$mailer->to_lists); |
|
$mailer->to_groups = explode(';',$mailer->to_groups); |
|
$mailer->to_add = explode(';',$mailer->to_add); |
|
|
|
// получатели из списков |
|
foreach ($mailer->to_lists as $list_id) |
|
{ |
|
$list_name = $AVE_DB->Query(" |
|
SELECT title |
|
FROM " . PREFIX . "_module_mailer_lists |
|
WHERE id = " . $list_id |
|
)->GetCell(); |
|
$rec_lists = $AVE_DB->Query(" |
|
SELECT * |
|
FROM " . PREFIX . "_module_mailer_receivers |
|
WHERE list_id = " . $list_id |
|
); |
|
while ($rec = $rec_lists->FetchRow()) |
|
{ |
|
if(!in_array($rec->email,$rec_clean) && (int)$rec->status == 1) |
|
{ |
|
$rec_clean[] = $rec->email; |
|
} |
|
else |
|
{ |
|
$rec->s = true; |
|
} |
|
$rec_all['lists'][$list_name][] = $rec; |
|
} |
|
} |
|
unset($rec); |
|
|
|
// получатели из групп |
|
foreach ($mailer->to_groups as $group_id) |
|
{ |
|
$group_name = $AVE_DB->Query(" |
|
SELECT user_group_name |
|
FROM " . PREFIX . "_user_groups |
|
WHERE user_group = " . $group_id |
|
)->GetCell(); |
|
$rec_groups = $AVE_DB->Query(" |
|
SELECT id,email,lastname,firstname,user_group,user_name |
|
FROM " . PREFIX . "_users |
|
WHERE user_group = " . $group_id |
|
); |
|
while ($rec = $rec_groups->FetchRow()) |
|
{ |
|
if(!in_array($rec->email,$rec_clean)) |
|
{ |
|
$rec_clean[] = $rec->email; |
|
} |
|
else |
|
{ |
|
$rec->s = true; |
|
} |
|
$rec_all['groups'][$group_name][] = $rec; |
|
} |
|
} |
|
unset($rec); |
|
|
|
// дополнительные получатели |
|
foreach ($mailer->to_add as $email) |
|
{ |
|
$rec = array(); |
|
$email = trim($email); |
|
if ($email) |
|
{ |
|
if(!in_array($email,$rec_clean) && $this->_mailerCheckEmail($email) == 1) |
|
{ |
|
$rec_clean[] = $email; |
|
} |
|
elseif($this->_mailerCheckEmail($email) != 1) |
|
{ |
|
$rec['s'] = 2; |
|
} |
|
else |
|
{ |
|
$rec['s'] = 1; |
|
} |
|
$rec['email'] = $email; |
|
$rec_all['add'][] = $rec; |
|
} |
|
} |
|
unset($rec); |
|
|
|
// отправитель |
|
if ($mailer->from_copy) |
|
{ |
|
$rec = array(); |
|
$rec['email'] = trim($mailer->from_email); |
|
if(in_array($rec['email'],$rec_clean)) $rec['s'] = 1; |
|
if($this->_mailerCheckEmail($rec['email']) != 1) $rec['s'] = 2; |
|
$rec['from'] = true; |
|
$rec_all['add'][] = $rec; |
|
} |
|
|
|
$count_mail = $rec_all; |
|
$count_mail['title'] = $mailer->subject; |
|
$count_mail['number'] = count($rec_clean); |
|
$AVE_Template->assign('count_mail', $count_mail); |
|
$AVE_Template->assign('content', $AVE_Template->fetch($this->tpl_dir . 'admin_count_mail.tpl')); |
|
} |
|
} |
|
?>
|