Rol tabanlı güvenlik içeren sistemlerde rol bazlı toplu mail gönderimi

Rol tabanlı güvenlik içeren sistemlerde rol bazlı toplu mail gönderimi

Web uygulamaları doğası gereği internet üzerinde çalıştığı için tüm internet kullanıcılarına açıktır. Fakat bu açıklık bir sitenin tüm bölümlerine girmenizi sağlamaz. Yetki durumunuza göre sitedeki içeriği görebilir ve yine site üzerinde bazı haklara sahip olabilirsiniz. Şöyle mantığı bir örnekleyelim.Bir makale sitesi düşünelim,bu sistemde bazı roller vardır.Üyeler,yazarlar,editörler,yöneticiler… .Üyelerin sadece giriş yapıp makale okuma yetkisi varken,yazarlar hem makale okuyabilirler hem de yazma yetkileri vardır.Editörler ise üyelerden yeni yazarlar tayin edebilir,mevcut yazarların görevini sona erdirebilir,makale yazabilir.Yönetici ise en yetkili kişidir.Aşağıdan yukarıya doğru büyüyen,yetkilerin genişlediği bir düzen var.Bir yukarıdaki kişi bir aşağıdakinin yapabildikleri dahil yeni görevler üstlenir.Ama her rol grubunun erişebileceği veya erişemeyeceği kaynaklar vardır.Bu yetkilendirme ve güvenlik düzeni Asp.Net ile çeşitli şekillerde sağlanır.Benim anlatacağım uygulama ve işlemler Forms Authentication mantığı üzerine oturtulacaktır.Bu rol tabanlı güvenlik sistemi ile ilgili daha fazla bilgi için ise buradan ulaşabilirsiniz.Ben işlemleri bu makaledeki mantık üzerine oturtacağım ve bir makale sitesinde üye grupları için toplu mail gönderimi işlemini yaptıracağım.Bu makalede üye kontrolleri,üyelik işlemleri vb. authentication mantığı anlatmayacağım.Sadece bu mantığa uygun bir üye tablosu oluşturup,yönetim menüsünde olacak bir işlemi gerçekleştireceğim.

1.    Uygulamaya Geçelim

Rollerimiz belli;Üyeler,Yazarlar,Editörler,Yöneticiler

Gelelim şimdi yapacağımız işleme.Bu sistemin yöneticisi rol gruplarına bilgilendirme işlemi için toplu olarak ulaşmak isteyecek.Biz bu işi gerçekleştirecek işlemleri gerçekleştirmeye başlayalım.

Önce bir üye tablomuza göz atalım.

Tablomuz hazır,burada basit bir üyelik tablosu hazırladım.Kullanıcı adı,şifre vb. alanlar nvarchar tipinde.İsteyenler farklı şekilde hazırlayabilirler bu tabloyu,ekstra alanlar ekleyebilir,şifreyi MD5 vb. benzeri metodlar ile değiştirip daha saklayıp daha güvenli hale getirebilirler.Bizim uygulama için şimdi bu kadarı yeterli

Şimdi mail göndereceğimiz formun tasarımını yapalım.

Formu incelediğimiz zaman alıcı seçeneği için bir checkboxlist,başlık,mesaj için iki tane textbox,bilgilendirme amaçlı bir label ile gönder butonu görüyoruz.

Tasarım Kodları;

       

           

            MAİL GÖNDERİM FORMU

       

       

           

               

                   

                   

                  

               

               

                   

                   

               

               

                    

                   

                   

               

               

                   

                   

               

               

                   

                   

               

           

                        Alıcılar

                       

                       

                        Başlık

                       

                        Mesaj

                       

                   

                       

                   

                       

   

Form’un Page Load olayı(event) esnasında Checkboxlist dolduruluyor.

Bu uygulamada kullanacağımız özel sınıflarımız var örneğin bu Checkboxlist’i doldururken kullandığımız ve her veritabanı işlemi gerçekleştirirken kullanacağımız ilk özel sınıfımız olan clsData sınıfını(class) tanıyalım.Bu sınıf bizim veritabanı işlemlerimizi gerçekleştiriyor.Basit bir Data Access Layer örneği.İçinde veritabanı bağlantı yolu tanımlanıyor ve işlemlerimizi gerçekleştiren fonksiyon var.Fill fonksiyonu,verdiğimiz sorgu veya saklı yordama(store procedure) göre bir dataset’i dolduruyor.

clsData

Imports System.Data.SqlClient

Imports System.Data

Public Class clsData

    Public cs As String = System.Web.Configuration.WebConfigurationManager.ConnectionStrings("yazgelistir").ToString()

    Public conn As New SqlConnection(cs)

    Public Function fill(ByVal commandType As CommandType, ByVal commandText As String, ByVal ParamArray parameters() As SqlParameter) As DataSet

        Try

            Dim ds As New DataSet

            Dim cmd As New SqlCommand(commandText, conn)

            cmd.CommandType = commandType

            Dim i As Integer

            For i = 0 To parameters.Length - 1

                cmd.Parameters.Add(parameters(i))

            Next

            Dim da As New SqlDataAdapter(cmd)

            da.Fill(ds)

            Return ds

        Catch ex As Exception

            Throw ex

        End Try

    End Function

End Class

Burada aldığı “yazgelistir” adlı ConnectionString ise webconfig’de tanımlı.

           

     

Şimdi Checkboxlist nasıl dolduruluyor onu görelim.

    Dim data As New clsData

    Dim roller As New DataSet

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        roller = data.fill(CommandType.Text, "Select distinct role from uye order by role asc")

        chkalici.DataTextField = "role"

        chkalici.DataValueField = "role"

        chkalici.DataSource = roller

        chkalici.DataBind()

        lblmsj.Text = "Formu doldurunuz"

    End Sub

 

Mail gönderme formunu hazırlama işlemi bittiğine göre artık gönder butonu altında gerçekleşecek işlemleri yapmaya başlayabiliriz.Bizim için neler gerekli önce onları bir yapılacaklar listemize çıkaralım. J

Önce bizim checkboxlist’e seçilen rol tipinde olan tüm kullanıcıların mail adreslerini almamız gerekiyor. Bu liste tamamlandığı zaman ise tek yapmamız gereken uygun kütüphaneleri ekleyip,mail server tanımlayıp mail gönderme işlemini tamamlamak.

 

Checkboxlist’te seçilen roller de ki üyelerin mail adreslerini bir dizide tutan sınıfımızı oluşturduk.

clsRole

Imports Microsoft.VisualBasic

Imports System.Data.SqlClient

Imports System.Data

Public Class clsRole

    Dim data As New clsData

    Public Function kisimaildoldur(ByVal role As StringCollection) As DataSet

        Try

            Dim ds As New DataSet

            Dim sql As String

            sql = "SELECT mail from uye where "

            Dim i As Integer

            sql = sql + "role="" + role(0).ToString + """

            For i = 1 To role.Count - 1

                sql = sql + " OR role="" + role(i).ToString() + """

            Next

            ds = data.fill(CommandType.Text, sql)

            Return ds

        Catch ex As Exception

            Throw ex

        End Try

    End Function

End Class

Bu sınıf seçilen rollere göre veritabanına clsData sınıfı sayesinde bağlanıp o roldeki tüm kayıtlı insanların mail adreslerini bir dataset’e aktarıyor.Bu şekilde mail sınıfında bu dataset’i kullanarak mail server’a bağlanıp mail gönderme işlemini tamamlayacağız.

 

Peki bu sınıftaki fonksiyona verdiğim StringCollection tipindeki role dizisini nasıl aldım onu bir görelim.

Button Click olayı altına yazılan kodlar şöyle;

      Dim mailler As New DataSet

      Dim role As New StringCollection()

      Dim uzunluk, i As Integer

      uzunluk = chkalici.Items.Count()

        For i = 0 To uzunluk - 1

            If (chkalici.Items(i).Selected = True) Then

                role.Add(chkalici.Items(i).Value())

            End If

        Next

 

Artık mailler elimizde,başlık ve mesajı ise formu kullanan kişi girecek.

(Bunun kontrollerini en pratik şekilde RequiredFieldValidator nesnesi ile yapabilirsiniz.)

 

Mail gönderimini yapalım.

Her işlemde yaptığımız gibi düzenli bir uygulama gerçekleştirmek için mail gönderimi ile ilgili sınıfıda oluşturuyoruz.

clsMail

Imports Microsoft.VisualBasic

Imports System

Imports System.Data

Imports System.Configuration

Imports System.Collections

Imports System.Web

Imports System.Net

Imports System.Web.Security

Imports System.Web.UI

Imports System.Web.UI.WebControls

Imports System.Web.UI.WebControls.WebParts

Imports System.Web.UI.HtmlControls

Imports System.Net.Mail

Imports System.Data.SqlClient

 

Public Class clsMail

    Public baslik As String

    Public body As String

    Public Sub mailgonder(ByVal mail As DataSet)

        Try

            Dim m As New MailMessage

            m.IsBodyHtml = True

            m.BodyEncoding = Text.Encoding.Default

            m.SubjectEncoding = Text.Encoding.Default

            "Sistem Mail adresi ayarlanmalı!!!

            Dim programmail As New MailAddress("volkan@volkanbaytam.com", "Volkan BAYTAM", Text.Encoding.Default)

            m.From = programmail

            Dim uzunluk As Integer

            uzunluk = mail.Tables(0).Rows.Count()

            Dim i As Integer

            For i = 0 To uzunluk - 1

                m.To.Add(mail.Tables(0).Rows(i).Item("mail").ToString())

            Next

            m.Subject = Me.baslik

            m.Body = Me.body

            "Mail server ayarları yapılmalı!!!

            Dim client As New SmtpClient("mail.volkanbaytam.com")

            Dim cr As New NetworkCredential("volkan@volkanbaytam.com", "sifreburaya")

            client.Credentials = cr

            client.Send(m)

        Catch ex As Exception

            Throw ex

        End Try

    End Sub

End Class

 

Mail gönderim işlemi için Net.Mail kütüphanesini kullanıyoruz.

MailMesssage:Göndereceğimiz mail nesnesidir.

From:Gönderen mail adresi

To:Alıcı mail adresi.Çok sayıda mail alabiliyor.

Isbodyhtml:Html kodlaması içerecek mi?Yani mesaj içeriğinde html kod olduğu zaman onun yazı değil işlenmiş kod olarak görünmesini isterseniz bu seçeneği true yapıyoruz.

SubjectEncoding:Bu kodlama ile alakalı bir özellik.Default Türkçe karakterlerin göründüğü kodlama türü

Subject:Başlık

Body:Yazı

 

Bunlar ayarlandıktan sonra kullanılacak mail server(client) ayarlanır ve mail gönderim işlemi gerçekleştirilir.

 

Toplumail.aspx.vb (Tamamı)

Imports System.Data

Imports System.Data.Sql

Imports System.Data.SqlClient

Partial Class toplumail

    Inherits System.Web.UI.Page

    Dim rol As New clsRole

    Dim mail As New clsMail

    Dim data As New clsData

    Dim roller As New DataSet

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        If IsPostBack Then

 

        Else

            roller = data.fill(CommandType.Text, "Select distinct role from uye order by role asc")

            chkalici.DataTextField = "role"

            chkalici.DataValueField = "role"

            chkalici.DataSource = roller

            chkalici.DataBind()

            lblmsj.Text = "Formu doldurunuz"

        End If

       

    End Sub

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim mailler As New DataSet

        Dim role As New StringCollection()

        Dim uzunluk, i As Integer

        uzunluk = chkalici.Items.Count()

        For i = 0 To uzunluk - 1

            If (chkalici.Items(i).Selected = True) Then

                role.Add(chkalici.Items(i).Value())

            End If

        Next

        If (role.Count <> 0) Then

            mailler = rol.kisimaildoldur(role)

            mail.baslik = baslik.Text

            mail.body = mesaj.Text

            mail.mailgonder(mailler)

            lblmsj.Text = "Mail gönderim işlemi başarılı"

        Else

            lblmsj.Text = "Lütfen en az bir rol seçiniz"

        End If

 

    End Sub

End Class

 

Örnek işlem sonucunda işlem başarılı yazısının görünmesi :)

2.    Sonuç

Makalemizi tamamladık.Bu makalede rol tabanlı güvenlik sistemi içeren web uygulamalarında rollere toplu mail gönderim işlemini gerçekleştirdik ayrıca toplu mail ötesinde mail ASP.Net üzerinde SMTP kullanarak mail göndermede sıkıntı yaşayan arkadaşlarımız için yardımcı olabilecek bir mail sınıfı yazdık

Döküman Arama

Başlık :

Kapat