Monthly Archives: Eylül 2009

Ayın Konusu: AES Şifreleme Algoritması ile Veri Şifreleme ve Çözümleme!

Kriptoloji geçmişten günümüze kadar kadar kullanılan bir şifreleme bilimidir ve veri iletişiminin güvenliğini matematiksel fonksiyonlarla sağlamaktadır. Günümüzde çeşitli şifreleme algoritmaları mevcutdur; MD5, SHA1, RSA, RC4, AES gibi çeşitli şifreleme algoritmaları mevcuttur. Biz bu makalede AES algoritmasını inceleyeceğiz. .NET Kütüphanesinden bulabileceğiniz bu algoritmaya ben kendim internetten bulduğum C kodunu C# koduna çevirerek sizlere vereceğim. Yaptığım AES sınıfının kullanımına bakalım şimdi;

2 Temel fonksiyonumuz var; decrypt() ve encrypt(). Sınıfın kullanımına örnek kod bloğu;

int[] sifrelenecekData = new int[16];
int[] aes_key = new int[16];

aes.block = sifrelenecekData;
aes.key = aes_key
aes.encrypt(); // Artık aes.block'da şifreli data var...
aes.key = aes_key
aes.decrypt(); // aes.block'da ilk data var...

Yukarıdaki kod parçacığını örneklendirecek olursak, biz veritabanımızdaki verileri AES 128-bit algoritması ile şifrelemek isteyelim. Bizim önce şifreleyeceğimiz veriyi aes.block dizisine yüklememiz lazım. Ardından da her iki tarafında bilmesi gereken bir ‘KEY’ olması lazım. Bu key sizin güvenliğinizi sağlayacaktır. Verinizi bu ‘KEY’ ile şifreledikten sonra veritabanınıza kaydettiğinizi düşünün. Eğer dışarıdan biri veritabanınıza erişse bile veriler şifreli olduğu için ve ‘KEY’i bilmediğinden veritabanında ki datalar onun için hiçbirşey ifade etmeyecektir. Sizin kullanıcılarınız ‘KEY’i bildikleri için veritabanındaki veriler kullanıcılarınız için anlamlı hale gelecekdir.Şifrelediğiniz bu veriyi açmak için yine ‘AES’ sınıfının ‘BLOCK’ dizisine datayı yükleyiniz ve ardından da aes.key dizisine belirlediğiniz gizli ‘KEY’i yükleyin ve aes.decrypt() fonksiyonunu çağırın. Artık aes.block dizisinde şifrelediğiniz veri var.

Bu sınıfı için indirmek için buraya tıklayabilir ya da ‘Download’ bölümünden indirebilirsiniz.

Kriptoloji ile ileride .NET Kütüphanesinin System.Security isim alanını ileriki aylarda detaylı bir şekilde inceleğiz. Kriptoloji için güzel bir giriş yaptığımızı düşünüyorum umarım sizler için faydalı olmuştur. Bu ayın son konusu buydu arkadaşlar…

Hepinize kolay gelsin, iyi çalışmalar…

Ayın Konusu: Programımıza çoklu dil desteği nasıl yapabiliriz!

Yaptığımız programı farklı ülkelerdeki insanlarında kullanmasını isteyebiliriz. Bu özellik birçok programlarda mevcut, biz bunun istersek programımızda geniş bir matris dizisi tanımlayarak yapabileceğimiz gibi Visual Studio IDE’sinin bize sunduğu ‘Resource File’ ile de yapabiliriz. Bunun için önce projemize bir ‘Resource File’ ekleyelim. Bunun için;

– Project->Add New Item->General->Resource File->DilAyari.tr-TR.resx  ve DilAyari.en-US.resx isimlerinde 2tane resource file ekleyelim.

Burada dikkat edilmesi gereken nokta tr-TR dememiz. Bu kod Ingilizce için en-US, Italyanca için it-IT olarak değiştirilebilir. Tam liste için MSDN’e başvurabilirsiniz.  .resX uzantılı dosyalarını açtığımız zaman karşımıza Excel tablosu gibi bir tablo çıkacaktır. Burada 3 tane sütun var; -Isim, -Değer, -Yorum. Projemizde bir tane buton olsun ve bu butonun ismide ‘Tamam’ olsun, eğer kullanıcı programı ingilizce kullanmak istiyorsa bunu ‘OK’ olarak görsün. Bunun için şimdi eklediğimiz DilAyari.tr-TR.resx dosyasını açalım ve şu şekilde dolduralım

Name = ‘tmm_btn’, Value = ‘Tamam’

DilAyari.en-US.resx için;

Name = ‘tmm_btn’, Value = ‘OK’

2 dosyada da butonumuza isim verdik. Şimdi bunları kullanmaya geldi. Kullanıcı için 2 tane dil için buton ekleyelim.

private void turkce_btn_Click(object sender, EventArgs e)
{
   Thread.CurrentThread.CurrentUICulture = new CultureInfo("tr-TR");
   Thread.CurrentThread.CurrentCulture = new CultureInfo("tr-TR");
 
   button1.Text = resM.GetString("tmm_btn");
}

Bu kodu incelersek, önce programımızın çalışacağı dil için Thread sınıfının üyesi olan CurrentThread properties’inde bulunan CurrentUICultere ve CurrentCulture properties’i Türkçe olarak ayarlıyoruz. Ardından da butonumuzun ismini düzeltiyoruz. Burada resM’i aşağıdaki gibi tanımladım;

ResourceManager resM = new ResourceManager("WindowsProject1.DilAyari",
                                            Assembly.GetExecutingAssembly()
                                          );

Eğer programınız da birden fazla kontrol varsa bunları bir fonksiyon altında toplarsanız sizin için daha rahat olacaktır. O zaman tek yapmanız gereken ‘Türkçe’ butonuna basıldığı zaman Cultere ayarlarını yapmak ve fonksiyonu çağırmak olacaktır. Bir avantajıda şu, mesela siz ileride bir tane daha buton eklediniz ya da başka birşey bunun dil ayarlarını yapmak için hem türkçe hem ingilizce ya da varsa diğer dillerin butonunun altına tek tek yazmak yerine sadece fonksiyona yazarsınız ve işlem tamamlanmış olur.

Bir ayın konusunun daha sonuna geldik, umarım sizler için faydalı olmuştur…

Herkese kolay gelsin, iyi çalışmalar…

Ayın Konusu: .Net Microframework’e Giriş!

Bu işe ben ‘C Programlama Dili’ ile başladım, çalıştığım firmada ilk başlarda PIC mikroişlemcileri için CCS C kullanarak led yakıp söndürme, seri port’dan data alış-veriş’i, eeprom’a okuma-yazma gibi basit işlemler yapmıştım, ama mikroişlemciler tabiki bu kadar değildi. Mikroişlemcilerin çalışma prensibinin yanısıra, PWM, UART, USART, I2C gibi terimleride bilmek gerekiyordu. Ben tam bu işlere doğru yönelirken benden bir bilgisayar programı yapmamı istediler ve bende kendimi C# ile uğraşırken buldum. C#’a başlarken bir abim bana ‘O dile alışırsan C ile yazmak insana zor gelir.’ demişti ve hakikaten de öyle oluyordu. C# gerçekten programcıyı birçok şeyden kurtarıyordu, bu programcıyı tembelliğe mi alıştırıyordu tartışmalarına girmeyeceğim tabi ama eğer bilgisayar programı yapıyorsak C# bu iş için kusursuz. Firmadaki mühendislerin C ile mikroişlemci programladıklarını ve bir sorun çıktığında uğratıklarını gördükçe hep şunu derdim; ‘Ne zaman Microsoft Visual Studio’yu ve C#’ı mikroişlemciler için de uyarlar o zaman ben mikroişlemci yazılımına başlarım.’ Ve istediğim sonunda oldu. Microsoft Visual Studio gibi bana göre 1 numara olan bu IDE’de C# programlama dili ile microişlemcilere yazılım yapma imkanı sağladı. Bunun adı; .NET Microframework.

.NET Microframework, Microsoft’un gömülü sistemler için geliştirdiği yeni bir teknoloji. .NET ortamında yazıldığı için elbette işlemcilerde framework yüklü olması gerekiyor. ARM işlemcilere sahip bu sistemlerde ki özelliklerin bazıları şunlar; Eeprom, USB, I2C, I/O, Ethernet vb. gördüğünüz gibi PIC veya Atmel işlemcilerin sahip olduğu birçok özelliklere ve daha fazlasına sahip. Yani PIC işlemcilerde yaptığınız uygulamaları .NET Microframework yüklü ARM işlemcilerle yapabilirsiniz. Şuan için .Net Microframework’un tek eksiği ‘Native Code’ desteğinin olmaması. Bunun olmamasından dolayı gerçek zamanlı uygulamalarımızda kullandığımızda sıkıntı çıkıyor. Tepki süresinin ne zaman olduğunu .Net Microframework garanti edemiyor, ama şuanda Beta sürümü yayınlanan .Net Microframework 4.0’da ‘Native Code’ desteği verilmekte. Daha fazla ayrıntı için tıklayın.

.Net Microframework için birçok firmanın ‘Application Board’ları var, bunlardan en popüleri Device Solution firmasının TahoeII’si. Türkiyede bunun distribütörlüğünü Çeliker Bahçeci yapıyor. Sitesinde .Net Microframework ile ilgili yapılmış uygulamaları bu linkte görebilirsiniz. Benim favori ‘Application Board’um GHI firmasının ‘ChipworkX’i. Ilerleyen zamanlarda bende burada sizlere .Net Microframework ile yapılmış birkaç uygulama sunacağım.

Son olarak .Net Microframework ile neler yapılabileceğinizden bahsedelim. Ilk olarak sizlere bu linkteki siteyi paylaşmak istiyorum. Bu sitede .Net Microframework ile yapılmış birçok proje bulabilirsiniz. Sitede de göreceksiniz ki .Net Microframework ile yapamayacağınız şey yok. Harita uygulamasından, görüntü aktarımına kadar birçok ilginç projeyi burada görebilirsiniz.

Bu makalede .Net Microframework hakkında kısa bir bilgi vermeye çalıştım. Ileride sizlere sitemde çok farklı değişik uygulamalar sunmak ümidiyle.

Hepinize kolay gelsin, Iyi çalışmalar…

Ayın Konusu: ‘Sürükle-Bırak Özelliği’

Birçok programda bu özellik mevcuttur, herkesin kullandığı MSN programında bile arkadaşlarımıza dosya göndereceğimiz zaman yazı yazdığımız yere dosyayı sürükleyip bırakırız. Peki biz bunu kendi programımıza nasıl ekleyeceğiz? Mesela formumuzda bir ‘TextBox’ olsa kullanıcı metin dosyasını ‘TextBox’a sürükleyip bıraktığında içindeki yazıları ‘TextBox’da göstersek, ya da en güzeli ana formumuza istediği dosyayı bıraksın biz belirleyelim nerede gözükeceğini :), resim ise ‘PictureBox’da metin dosyası ise ‘TextBox’da, excel dosyası ise ‘DataGrid’de vb. Nasıl olur? (En sonuncusu bence en güzeliydi).

Ilk olarak yapmamız gereken sürükle-bırak özelliğini kullanacağımız kontrol’ün ‘AllowDrop’ özelliğini ‘true’ yapmamız lazım. Bunu yaptığımız zaman kontrolün üzerine bir dosya sürüklediğimizde dosyanın bırakılabileceği anlamına gelen simgeye dönüşecek fare imleçimiz. (Not: ‘AllowDrop’ özelliği bazı kontrollerde mevcut değil. PictureBox, GroupBox vb.) Bu işlemi yaptıktan sonra sıra dosyayı bıraktıktan sonraki işlemleri yapmak kaldı. Bunun için kontrollerin iki tane ‘Event’i mevcut; ‘DragDrop’: Dosya bırakıldıktan sonra tetiklenen fonksiyon. ‘DragEnter’: Dosya bırakılmadan kontrolün üzerindeyken tetiklenen fonksiyon.

private void TextBox1_DragEnter(object sender, DragEventArgs e)
{
   if (e.Data.GetDataPresent(DataFormats.FileDrop, false) == true)
      e.Effect = DragDropEffects.All;
}
 
private void TextBox1_DragDrop(object sender, DragEventArgs e)
{
   string[] dosyalar = (string[])e.Data.GetData(DataFormats.FileDrop);
 
   EepromDosyaYolu = dosyalar[0];
 
   if ((dosyalar[0].EndsWith(".txt") == true) || (dosyalar[0].EndsWith(".TXT") == true) ||
       (dosyalar[0].EndsWith(".rtf") == true) || (dosyalar[0].EndsWith(".RTF") == true)
     )
    {
       dosyaIsim_tb.Text = dosyalar[0].Remove(0, dosyalar[0].LastIndexOf("\\") + 1);
    }
    else
    {
       EepromDosyaYolu = "";
       MessageBox.Show("Yanlış Format, "www.burakozkan.net", MessageBoxButtons.OK, MessageBoxIcon.Error);
       return;
    }
}

‘DragEnter’ ‘Event’inde dosya bırakıldı mı diye kontrol ediliyor eğer dosya bırakıldıysa, kontrolün ‘DragDrop’ ‘Event’i yapılıyor, burada yapılan işlemler, ben bütün bırakılan dosyalarla işlem yapmak istemediğim için sadece ilk dosyanın ismini aldım, eğer siz uygulamanızda birden fazla dosya bırakıldığı zaman hepsini kullanmak istiyorsanız ‘dosyalar’ isimli ‘string’ dizisini kullanabilirsiniz. Dosyanın ismini aldıktan sonra uzantısına baktım eğer metin dosyası formatlarından bir tanesi ise dosya ismini bir ‘TextBox’a yazdırdım, dosyayı okumak için FileStream sınıfı ile okuyup yazdırabilirsiniz. Gelelim son dediğimizi yapmaya; bu işlem için kod yazmayacağım zaten yukarıdaki koddan farklı birşey yapmayacaksınız. Sadece bunu ana formunuza uygulayacaksınız ve ‘DragDrop’ ‘Event’inde dosya formatına göre ayırarak ister bir ‘PictureBox’da gösterebileceksiniz, isterseniz ‘TextBox’da isterseniz ‘DataGrid’de tercih size kalmış. Hatta çoklu dosya bırakıldıysa bunları bir ‘ListBox’da gösterebilirsiniz.

Bir ayın konusunun daha sonuna geldik, umarım sizlere faydalı olur. Hepinize kolay gelsin, Iyi çalışamalar…

Bir blog sitesi neden hacklenir?

Anlamakta güçlük çekiyorum. Yazının başlığındaki soruyu kendime sordum ama bir cevap bulamadım, bir blog sitesini neden hacklenir?. İçerisindeki tüm bilgilerin hiçbiri bir çıkar amacı içermezken, hepsi tamamiyle bilgi amaçlıysa neden bir blog sitesi hacklenir? Acaba bu kendini hacker zanneden kişi sadece blog sitesi mi hackleyebiliyor? 🙂 Gerçekten çok garip ve anlamsız. Ama ben hep şöyle düşünmüşümdür, kopyalanan, taklit edilen bir mal iyi maldır. Bu sitenin hacklenmesi bu yüzden benim hoşuma gitmedi desem yalan olur çünkü birilerinin dikkatini çekmişim, birileri bu blog sitesini hacklemeye layık görmüş ama beni üzen nokta, bu hackleyen kişiler acaba gerçekten hacker mı? yoksa kendilerini mi öyle sanıyorlar. Ben hackerlığında bir yetenek gerektirdiğini düşünürüm, hatta bunu ayrı bir mühendislik dalı olarak görürüm güvenliğiyle beraber. Bir yerin güvenliğini kurmak ve kurulan güvenliği aşmak tamamen bir mühendislik dalıdır benim için ve o kişilere saygım vardır. Ama bir blog sitesini hackleyene değil :), blog sitesi adı üstünde. Eğer bu siteyi hackleyen arkadaş buraya neden hacklediğini yorum olarak yazarsa çok memnun olurum ve neler yapabileceklerinide tabi. Beni bu düşünceden kurtarırsa çok memnun olurum :). Size iyi hacklemeler 🙂

Bayramınız Mübarek Olsun!

Tüm islam aleminin Ramazan Bayramını en içten dileklerimle kutlar, sevdiklerinizle beraber mutlu, huzurlu, sağlıklı bir bayram geçirmenizi en içten dileklerimle temenni ederim. Ramazan Bayramınız mübarek olsun…

Ayın Konusu: ‘C# ile Toplu Mail Gönderme Programı ve Anlatımı!’

Arkadaşlar yeni bir Ayın Konusu ile sizlerleyim. Bu uygulama benim çok hoşuma gitmeye başladı çünkü burada duyurduklarımı yapma zorunluluğu hissediyorum ve eğer bunları yaparsam sitem sizler için daha faydalı olur diye ümit ediyorum. Bildiğiniz gibi ayın konularından biride ‘C# ile Toplu Mail Gönderme Programı ve Anlatımı’, konu başlığını okuyunca ‘Bunun neresi Ayın Konusu olmayı hak ediyor ki?’ diyebilirsiniz. Evet konu başlığına bakınca ‘mailMessage.To.Add(…)’ fonksiyonuna mailleri dizince gönderebilirim. Evet bu fonksiyonu kullanarak göndereceğiz. Ama bu bildiğimiz fonksiyonu kullanarak güzel bir program neden yapmıyoruz? Mesela kullanıcı mail hesapları tanımlasa!, Excel dosyasından veya metin belgesinden mail listesini eklese!, eklediği mailleri bir kişi listesi olarak kaydetse sonra tekrar seçebilse!. Bildiğimiz tek birşey var mailMessage.To.Add(…) fonksiyonu. Bu fonksiyondan yola çıkarak şimdi programımızı inceleyelim;

Programımızın yapabildikleri;

– Çoklu Mail hesabı tanımlama.

– Kişi listesi oluşturma imkanı.

– Excel dosyasındaki mail adreslerini okuyabilme.

– Oluşturduğu kişi listesini ve hesabı kaydebilme.

Ben programda bu bilgileri kaydetmek için XML dosyası kullandım, çok kararsız kaldım Access mi yoksa XML mi kullanayım diye ama sonra XML formatınıda bilmediğim için XML kullandım. Bu dosya formatını öğrenirken Burak Selim Şenyurt hocanın buradaki makalesi bana gerçekten çok yardımcı oldu. Öncelikle programın ‘Hesap Tanımla’ menüsünden bahsetmek istiyorum; Hesap tanımla işlemi için gerekli olan bilgileri kullanıcı ekrandan girmesini istiyoruz, bu bilgiler; -‘Hesap Adı’, -‘Mail Adresi’, -‘Şifresi’, -‘SMTP Server Adresi’, -‘Port Numarası’ ve -‘SSL’ bilgisi, bu bilgileri aldıktan sonra XML dosyamıza Hesap isimli boğum ile kaydediyoruz.

Birde ‘Hızlı Ayar’ kısmı var, burada eğer hotmail, gmail veya yahoo mail hesabını ekleyecekse ve kullanıcı smtp server adresini bilmiyorsa otomatik olarak yazılıyor. Hesap Ekle butonunda yapılacak görevler;

– Giriş Kontrol,

– Hesap Ekle,

– Girilen bilgileri temizle.

Bu işlemler yapıldıktan sonra kullanıcı artık bir mail hesabı tanımlamış oluyor, ana sayfadan mail göndereceği zaman istediği mail hesabını seçerek mailini gönderebilir.

İkinci menümüz ise tanımladığımız hesapları düzenleyecemiz menü;

Daha önceden tanımladığımız hesaplar üzerinde değişiklik yapabildiğimizi menü. Eğer mail adresimizin şifresini değiştirdiysek veya mail adresimizi yanlış yazdığımızı fark ettiysek bu menüden düzenleme yapabileceğiz. Ayrıca artık o mail hesabını kullanmıyorsak yine bu menüden hesabımızı silebiliyoruz. Sol tarafta ise eklemiş olduğumuz hesapları görebiliyoruz, buradan seçtiğimiz hesap bilgilerini sağ tarafta görebiliriz. Programda kullandığım 2 tane sınıf var bunlar; Hesap ve KisiListesi isminde bunları aşağıda detaylı bir biçimde açıklayacağım, birde bu ekleme-silme-güncelleme-bilgileri alma işlemleri için XmlYonetici sınıfı tanımladım bu sınıf Burak Selim Şenyurt hocanın kullandığı sınıfın bizim programımıza göre düzenlenmiş hali. Burak hocanın kullandığı yöntemden yola çıkarak güzel bir Xml veritabanı oluşturduk. İleride bu 3 sınıfı da detaylı bir şekilde anlatacağım;

Bir sonraki menümüz ise kişi listesini oluşturacağımız menü. Bu menüden kişi listemizi ister bir Excel tablosundan istersek dosyadan okuyabiliriz. Excel’den dosyaları okumak için ‘OleDbConnection’ sınıfından faydalandım. Burada takıldığım noktalardan biri mail adresleri hangi çalışma sayfasındaydı. Bu problemi kullanıcıya sorarak geçtim. Excel tablosundan ‘Ekle’ dediği zaman bir form çıkacak ve kullanıcıya maillerin hangi çalışma tablosunda olacağını soracaktı. Bu bilgiyide alarak aşağıdaki kod satırı ile Excel dosyasından mail adreslerini rahatlıkla aldım;

OleDbConnection baglanti = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + openFile.FileName + ";Extended Properties=Excel 8.0;");
baglanti.Open();
string sorgu = "SELECT * FROM [" + frm.tabloAdi + "$]";
OleDbDataAdapter data_adp = new OleDbDataAdapter(sorgu, baglanti);
DataTable mailTablo = new DataTable();
data_adp.Fill(mailTablo);
 
int test = mailTablo.Columns[1].MaxLength;
 
foreach (DataRow row in mailTablo.Rows)
{
   foreach (DataColumn column in mailTablo.Columns)
   {
      if (row[column] != System.DBNull.Value)
      {
         if (mailAdresKontrol((string)row[column]))
         {
            mailList_lb.Items.Add((string)row[column]);
         }
      }
   }
}
baglanti.Close();

Eğer kullanıcı bir txt’den okuma yapacaksa maillerinin arasına bir boşluk bırakması veya her maili ; işareti ile bitirmesi yeterli olacak. Biz dosyadan okuduğumuz yazıyı dizilere böldük, ardından da dizi elemanlarına baktık hangisi bizim mail formatımıza uyuyor. Mail formatımız ise @ işaretinden sonra bir tane . işareti olmak zorunda.

Dosyadan mail adresi almak için;

FileStream fs = new FileStream(openFile.FileName, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs);
 
string[] mailAdres = sr.ReadToEnd().Split(new char[] { ';', ' ', '\r', '\n' });
foreach (string adres in mailAdres)
{
   if (mailAdresKontrol(adres))
   {
      mailList_lb.Items.Add(adres);
   }
}

Kişi listelerini dosyadan okudunktan sonra ‘Kişi Listesini Oluştur’ butonu ile kişi listesini XML dosyamıza kaydediyoruz.

Kişi Listesini Oluştur butonu;

private void kisiListesiKayit_btn_Click(object sender, EventArgs e)
{
   if (!GirisKontrol())
   { return; }
   else
   {
      string[] mailList = new string[mailList_lb.Items.Count];
      for (int i = 0; i < mailList_lb.Items.Count; i++)
      { mailList[i] = (string)mailList_lb.Items[i]; }
      xmlYonetici.KisiListesiEkle(xmlYonetici.KisiListesiEnBuyukId() + 1, kisiListesiAdi_tb.Text, mailList);
   }
   MessageBox.Show("Kişi Listesi Başarıyla Oluşturuldu!", "www.burakozkan.net", MessageBoxButtons.OK, MessageBoxIcon.Information);
   Temizle();
}

Son menümüz oluşturduğumuz kişi listelerini düzenleyeceğimiz menü. Bu menüde oluşturduğumuz kişi listesinin adını değiştirebiliriz, mail listesinden biriniz çıkartıp ekleyebiliriz. Hesap düzenleme menüsüne çok benzer bir yapıya sahip, yine sol tarafta daha önceden tanımlamış olduğumuz kişi listelerinin adları sol taraftaki Listbox’da görebiliyoruz.

Ve ana menü. Ana menüde yapacağımız işlemler şunlar; kullanıcı önceden tanımlamış olduğu kişi listesini veya listelerini ekleyebilir ya da tek tek mail adreslerini ekleyerek de mail gönderebilir. Mailine isterse bir dosya ekleyebilir, kişi listesini belirledikten sonra ‘GÖNDER’ butonunu kullanarak belirlediği adreslere mailini gönderebilir;

Gönder butonu;

private void gonder_btn_Click(object sender, EventArgs e)
{
   MailMessage MailGonder = new MailMessage();
   MailGonder.From = new MailAddress(((Hesap)hesapAdi_cb.SelectedItem).MailAdresi);
 
   for (int i = 0; i < mailList_lb.Items.Count; i++)
   {
      MailGonder.To.Add((string)mailList_lb.Items[i]);
   }
   MailGonder.Subject = konu_tb.Text;
   Attachment data = new Attachment(openFile.FileName);
   MailGonder.Attachments.Add(data);
   MailGonder.Priority = MailPriority.High;
   MailGonder.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
   MailGonder.Body = mesaj_rtb.Text;
   SmtpClient Yolla = new SmtpClient();
   Yolla.SendCompleted += new SendCompletedEventHandler(Yolla_SendCompleted);
   Yolla.Credentials = new System.Net.NetworkCredential(((Hesap)hesapAdi_cb.SelectedItem).MailAdresi,
                                                        ((Hesap)hesapAdi_cb.SelectedItem).MailSifresi);
   Yolla.Host = ((Hesap)hesapAdi_cb.SelectedItem).ServerAdres;
   Yolla.Timeout = 5000;
   Yolla.DeliveryMethod = SmtpDeliveryMethod.Network;
   Yolla.Port = ((Hesap)hesapAdi_cb.SelectedItem).Port;
   Yolla.EnableSsl = ((Hesap)hesapAdi_cb.SelectedItem).SSL;
   siteAdres_tssl.Text = "Mail Gönderiliyor...";
   siteAdres_tssl.BackColor = Color.Yellow;
   gonder_btn.Enabled = false;
   this.Refresh();
   Yolla.SendAsync(MailGonder, "Mail Gönderiliyor...");
}

Yukarıda söylediğim Hesap ve KisiListesi sınıfını açıklamak istiyorum. Hesap sınıfının yapısı;

class Hesap
{
   #region Alanlar(Fields)
   private int m_id;
   private string m_hesapAdi;
   private string m_mailAdresi;
   private string m_mailSifresi;
   private string m_smtpServer;
   private int m_port;
   private bool m_ssl;
   #endregion
 
   #region Özellikler(Properties)
   public int Id
   {
      get { return m_id; }
      set { m_id = value; }
   }
   public string HesapAdi
   {
      get { return m_hesapAdi; }
      set { m_hesapAdi = value; }
   }
   public string MailAdresi
   {
      get { return m_mailAdresi; }
      set { m_mailAdresi = value; }
   }
   public string MailSifresi
   {
      get { return m_mailSifresi; }
      set { m_mailSifresi = value; }
   }
   public string ServerAdres
   {
      get { return m_smtpServer; }
      set { m_smtpServer = value; }
   }
   public int Port
   {
      get { return m_port; }
      set { m_port = value; }
   }
   public bool SSL
   {
      get { return m_ssl; }
      set { m_ssl = value; }
   }
   #endregion
 
   public Hesap(int id, string hesapAdi, string mailAdres, string mailSifresi, string mailServer, int port, bool ssl)
   {
      Id = id;
      HesapAdi = hesapAdi;
      MailAdresi = mailAdres;
      MailSifresi = mailSifresi;
      ServerAdres = mailServer;
      Port = port;
      SSL = ssl;
   }
 
   public override string ToString()
   { return HesapAdi; }
}

Bir diğer sınıfımızda KisiListesi sınıfı, bu sınıfta yine Hesap sınıfı gibi kullanıcı kişi listesi oluşturmak için gerekli olan bilgileri alan değişkenlere sahip. Sınıfın yapısı;

class KisiListesi
{
   #region Alanlar(Fields)
   private int m_id;
   private string m_kisiListeAdi;
   private string[] m_kisiler;
   #endregion
 
   #region Özellikler(Properties)
   public int Id
   {
      get { return m_id; }
      set { m_id = value; }
   }
   public string KisiListesiAdi
   {
      get { return m_kisiListeAdi; }
      set { m_kisiListeAdi = value; }
   }
   public string[] MailListesi
   {
      get { return m_kisiler; }
      set { m_kisiler = value; }
   }
   #endregion
 
   public KisiListesi(int id, string kisiListesiAdi, string[] mailListesi)
   {
      Id = id;
      KisiListesiAdi = kisiListesiAdi;
      MailListesi = mailListesi;
   }
 
   public override string ToString()
   { return KisiListesiAdi; }
}

Kişi listesi oluşturmak için; -Mail listesi, -Kişi Listesinin Adı ve -ID gereklidir, .ToString() fonksiyonuda aynı Hesap sınıfında olduğu gibi Combobox, Listbox gibi elemanların .Items.Add(…) kısmına yazınca kişi listesinin adının gözükmesi için override edilmiştir.

Programı çok detaylı test etme imkanım olmadı, eksikleri ve hataları varsa şimdiden affınıza sığınıyorum. Programı kendi isteğinize göre güncelleyebilirsiniz. Programı buradan, kaynak kodlarını  ‘Download’ menüsünden indirebilirsiniz. Her türlü fikir ve eleştirilerinizi bekliyorum. Umarım kendinize faydalı birşeyler bulabilirsiniz… Başka bir Ayın Konusunda görüşmek üzere..

Programdan birkaç görüntü;

Hepinize kolay gelsin, Iyi çalışmalar…

Ayın Konusu: C# ile Windows Formuna Login Girişi!’ Makalesinin Programı

Başlık için aslında ayın konusu değil programı demek daha doğru olur ama böyle başladı böyle devam etsin diye düşündüm :).  Ağustos ayının son günü ilan ettiğim ‘Eylül Ayında Sitemde!‘ yazısındaki program ve makalelerin birini daha buraya ekleyerek şuan için sözümü tutduğum için çok mutluyum, umarım bu sistemin devamlılığını sağlayabilirim. Arkadaşlar daha önce yazmış olduğum ‘C# ile Windows Formuna Login Girişi!‘ makalesinin programını sitemin ‘Download’ bölümünden ve buradan indirebilirsiniz. Kodu düzenlerken makalede ufak birkaç değişiklik yaptım, tekrar gözden geçirmenizde fayda var. ‘Kullanıcı Ekle’ formunda ve ‘up_KullaniciEkle’ stored procedure’da değişikliklik oldu. Umarım sizler için faydalı olur..

Kolay gelsin, iyi çalışmarlar…

NOT: Programın Settings kısmından ConnectionString kısmını kendi veritabanınıza göre değiştirmeyi unutmayın!

Ayın Konusu: Programımız Için ‘Live Update’ Programı!

Norton’nun ‘Live Update’ programını ya da Nokia’nın ‘Software Updater’ programını ve birçok programın bu tarz update programlarını görmüşsünüzdür. Bu tür programlar ana programdan bağımsız çalışırlar ve asıl iş yapan programı update ederler. Bizde kendi yaptığımız programa bu tür bir uygulama yapabiliriz. Yeni bir versiyon çıkarttığımızda kullanıcı yaptığımız update programını kullanarak çok rahat bir şekilde internetten update işlemini yapabilir. Şimdi biraz bu işlemi nasıl gerçekleştireceğiz onu konuşalım;

Öncelikle ana programımız internette bizim hazırladığımız bir txt dosyasından güncel versiyonu okuyup karşılaştırma yapması lazım, örnek vermek gerekirse bizim programımız v2.00 ise ve biz yeni versiyon v2.01 çıkartıyorsak bunu algılamamız lazım ana programda. Bunu istersek biz belirli aralıklarla kullanıcı fark etmeden, programımızı anti-virus yazılımı ile engellemediyse gizli olarak da yapabiliriz veya kullanıcı için ‘Güncelleştirme Kontrol’ butonu koyarak kullanıcının insiyatifinede bırakabiliriz. Ana programın yapması gerekenler bunlar. Peki update programı;

Ben adına ‘Live Update’ dediğim programda öncelikle yeni versiyonda indirilmesi gereken dosyaları tespit ediyorum, örneğin uygulamamız bir .jpg, .gif, .mdb, .dll, .txt vb. farklı türlerde dosya içerebilir, bunların hangilerinin değiştiği veya ekleneceğini tespit etmemiz lazım. Dosyaları tespit ettikden sonra sırasıyla hepsini exe’nin yanına bir temp klasörünün içine indiriyoruz, hemen hatırlatalım indirilecek dosyaları tespit ederken nereye kopyalanacağınıda belirtelim ki ileride bir sorun çıkmasın.  Dosyaları tespit edeceğimiz örnek bir .txt dosyası;

[Kopyalanacak Klasor Adı]*[Dosya Adı]*[Internetdeki Klasor] —> [istanbul] [KizKulesi.jpg] [resim]

Burayı açıklamak gerekirse ilk parametre ana programın yanında hangi klasör’e kopyalanacağını temsil ediyor, biz eğer dosyadan okuma işlemi yapıyorsak klasör adı bizim için çok önemli. Ikinci parametre ise dosyanın adı ve son parametre internetdeki klasörün adını veriyoruz yani ‘KizKulesi.jpg’ dosyası; www.burakozkan.net/updateDeneme/resim/KizKulesi.jpg adresinde. Bu dosyanın en sonuna ana programımızı yazıyoruz, tüm ek dosyalar indirildikten sonra ana programı da yazarak update işlemini tamamlamış oluyoruz.

Ben sizler için bir tane update edilebilir ‘Değerlerimiz’ ve ‘Değerlerimiz Live Update’ ismini verdiğim iki program yaptım, buradan indirdiğiniz program update edilebilir bir programdır. Indirdikten sonra ki yenilikleri fark edeceğinizden şüphem yok :), toplam 4 tane yenilik var bakalım hepsini kim fark edecek :).

Programdan Resimler;

Update edilebilir uygulamayı buradan indirebilirsiniz. Programın kaynak kodları ‘Download’ menüsünde mevcutdur.

Herkese kolay gelsin, iyi çalışmalar…

Hotmail POP3 ile Mail Gönderimi!

Herkese merhabalar, arkadaşlar daha önceden gmail ile mail gönderme isimli bir yazı yazmıştım, bunun hotmail versiyonunu yazmak istedim. Aslında bunu şöyle genelleyebiliriz, pop3 desteği veren tüm mailleriniz ile C# üzerinden sorunsuz bir şekilde veri gönderebilirsiniz. Aşağıda pop3 ayarları ve kod parçacığını veriyorum umarım faydalı olur.

Kod Parçacığı;

MailMessage MailYolla = new MailMessage();

MailYolla.From = new MailAddress("[mail adresiniz]@hotmail.com");
MailYolla.To.Add("[mail adresiniz]@hotmail.com");
MailYolla.Subject = "Deneme Maili";
MailYolla.Priority = MailPriority.High;
MailYolla.Body = "www.burakozkan.net deneme maili.";

SmtpClient Yolla = new SmtpClient();
Yolla.SendCompleted += new SendCompletedEventHandler(Yolla_SendCompleted);
Yolla.Credentials = new System.Net.NetworkCredential("[mail adresiniz]@hotmail.com", "[mail adresinizin şifresi]");
Yolla.Host = "smtp.live.com";
Yolla.Timeout = 50000;
Yolla.Port = 587;
Yolla.EnableSsl = true;

string userState = "Mail Gönderiliyor";Yolla.SendAsync(MailYolla, userState);

private void Yolla_SendCompleted(object sender, AsyncCompletedEventArgs e)
{
   string Durum = (string)e.UserState;
   if (e.Cancelled == true)
   {
      MessageBox.Show("Mail Gönderimi İptal Edildi");
   }
   if (e.Error != null)
   {
      MessageBox.Show("Mail Gönderilemiyor: " + e.Error.ToString());
   }
   else
   { MessageBox.Show("Mail Gönderildi");   }
}

Pop3 Ayarları;

POP server: pop3.live.com (Port 995)
POP SSL required? Evet
User name: Windows Live ID yazınız,  [email protected]
Password: Mail adresinizin şifresi
SMTP server: smtp.live.com (Port 25)  // Türk Telekom bu port’u kapattığı için biz 587 port numarasını kullanmalıyız.
Authentication required? Evet
TLS/SSL required? Evet

Detaylı bilgi burada

Hepinize kolay gelsin, iyi çalışmalar…

 Scroll to top