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…

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

    Bir cevap yazın

    Your email address will not be published. Please enter your name, email and a comment.