CodeIgniter: Рассылка email по выбранным группам зарегистрированных пользователей и списку незарегистрированных пользователей

CodeIgniter: Рассылка email по выбранным группам зарегистрированных пользователей и списку незарегистрированных пользователей

Поиски похожего решения не дали результатов, поэтому мы сделали сами сервис рассылки выпуcков на CodeIgniter с возможностью выбора групп пользователей системы, которые получат письма.

Интересный пример, чтобы разобраться как работать с массивами в php. Наверняка, можно написать более изящный код, но я пока не владею хорошими навыками работы с функциями. Также в будущем можно доработать возможность сохранения архива выпусков рассылки.

Вот как выглядит визуально интерфейс для управления рассылкой:

codeigniter рассылка по нескольким группам подписчиков

Для регистрации пользователей используется библиотека 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;
    }

 

 

Источник: loco.ru

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:

Комментарии (2)     Подпишитесь на RSS комментариев к этой статье.

2 комментариев

#137
SEOforum говорит:
November 9, 2011 at 10:07 pm
Как это можно использовать для жумлы?

Можно подробнее?
#139
Саша говорит:
November 19, 2011 at 10:40 pm
Никак. Это для фреймворка CodeIgniter. Для Джумлы наверняка есть свои готовые модули для рассылок.