Perşembe, 9 Temmuz 2009

Aktivasyon E-postası ile Üye Kontrolü

 

İnternet siteleri üye olan ziyaretçilerinin çalışan e-posta adreslerini denetlemek için aktivasyon e-postası gönderirler. Böylece aktivasyon mesajındaki linki tıklayan ziyaretçi web sitesine geri döndüğünde site için yaşayan bir üye kaydının yapıldığı kabul edilir. Bu yazımda CodeIgniter ile e-posta göndermeye ve aktivasyon işleminin nasıl yapıldığına değineceğim.

Yazıda daha önce burada anlattığım auth.php isimli kütüphaneyi kullandığım için, önce o yazıyı okumanızı öneririm. E-posta yollayabilmek için önce içinde gerekli sabitlerin yer aldığı email.php isimli dosyamızı application/config dizini altına kayıt ediyoruz. Dosyamızın içeriği alttadır:

<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');

  $config['protocol'] = 'smtp';
  $config['smtp_host'] = 'mail.siteminadresi.com';
  $config['smtp_user'] = 'adresim@siteminadresi.com';
  $config['smtp_pass'] = 'mailimin_sifresi';
  $config['charset'] = 'utf8';
  $config['wordwrap'] = TRUE;

Yukarıdaki email.php dosyamda yapılan ayarlara kısaca değinelim: "Protocol" değişkeni postanın gideceği protokolü göstermektedir. Apache sunucuda SMTP protokolü ile gönderildiğini kabul ediyoruz. "SMTP_HOST" değişkeni bu protokole ulaşmak için gerekli sunucu adresini gösterir. "SMTP_USER" ve "SMTP_PASS" şifresini bildiğiniz geçerli adresi ve şifresini gösterir. Bir çok sunucu istenmeyen postaların gönderilmesini önlemek için bu tür bir önlemi şart koşmaktadır. "CHARSET" göndereceğimiz metnin karakter setini işaret eder. "WORDWRAP" uzun metinlerin bağlanmasını istediğimizi gösterir.

Şimdi aplication/libraries dizini altında bulunan auth.php isimli dosyamızı açalım ve ziyaretçimizin kayıt olması durumunda çalışacak fonksiyonu yazalım:

    function create_user($user = array(),) {
        $this->CI =& get_instance(); 
           // Insert account into the database
           if(!$this->CI->db->insert('users',$user)) {
                return 1; // users tablosuna ekleyemedi hatası.
            } else {
             $user_id = $this->CI->db->insert_id();
    $user_ip = $this->CI->input->ip_address();
    $first_date = date('Y-m-d h:m:s');
    $code = $this->random_string();
      
             $arr = array(
                    "user_id"=> $user_id,
                    'first_date'=> $first_date,
                    "ip_no"=> $user_ip,
     "code"=>$code,
                 );
   if(!$this->CI->db->insert('user_info',$arr)) {
              return 2; // user_info tablosuna ekleyemedi hatası.
       } else {
     $subject = "Kullanıcı aktivasyon maili";
     $message = "Sevgili ".$user['name']."\Üyeliğinizi başlatmak için lütfen aşağıdaki linki tıklayın:\n\n ".base_url()."user/activate/$user_id/$code";
     if (!$this->send_mail($user['email'],$subject,$message)) return 3 // Başarıldı.;
     else return 4;
    }
              
           return 5; 
   }
    }

Bu kod ile user_info tablosuna kayıt yapılması durumunda oluşturulan aktivasyon e-postası kullanıcının adresine gönderilmektedir. Bundan sonraki aşamamız controller dosyası içinde ziyaretçinin formu doldurmasının ardından çağrılan metodun yazılması olsun:

class User extends Controller {

 function User()
 {
  parent::Controller(); 

 }
 
 
 function index()
 {

 }
 
 function form()
 {
  
  $this->load->view('signupform_view');
 }
 

 function create() 
 {
  $this->load->helper('form');
 
  $this->form_validation->set_rules('name', 'İsminiz', 'trim|required|min_length[5]|max_length[12]|xss_clean');
  $this->form_validation->set_rules('password', 'Şifreniz', 'trim|required|matches[passconf]');
  $this->form_validation->set_rules('passconf', 'Şifrenizin tekrarı', 'trim|required');
  $this->form_validation->set_rules('email', 'Şifrenizin tekrarı', 'trim|required|valid_email|xss_clean');
  
  $this->form_validation->set_message('required', '%s değerini girmelisiniz.');
  $this->form_validation->set_error_delimiters('

', '

'); if ($this->form_validation->run() == FALSE) { $this->load->view('signupform_view', $data); } else { $password = dohash($this->input->post('password'), 'md5'); $email = $this->input->post('email'); $name = $this->input->post('name'); $data['error'] = $this->auth->create_user(array('name'=>$name,'email' => $email, 'pass' => $password)); $this->load->view('signok_view', $data); } }

Yukarıdaki dosya applicaiton/controllers dizini altında user.php ismi ile kayıtlıdır. user/form metodu ile form yüklendikten sonra ziyaretçi doldurup user/create metodunu çağırır. Kayıt yapıldığında auth kütüphanesindeki create_user fonksiyonu çalışır ve kullanıcı kayıt edildiyse aktivasyona mesajı gönderilir.

Aktivasyon mesajı alan kullanıcı, gelen link tıklayınca application/controllers dizini altındaki user.php dosyası içindeki user/activate metodunu çalıştırır. Bu metod ile gelen linkteki user_id ve code değişkenleri alınarak, veritabanındaki user_info tablosunda bulunan değerler ile karşılaştırılır.

  function activate() {
  $this->load->model('User_model');

   $user_id = $this->uri->segment(3);
   $code = $this->uri->segment(4);

  $data['title']= "Activation E-postası Sonucu";

   $rtn = $this->User_model->add_active($user_id,$code);
   if ($rtn) { 
    $data['message'] = "Hesabınız aktive edildi.";
    $this->load->view('error_view', $data);
   } else {
    $data['message'] = "Hata! Hesabınızı aktive edemediniz. Lütfen linki tekrar kontrol ediniz!";
    $this->load->view('error_view', $data);
   }

    }

Yukarıda anlattığm kısımları ile basit bir aktivasyon maili işleminin nasıl yapıldığını ve CodeIgniter`da mail kullanımının nasıl olduğunu göstermeye çalıştım. Model dosyalarında yer alan veritabanı kayıtları, sorgularını ve View dosylarının içeriğini fazla kafa karıştırmaması için anlatmadım.

Yorumlar

User_model kodları eksik sanırım. çünkü şu satırın nasıl çalıştığını bulamıyorum:
$rtn = $this->User_model->add_active($user_id,$code);

@ALEXIS: Yazıda da bahsettiğim üzere, model fonksiyonlarını konuyu fazla karıştırmamak için anlatmadım. Kodları iyice anlayınca siz de az çok tahmin edebilirsiniz model fonksiyonlarını.

Ancak yine de istek olursa, bu yazının devamı niteliğinde onları da yazar, uygulama olarak yayımlayabilirim.

$code kayıt sırasında direk user tablosuna işlenip, e-postadaki linke tıklama ile gelinen sayfadaki add_active() ile kontrol edildiği bariz. Ama bir yandan haklısınız, herşeyi hazır beklemeyip kodları kendimizin tamamlaması gerek.

Yorum Ekle



Captcha: