CodeIgniter: Рассылка email по выбранным группам зарегистрированных пользователей и списку незарегистрированных пользователей
Поиски похожего решения не дали результатов, поэтому мы сделали сами сервис рассылки выпуcков на CodeIgniter с возможностью выбора групп пользователей системы, которые получат письма.
Интересный пример, чтобы разобраться как работать с массивами в php. Наверняка, можно написать более изящный код, но я пока не владею хорошими навыками работы с функциями. Также в будущем можно доработать возможность сохранения архива выпусков рассылки.
Вот как выглядит визуально интерфейс для управления рассылкой:
Для регистрации пользователей используется библиотека Ion Auth.
Представляю ниже код контроллера (subscribers.php), жирным выделен перебор адресов в группах:
function sendemail(){ $CI = &get_instance(); $CI->load->model('mdl_subscribers'); $this->load->helper('fckeditor'); $this->load->helper('file'); if ($this->input->post('subject')) // Если уже написали рассылку и нажали отправить... { $subject = $this->input->post('subject'); $msg = $this->input->post('message'); $test = $this->input->post('test'); $groups = $this->input->post('groups'); // $groups[1]=admin, $groups[2]=admins, $groups[3]=moderators ... $subscribers_unregistered = $this->input->post('subscribers'); if ($test) { $this->email->clear(); $this->email->from('company_mailer@yoursitename.ru', 'YourSiteName.ru'); $this->email->to('admin_copy@email.ru'); $this->email->subject($subject); $this->email->message($msg); $this->email->send(); $this->session->set_flashdata('message', "Отправлено тестовое письмо Мне уже почти любимому"); write_file('tmp/email.log', $subject ."|||".$msg); redirect('admin/subscribers','refresh'); } else { $n=0; // Рассылка по зарегистрированным пользователям if($groups) { foreach ($groups as $group => $group_name) // 1=>admin 2=>admins 3=>moderators ... { $group_members = $this->ion_auth->get_users_array($group_name); // $group_members[0] = array(0=>(array('111','Вася ПупЗемли', ...))) foreach ($group_members as $index => $member) // 0=>array('111','Вася ПупЗемли', ...), 1=>array('1','Саша Игорев', ...) { $signature = "<br /><p>_____________<br />C Уважением,<br />© <b>CIC Open World</b>, 2011. </body></p>"; $this->email->clear(); $this->email->from('xxx@englishow.ru', 'Englishow.ru - Сообщение для '.$member['username']); $this->email->to($member['email']); //$this->email->bcc('xxx@gmail.com'); $this->email->subject($subject); $this->email->message($msg . $signature); $this->email->send(); $n=$n+1; } } } // Рассылка по незарегистрированным пользователям if($subscribers_unregistered) { $unregistered_array = $this->db->get('subscribers')->result_array(); foreach ($unregistered_array as $index => $unregistered_subscriber) // 0=>array('111','Вася ПупЗемли', ...), 1=>array('1','Саша Игорев', ...) { $signature = "<br /><p>_____________<br />C Уважением,<br />© <b>CIC Open World</b>, 2011. <body></p>"; $this->email->clear(); $this->email->from('xxx@englishow.ru', 'Englishow.ru - Сообщение для '.$unregistered_subscriber['name']); $this->email->to($unregistered_subscriber['email']); //$this->email->bcc('xxx@gmail.com'); $this->email->subject($subject); $this->email->message($msg . $signature); $this->email->send(); $n=$n+1; } } $this->session->set_flashdata('message', $n." email'ов отправлено"); // выводится сообщение redirect('admin/subscribers','refresh'); } }else{ $this->email->clear(); $lastemail = read_file('tmp/email.log'); list($subj,$msg) = explode("|||",$lastemail); $data['subject'] = $subj; $data['msg'] = $msg; $header_data['page_title'] = 'Отправить выпуск'; $header_data['idbody_dash'] = $this->uri->segment(2); $this->load->view('admin/header.php', $header_data); //$data['groups'] = $this->ion_auth_model->get_groups(); $data['subscribers'] = $this->mdl_subscribers->getAllSubscribersUnregistered(); $CI->load->view('admin/subscribers_mail', $data); } $this->load->view('admin/footer.php'); }
Используется модель mdl_subscribers.php, с функцией getAllSubscribersUnregistered();
Это выборка адресов всех незарегистрированных пользователей:
function getAllSubscribersUnregistered(){ $data = array(); $Q = $this->db->get('subscribers'); if ($Q->num_rows() > 0){ foreach ($Q->result_array() as $row){ $data[] = $row; } } $Q->free_result(); return $data; }
Вид admin/subscribers_mail :
<div class="grid_16"> <?php if ($this->session->flashdata('message')){echo "<div class='message'>".$this->session->flashdata('message')."</div>";}?> </div> <?php echo form_open('admin/subscribers/sendemail'); echo "<p><label for='subject'>Тема</label>"; $data = array('name' => 'subject', 'id' => 'subject', 'size' => 70, 'value'=>$subject); echo form_input($data); echo "</p>"; echo "<p><label for='message'>Сообщение <small>текст рассылки</small></label>"; $data = array('name' => 'message', 'id' => 'message', 'rows' => 20, 'cols' => 50, 'value'=>$msg); echo form_textarea($data); echo "</p>"; ?> <?php echo form_fieldset('Кто получит эту рассылку?');?> <p><?php echo form_checkbox('test', 'true', TRUE); ?> <b>Отправить только тестовое письмо!</b></p> <p><?php echo form_checkbox_from_db('group_id', "SELECT id,name,description FROM groups"); ?></p> <p><?php echo form_checkbox('subscribers','true',FALSE);?> Незарегистрированные пользователи</p> <?php echo form_fieldset_close(); ?> <?php echo "<div class=\"grid_16\"><p>".form_submit('submit','Отправить')."</p></div>"; echo form_close(); ?> <?=show_fckeditor ('message')?>
Используется form_checkbox_from_db из хелпера dropdownfromdb_helper (можно найти на офиц. форуме codeigniter). Прада там dropdown выпадающий список описан. Я переделал под checkbox:
function form_checkbox_from_db($name = '', $sql, $selected = array(), $extra = '') { $CI =& get_instance(); if ( ! is_array($selected)) { $selected = array($selected); } // If no selected state was submitted we will attempt to set it automatically if (count($selected) === 0) { // If the form name appears in the $_POST array we have a winner! if (isset($_POST[$name])) { $selected = array($_POST[$name]); } } if ($extra != '') $extra = ' '.$extra; $multiple = (count($selected) > 1 && strpos($extra, 'multiple') === FALSE) ? ' multiple="multiple"' : ''; $form = ''; $query=$CI->db->query($sql); if ($query->num_rows() > 0) { foreach ($query->result_array() as $row) { $values = array_values($row); if (count($values)===3){ $key = (string) $values[0]; $nam = (string) $values[1]; $val = (string) $values[2]; //$this->option($values[0], $values[1]); } $sel = (in_array($key, $selected))?' selected="selected"':''; $form .= '<input type="checkbox" name="groups['.$key.']" value="'.$nam.'"'.$sel.'>'.$val."</input>\n"; } } return $form; }
almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.
Вы можете почитать все статьи от almix'а.
- 0 CodeIgniter: Всплывающая форма обратной связи на Ajax в Bootstrap Modal и проверкой Captcha (18.02.2014)
- Как правильно обновить ExpressionEngine до последней версии 2.5.5 (05.02.2013)
- Team Sense: Доступна отправка сообщения/письма на email сотрудника. (18.01.2013)
- TeamSense: username (логин) в регистрации пользователя. Внедрили библиотеку DHTMLX в TeamSense. (11.01.2013)
- Team Sense: В календарь добавлена возможность указывать место проведения уроков (в офисе, на выезде) (12.12.2012)
- Team Sense: Многопользовательский календарь, заменяем радиокнопки на чекбоксы в выборе преподавателей. Массивы в Javascript. (06.12.2012)
- Team Sense: В календарь-расписание уроков добавлено разделение по преподавателям, которым присвоены свои цвета. (04.12.2012)
- CodeIgniter не передаёт $this->uri->segment(3) в функцию контроллера (передача переменной PHP->JavaScript->PHP) (28.11.2012)
- Воюем с форматом даты в JavaScript. Приведение формата даты в поле input в календаре системы TeamSense к более красивому виду. (18.11.2012)
- Team Sense: Теперь Email-оповещения в TODO можно отправлять как для руководителя задачи, так и для помощников. (21.09.2012)
- CodeIgniter и TeamSense: Делаем свой вид для страницы с ошибкой 404, настраиваем правильную отдачу статусов в HTTP headers (12.09.2012)
- Установка другого сайта (на CodeIgniter или Yii) в подпапку и чтобы поддомен ссылался на подпапку (25.08.2015)
- CodeIgniter: Подключение JS и CSS файлов там, где это нужно. (26.06.2012)
- Использование DISTINCT в SQL-запросах для исключения повторяющихся данных применительно к фреймворку CodeIgniter. (18.06.2012)
- CodeIgniter выдаёт ошибку: Cannot modify header information - headers already sent by (13.04.2012)
- CodeIgniter: Передаются пустые значения полей формы через $_POST если вводить русские символы. Форма не проходит валидацию. (17.08.2016)
- Обновление CodeIgniter с версии 2.0 (2.0.0) до версии 2.0.1 (23.01.2012)
- CodeIgniter: Показываем сообщения пользователю на его действия (19.11.2011)
- Настройка локальной и рабочей сред для разработки на CodeIgniter (2-й вариант) (22.01.2012)
- Календарь c несколькими событиями в один день на CodeIgniter (Calendar Multiple Events Per Day) (23.10.2011)
- Настройка локальной среды для разработки на CodeIgniter в Mac OSX, используя MAMP (22.01.2012)
- Обновление CodeIgniter с версии 2.0.1 до 2.0.2 (23.10.2011)
- CodeIgniter: Аутентификация на сайте с помощью библиотеки DX Auth (24.08.2011)
- Сравнение Yii с CodeIgniter (23.10.2011)
- CodeIgniter: Рассылка email по выбранным группам зарегистрированных пользователей и списку незарегистрированных пользователей (02.03.2013) ← вы тут
2 комментариев
Можно подробнее?