@,\\\\\/]+@[^ <>@,\\\\\/]+\.[^ <>@,\\\\\/]+$/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')); } } ?>