diff --git a/README.md b/README.md
index 60513e0..7cc4972 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,13 @@
-# mailer
+### mailer
-Модуль Рассылка | Подписка Только для AVE.CMS ALT
\ No newline at end of file
+#### Модуль Рассылка | Подписка v2.26.1
+
+### Данный модуль позволяет создавать внутренние (по группам пользователей сайта), внешние (по спискам) и комбинированные рассылки.
+
+ * Для вывода в публичной части сайта формы подписки на рассылку, используйте системный тег [mod_subscribe:XXX], где XXX - идентификатор списка рассылки, в который будет добавлен подписчик.
+
+### Changelog:
+
+04.09.2019 - версия 2.26.1 - адаптация для версии ave.cms 3.26
+
+29.06.2014 - версия 2.2.1
\ No newline at end of file
diff --git a/class/mailer.php b/class/mailer.php
new file mode 100644
index 0000000..8edc2a0
--- /dev/null
+++ b/class/mailer.php
@@ -0,0 +1,1153 @@
+@,\\\\\/]+@[^ <>@,\\\\\/]+\.[^ <>@,\\\\\/]+$/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 = '{t}';
+ $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 = '{t}';
+ $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 = '{t}';
+ $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'));
+ }
+}
+?>
\ No newline at end of file
diff --git a/index.php b/index.php
new file mode 100644
index 0000000..4ca25aa
--- /dev/null
+++ b/index.php
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/info.php b/info.php
new file mode 100644
index 0000000..ca2299e
--- /dev/null
+++ b/info.php
@@ -0,0 +1,20 @@
+ 'mailer',
+ 'ModuleVersion' => '2.26.1',
+ 'ModuleAutor' => 'val005',
+ 'ModuleCopyright' => '© 2007-' . date('Y') . ' AVE.cms',
+ 'ModuleStatus' => 1,
+ 'ModuleIsFunction' => 1,
+ 'ModuleTemplate' => 1,
+ 'ModuleAdminEdit' => 1,
+ 'ModuleFunction' => 'mod_subscribe',
+ 'ModuleTag' => '[mod_subscribe:XXX]',
+ 'ModuleTagLink' => null,
+ 'ModuleAveTag' => '#\\\[mod_subscribe:(\\\d+)]#',
+ 'ModulePHPTag' => ""
+ );
+?>
\ No newline at end of file
diff --git a/lang/index.php b/lang/index.php
new file mode 100644
index 0000000..4ca25aa
--- /dev/null
+++ b/lang/index.php
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/lang/ru.txt b/lang/ru.txt
new file mode 100644
index 0000000..cc74efc
--- /dev/null
+++ b/lang/ru.txt
@@ -0,0 +1,215 @@
+[name]
+MODULE_NAME = "Рассылка / Подписка"
+MODULE_DESCRIPTION = "Данный модуль позволяет создавать внутренние (по группам пользователей сайта), внешние (по спискам) и комбинированные рассылки. Для вывода в публичной части сайта формы подписки на рассылку, используйте системный тег [mod_subscribe:XXX], где XXX - идентификатор списка рассылки, в который будет добавлен подписчик."
+
+[public]
+MAILER_EMAIL = "E-mail"
+MAILER_LNAME = "Фамилия"
+MAILER_FNAME = "Имя"
+MAILER_MNAME = "Отчество"
+MAILER_SUBSCRIBE = "Подписаться"
+MAILER_UNSUBSCRIBE = "Отписаться"
+
+MAILER_WRONG_EMAIL = "Неверный синтаксис email-а!"
+MAILER_DELETED = "Получатель %email% успешно удалён из списка рассылки!"
+MAILER_DEL_NO = "Получатель %email% отсутствует в списке рассылки!
Возможно, вы уже отправляли заявку на удаление."
+MAILER_SUBSCRIBED = "Получатель %email% успешно добавлен в список рассылки!"
+MAILER_SUBSCRIBE_EXIST = "Получатель %email% уже есть в списке рассылки!
Возможно, вы отправляли заявку ранее. Поля ФИО были обновлены."
+
+[admin]
+MAILER_MODULE_NAME = "Рассылка"
+MAILER_MODULE_INFO = "На этой странице вы можете написать новое письмо и просмотреть список выполненных рассылок. Для отправки внешней рассылки необходимо сначала создать список рассылки в соответствующем разделе модуля."
+MAILER_MANAGE_MAILS = "Управление рассылками"
+MAILER_MANAGE_LISTS = "Управление списками рассылки"
+MAILER_NEW_MAIL = "Создать рассылку"
+MAILER_NEW_LIST = "Создать список рассылки"
+MAILER_YES = "да"
+MAILER_NO = "нет"
+MAILER_OR = "или"
+MAILER_MAILS_CTRL = "Для выбора нескольких используйте Ctrl"
+MAILER_ADD_BTN = "Создать список рассылки"
+MAILER_ADD_CONT_BTN = "Создать и продолжить (CTRL+S)"
+MAILER_EDIT_BTN = "Сохранить изменения"
+MAILER_EDIT_CONT_BTN = "Сохранить и продолжить (CTRL+S)"
+MAILER_SAVED = "Сохранено"
+MAILER_ACTIONS = "Действия"
+MAILER_ACTIONS_EDIT = "Редактировать"
+MAILER_ACTIONS_COPY = "Копировать"
+MAILER_ACTIONS_SHOW = "Показать письмо в новой вкладке"
+MAILER_ACTIONS_HOWSAVE = "Для сохранения нажмите одну из кнопок под таблицей"
+MAILER_ACTIONS_DEL = "Удалить"
+MAILER_ACTIONS_DOWNLOAD = "Загрузить в формате csv"
+MAILER_ACTIONS_WIPE = "Очистить
(удалить всех получателей)"
+MAILER_ACTIONS_WIPE_2 = "Удалить всех получателей из списка"
+MAILER_INPUT_ADD_ROW = "Добавить ряд"
+MAILER_SAVING = "Сохранение..."
+MAILER_SENDING = "Отправка..."
+MAILER_DELETING = "Удаление..."
+MAILER_SHOWING = "Просмотр..."
+MAILER_ADDING = "Добавление..."
+MAILER_SENDING_TEST = "Тестовая отправка..."
+MAILER_WIPING = "Очистка..."
+MAILER_SHOW_AUTHOR_TIT = "Просмотреть учётную запись пользователя"
+MAILER_WRITE_EMAIL = "Написать письмо"
+MAILER_LOOK = "Посмотреть"
+MAILER_LOOK_LIST = "Посмотреть список"
+MAILER_ER_EMAIL_SYN = "Неверный синтаксис email-а!"
+MAILS_SAVED = "Сохранено"
+MAILER_EMAIL_OK = "Правильный email"
+MAILER_SENT_OK = "Рассылка успешно отправлена"
+MAILER_SENT_OK_TEXT = "Рассылка была успешно отправлена и сохранена в список 'Выполненных рассылок'."
+MAILER_SENT_OK_LINK = "Вернуться к рассылкам"
+MAILER_NOFILE = "Файл не найден!"
+
+MAILER_MAILS_HEAD = "Выполненные рассылки"
+MAILER_MAILS_TPL_H = "Сохранённые рассылки (черновики)"
+MAILER_MAILS_AUTHOR = "Автор"
+MAILER_MAILS_SUBJECT = "Тема"
+MAILER_MAILS_DATE = "Дата отправки"
+MAILER_MAILS_CREATED = "Дата создания"
+MAILER_MAILS_FROM = "Отправитель"
+MAILER_MAILS_FORMAT = "Формат"
+MAILER_MAILS_REC_ADD = "Дополнительные получатели"
+MAILER_MAILS_REC_ADD_I = "Здесь можно через точку с запятой указать дополнительные email-ы только для этой рассылки"
+MAILER_MAILS_RECIEVERS = "Получатели"
+MAILER_MAILS_ATTACHS = "Прикреплённые файлы"
+MAILER_MAILS_NOITEMS = "Нет выполненных рассылок"
+MAILER_MAILS_TPL_NO = "Нет сохранённых рассылок"
+MAILER_MAILS_ADD_TITLE = "Создание рассылки"
+MAILER_MAILS_EDIT_TITLE = "Редактирование рассылки"
+MAILER_MAILS_NEW_TITLE = "Новая рассылка"
+MAILER_MAILS_HEAD_MAIL = "Параметры письма"
+MAILER_MAILS_HEAD_SET = "Параметры отправки"
+MAILER_MAILS_REC_GROUPS = "группы пользователей сайта"
+MAILER_MAILS_REC_LISTS = "списки рассылки"
+MAILER_MAILS_FROM_NAME = "Имя отправителя"
+MAILER_MAILS_FROM_EMAIL = "Адрес отправителя"
+MAILER_MAILS_FROM_COPY = "Поставить отправителя в копию"
+MAILER_MAILS_APPEAL = "Обращение к получателю"
+MAILER_MAILS_APPEAL_I = "Подставляется в %NAME%, если ФИО пустое"
+MAILER_MAILS_APPEAL_D = "уважаемый клиент"
+MAILER_MAILS_TEXT = "Текст"
+MAILER_MAILS_TEXT_I = "Шаблоны:
%NAME% = ФИО
%ID% = {№ рассылки} {C|G|L|A} {id получателя},
где C - сам отправитель, G - из группы, L - из списка, A - доп. получатель
%SHOW% = ссылка для просмотра письма в браузере при неправильном отображении"
+MAILER_MAILS_TEXT_D = "Здравствуйте, %NAME%!"
+MAILER_MAILS_ATTACH = "Прикрепить файлы"
+MAILER_MAILS_ATTACH_A = "Добавить файл"
+MAILER_MAILS_ATTACH_I = "Прикрепляйте файлы только если собираетесь отправить эту рассылку прямо сейчас"
+MAILER_MAILS_SAVEATTACH = "Сохранить файлы после отправки?"
+MAILER_MAILS_TEST_BTN = "Тестовая отправка"
+MAILER_MAILS_SEND_BTN = "Отправить"
+MAILER_MAILS_SAVE_BTN = "Сохранить черновик"
+MAILER_MAILS_SAVE_BTN_C = "Сохранить и продолжить (Ctrl+S)"
+MAILER_MAILS_SEND_Q = "Вы уверены, что расслылка готова к отправке?"
+MAILER_MAILS_SEND_TEST = "Отправить тестовое письмо на следующие адреса
(разделяйте точкой с запятой)"
+MAILER_MAILS_TEST_OK = "Тестовое письмо было успешно отправлено адресатам:"
+MAILER_MAILS_FINAL_REC = "Финальный список рассылки"
+MAILER_MAILS_FINAL_TXT = "Сохраните черновик перед просмотром Ctrl+S"
+MAILER_MAILS_MAKE_FIN = "Просмотреть"
+MAILER_MAILS_FIN_INFO = "Список откроется во всплывающем окне (разблокируйте)"
+MAILER_MAILS_DEL_Q = "Удалить черновик рассылки"
+MAILER_MAILS_SHOW = "Показать письмо в новой вкладке (%SHOW%)"
+MAILER_MAILS_SHOW_ALERT = "Сохраните рассылку первый раз перед просмотром!"
+MAILER_MAILS_TIMING = "Способ отправки"
+MAILER_MAILS_TIM_ALL = "Все сразу"
+MAILER_MAILS_TIM_100 = "По 100 писем в час"
+MAILER_MAILS_TIM_200 = "По 200 писем в час"
+MAILER_MAILS_TIM_300 = "По 300 писем в час"
+MAILER_MAILS_DELAY = "Задержка 1 час, отправка следующей порции писем: . Чтобы продолжить прямо сейчас, нажмите Ctrl+G"
+MAILER_MAILS_STOP = "Чтобы остановить процесс отправки, нажмите Ctrl+Q"
+
+MAILER_MAILS_SEARCH = "Найти"
+MAILER_SEARCHING = "Поиск..."
+MAILER_MAILS_FIND = "Поиск выполненных рассылок по полям:"
+MAILER_MAILS_FIND_NO = "Ничего не найдено"
+MAILER_MAILS_FIND_IN = "Введите слово или фрагмент текста для поиска"
+MAILER_ERR_SEACRH_WORDS = "Введите слово для поиска!"
+MAILER_ERR_SEACRH = "Выберите хотя бы одно поле!"
+MAILER_SEARCH_FROM_E = "Email отправителя"
+MAILER_SEARCH_FROM_N = "Имя отправителя"
+MAILER_SEARCH_SUB = "Тема"
+MAILER_SEARCH_BODY = "Текст"
+MAILER_SEARCH_REC = "Получатели (только по email-ам)"
+
+MAILER_ERR_FROM_NAME = "Введите имя отправителя!"
+MAILER_ERR_FROM_EMAIL = "Укажите правильный email отправителя!"
+MAILER_ERR_TO = "Выберите хотя бы один список рассылки или группу получателей,
либо укажите дополнительные email-ы!"
+MAILER_ERR_TO_ADD = "Проверьте правильность введённых email-ов!"
+MAILER_ERR_SUBJECT = "Укажите тему рассылки!"
+MAILER_ERR_BODY = "Введите текст письма!"
+MAILER_ALERT_ATTACH = "Выбранные Вами файлы вложений сохранены не будут.
Указывайте вложения только перед отправкой письма!"
+
+MAILER_LISTS_INFO = "В этом разделе выводятся все списки рассылки"
+MAILER_LISTS_EDIT_INFO = "Здесь вы можете отредактировать и дополнить список рассылки. Чтобы добавить сразу несколько получателей, нажмите крестик справа от полей для ввода информации. Добавление/изменение получателей осуществляется по нажатию кнопок сохранения; удаление выполняется без перезагрузки страницы.
Для массового добавления получателей в список используйте раздел 'Импорт получателей'."
+MAILER_LISTS_HEAD = "Списки рассылки"
+MAILER_LIST_HEAD = "Список"
+MAILER_LISTS_TITLE = "Название"
+MAILER_LISTS_DESCR = "Описание"
+MAILER_LISTS_AUTHOR = "Автор"
+MAILER_LISTS_DATE = "Дата создания"
+MAILER_LISTS_NUMBER = "Кол-во"
+MAILER_LISTS_NUMBER_F = "Кол-во получателей в списке"
+MAILER_LISTS_DELCHECK = "Удалить выбранные"
+MAILER_LISTS_NOITEMS = "Нет списков рассылки"
+
+MAILER_LISTS_ADD = "Добавить список"
+MAILER_LISTS_ADD_NAME = "Название списка рассылки"
+MAILER_LISTS_CREATE = "Создать список рассылки"
+MAILER_LISTS_CREATE_T = "Новый список"
+MAILER_LISTS_CREATE_MES = "Укажите название списка рассылки!"
+MAILER_LISTS_FIND = "Найти список"
+
+MAILER_LISTS_ADD_TITLE = "Создание списка рассылки"
+MAILER_LISTS_EDIT_TITLE = "Редактирование списка рассылки"
+MAILER_LISTS_SET_COM = "Общие настройки списка рассылки"
+MAILER_LISTS_SET_REC = "Получатели"
+MAILER_LISTS_DESCR_INFO = "Напишите, пожалуйста, подробное описание списка рассылки"
+MAILER_LISTS_NOTITLE = "Укажите название списка рассылки!"
+
+MAILER_LISTS_IMPORT = "Импорт получателей"
+MAILER_LISTS_IMPORT_T = "Прямой ввод"
+MAILER_LISTS_IMPORT_T_1 = "Разделитель получателей:"
+MAILER_LISTS_IMPORT_T_2 = "Разделителей полей:"
+MAILER_LISTS_IMPORT_T_H = "Если разделитель - новая строка, используйте \r\n"
+MAILER_LISTS_IMPORT_F = "Импорт из файла CSV"
+MAILER_LISTS_IMPORT_F_I = "Возможен импорт из файлов CSV кодировок cp1251 и UTF-8."
+MAILER_LISTS_IMPORT_F_H = "Внимание! Некоторые версии MS Excel сохраняют csv с разделителем ; независимо от выбранного формата.
Перед импортом проверяйте файл в блокноте."
+MAILER_LISTS_IMPORT_F_D = "Разделитель столбцов:"
+
+MAILER_REC_STATUS_I = "Письмо получат только отмеченные получатели. Сняв флажок, Вы можете временно отключить адресата от рассылки.
Если чекбокс запрещён, это означает, что подписчик отказался от рассылки"
+MAILER_REC_STATUS_I2 = "Письмо получат только отмеченные получатели. Сняв флажок, Вы можете временно отключить адресата от рассылки."
+MAILER_REC_EMAIL = "Email"
+MAILER_REC_LASTN = "Фамилия"
+MAILER_REC_FIRSTN = "Имя"
+MAILER_REC_MIDN = "Отчество"
+MAILER_REC_COMMENTS = "Комментарии"
+MAILER_REC_NOITEMS = "Список получателей пуст"
+MAILER_REC_EMAIL_OK = "Данный email можно добавить в список"
+MAILER_REC_EMAIL_NO = "Ошибка! Данный email уже есть в текущем списке рассылки"
+MAILER_REC_DEL = "Удалить получателя"
+MAILER_REC_DELETED = "Получатель был успешно удалён из списка рассылки"
+MAILER_REC_REFUSED = "Получатель отказался от рассылки"
+MAILER_REC_UNCHECKED = "Получатель был исключён из списка рассылки вручную"
+MAILER_REC_DATE_ADD = "Добавлен:"
+
+MAILER_MULTI_HINT = "Позволяет за раз добавить нескольких получателей в несколько списков"
+MAILER_MULTI_INFO = "Здесь Вы можете за один раз добавить нескольких получателей в несколько списков"
+MAILER_MULTI_TITLE = "Мульти-добавление получателей"
+MAILER_MULTI_LISTS = "Списки"
+MAILER_MULTI_TITLE2 = "Мульти-добавление адресатов в списки"
+MAILER_MULTI_BTN = "Добавить получателей"
+MAILER_MULTI_BTN_CTRL = "Добавить и продолжить (CTRL+S)"
+MAILER_MULTI_NOLIST = "Выберите хотя бы один список!"
+MAILER_MULTI_EMAIL_OK = "Правильный синтаксис email-а"
+
+MAILER_COUNT_TITLE = "Просмотр финального списка получателей рассылки"
+MAILER_GROUPS = "Группы"
+MAILER_GROUP = "Группа"
+MAILER_LOGIN = "Логин"
+MAILER_COUNT_INFO = "Если строка получателя выделена красным, значит, он по каким-то причинам не попадёт в финальный список рассылки"
+MAILER_COUNT_ER_REPEAT = "Получатель с таким email-ом уже вошёл в фиальный список. См. таблицу выше."
+MAILER_COUNT_NOLISTS = "Отсутствуют получатели из списков рассылки"
+MAILER_COUNT_NOGROUPS = "Отсутствуют получатели из групп пользователей сайта"
+MAILER_COUNT_NOADD = "Отсутствуют дополнительные получатели"
+MAILER_COUNT_SUM = "Итого"
+MAILER_COUNT_ALL = "Всего получателей"
+MAILER_COUNT_ALL_INFO = "За вычетом красных строк"
\ No newline at end of file
diff --git a/module.php b/module.php
new file mode 100644
index 0000000..711f641
--- /dev/null
+++ b/module.php
@@ -0,0 +1,178 @@
+tpl_dir = BASE_DIR . '/modules/mailer/templates/';
+
+ global $AVE_Template;
+ $lang_file = BASE_DIR . '/modules/mailer/lang/' . $_SESSION['user_language'] . '.txt';
+ $AVE_Template->config_load($lang_file, 'public');
+
+ $list_id = (int)preg_replace('/\D/', '', $list_id);
+ $_POST['email'] = trim($_POST['email']);
+
+ switch ($_POST['action'])
+ {
+ case 'subscribe':
+ $result = $mailer->mailerSubscribe();
+ switch ($result)
+ {
+ case 0:
+ $mes = $AVE_Template->get_config_vars('MAILER_WRONG_EMAIL');
+ break;
+
+ case 1:
+ $mes = str_replace('%email%',$_POST['email'],$AVE_Template->get_config_vars('MAILER_SUBSCRIBED'));
+ $AVE_Template->assign('hide_sub',true);
+ break;
+
+ case 2:
+ $mes = str_replace('%email%',$_POST['email'],$AVE_Template->get_config_vars('MAILER_SUBSCRIBE_EXIST'));
+ $AVE_Template->assign('hide_sub',true);
+ break;
+ }
+ break;
+
+ case 'unsubscribe':
+ $result = $mailer->mailerUnsubscribe();
+ switch ($result)
+ {
+ case 0:
+ $mes = str_replace('%email%',$_POST['email'],$AVE_Template->get_config_vars('MAILER_DEL_NO')); break;
+ case 1:
+ $mes = str_replace('%email%',$_POST['email'],$AVE_Template->get_config_vars('MAILER_DELETED')); break;
+ }
+ $AVE_Template->assign('hide_unsub',true);
+ break;
+ }
+ $AVE_Template->assign('message', $mes);
+ $AVE_Template->assign('action', $_POST['action']);
+ $AVE_Template->assign('list_id', $list_id);
+ $AVE_Template->display($mailer->tpl_dir . 'public_form.tpl');
+}
+
+/**
+ * Внешнее обращение
+ */
+if (!defined('ACP') && $_REQUEST['module'] == 'mailer')
+{
+ global $AVE_DB;
+ switch ($_REQUEST['action'])
+ {
+ case 'show':
+ $mail = $AVE_DB->Query("
+ SELECT body, appeal, type
+ FROM " . PREFIX . "_module_mailer_mails
+ WHERE id = " . $_REQUEST['id']
+ )->FetchRow();
+ $body = str_replace(
+ array('%NAME%' ,'%SHOW%'),
+ array($mail->appeal ,'#'),
+ $mail->body);
+ echo ($mail -> type == 'text') ? '
'.$body.'' : $body; + } +} + +/** + * Админка + */ +if (defined('ACP') && $_REQUEST['mod'] == 'mailer') +{ + include_once(BASE_DIR . '/modules/mailer/class/mailer.php'); + $mailer = new mailer; + $mailer->tpl_dir = BASE_DIR . '/modules/mailer/templates/'; + + $lang_file = BASE_DIR . '/modules/mailer/lang/' . $_SESSION['admin_language'] . '.txt'; + $AVE_Template->config_load($lang_file, 'admin'); + + switch ($_REQUEST['moduleaction']) + { + // Вывод списка рассылок + case '': + case '1': + $mailer->mailerShowMails(); + break; + + // Загрузка вложения из отправленной рассылки + case 'getfile': + if (file_exists($_REQUEST['file'])) + { + if ($_REQUEST['check']) exit('1'); + else $mailer->_mailerGetFile($_REQUEST['file']); + } + exit; + + // Вывод списка рассылок + case 'editmail': + include_once(BASE_DIR . '/class/class.user.php'); + $AVE_User = new AVE_User; + $mailer->mailerEditMail(); + break; + + case 'savemail': + include_once(BASE_DIR . '/class/class.user.php'); + $AVE_User = new AVE_User; + $mailer->mailerSaveMail($_REQUEST['id'],$_REQUEST['act']); + break; + + case 'countmail': + $mailer->mailerCountMail($_REQUEST['id']); + break; + + case 'testsend': + $emails = $mailer->mailerTestSend($_REQUEST['id'],$_REQUEST['emails']); + echo implode(', ',$emails); + exit; + + case 'sendmail': + $mailer->mailerSendMail(); + break; + + case 'showlists': + $mailer->mailerShowLists(); + break; + + case 'editlist': + $mailer->mailerEditList(); + break; + + case 'savelist': + $mailer->mailerSaveList(); + break; + + case 'multiadd': + $mailer->mailerMultiAdd(); + break; + + case 'multisave': + $mailer->mailerMultiSave(); + break; + + case 'delreceiver': + $mailer->_mailerDelReceiver($_REQUEST['rec_id']); + break; + + case 'checkemail': + echo $mailer->_mailerCheckEmail(trim($_REQUEST['email']),(int)trim($_REQUEST['list_id'])); + exit; + } +} + +?> \ No newline at end of file diff --git a/sql.php b/sql.php new file mode 100644 index 0000000..dcd1366 --- /dev/null +++ b/sql.php @@ -0,0 +1,101 @@ + \ No newline at end of file diff --git a/templates/admin_count_mail.tpl b/templates/admin_count_mail.tpl new file mode 100644 index 0000000..e729e27 --- /dev/null +++ b/templates/admin_count_mail.tpl @@ -0,0 +1,136 @@ +