Модуль Рассылка | Подписка v2.26.1
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

<?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&amp;action=modedit&amp;mod=mailer&amp;moduleaction=1&amp;page={s}&amp;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&amp;action=modedit&amp;mod=mailer&amp;moduleaction=showlists&amp;page={s}&amp;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&amp;action=modedit&amp;mod=mailer&amp;moduleaction=editlist&amp;id=' . $_REQUEST['id'] . '&amp;page={s}&amp;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'));
}
}
?>