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 комментариев
Можно подробнее?