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…

Paylaş:
28 Responses to Ayın Konusu: ‘C# ile Toplu Mail Gönderme Programı ve Anlatımı!’
  1. Hy

    Thread.Sleep(süre milisaniye cinsinden ) ile bekletebilirsiniz.

  2. Mehmet KAYA

    Toplu gönderimde gmail limiti var bunu nasıl aşabiliriz her gönderimde nasıl uykuya alabiliriz sistemi

  3. TOLGA

    xml dosyası hata veriyor? An error occurred while signing: ‘Failed to sign …\TopluMailGönderme.exe. SignTool Error: ISignCode::Sign returned error: 0x80880253 The signer’s certificate is not valid for signing.’

  4. Burak

    Merhabalar,

    Şişmeler olacaktır derken neyi kastediyorsunuz? Kendiniz yazmak istemiyorsanız elbette eposta pazarlama platformlarını kullanabilirsiniz.

  5. atakan

    selamlar,
    programda toplu gönderim yaparken şişmeler olacaktır muhtemelen. Bu nasıl aşılabilir *?
    Yoksa e posta pazarlama platformlarını kullanmaya devam mı etmeliyiz ?
    http://www.graphicmail.com.tr

  6. ramazan

    Merhaba Burak bey öncelikle program için teşekkürler,emeğinize sağlık.
    Benim sizden ricam mailing’in inceliklerinden de biraz bahsetmeniz.Yani kısaca black liste düşmek,yada hazırladığım html mail’i sunucuya nasıl yüklemem gerektiği yada nelere dikkat etmem gerektiği.. Bazı büyük firmaların bu işi nasıl yaptığını anlamaya çalışıyorum.Yani onlar black liste düşmemeyi nasıl başarıyorlar? Yardımcı olabilirseniz çok sevinirim.. Çalışmalarınızda başarılar…

  7. Burak

    Sitenin iletişim bölümünden bana ulaşabilirsiniz. Elimden geldiğince yardımcı olmaya çalışırım. İyi çalışmalar.

  8. Hasan

    Merhaba ” Burak ÖZKAN ” acaba bana ulaşa bilme ihtimaliniz varmı ?

  9. Mehmet

    Merhaba Öncelikle teşekkür etmek istiyorum böyle bir programı ücretsiz verdiğiniz için.. Geliştirmek adına asıl aradığım bir kaç özellik daha eklemek istiyorum ama programdan anlamıyorum sizden rica etsem.. Program Gmail adresinden gönderdiğinde mailleri bc olarak değilde bcc olarak yani tek bir bireymiş olarak göndermesi ve mailleri 10 sn aralıklarla tek tek göndermesi sağlanabilirmi?

  10. erkan

    burak tek kelimeyle süper,2 haftadır uğraştığım şeydi ve senin sayende 10 dk da bitti imdi..Allah razı olsun ufkun herdaim açık olsun.

  11. Baran

    c# da dişçi programını nasıl yapabiliriz? yol gösterebilirmisiniz lütfen?

    hani dişçilerin hasta kayıtları için oluyomuş ya..
    gelen hasta..adı soyadı
    sorunu..
    yapılan teşhis…
    uygulanan tedavi… gibi şeyler…

  12. Muhammd

    Hesap düzenle formunda seçilen kayıt textboxlara gelmektedir.Herhangi bir kaydı güncellemek istediğimde hata vermektedir.

  13. Muhammd

    bir de şu hata var hata demeyelim de neden hesap bilgilerini .xml üzerinden işlem yapma gereği düşündün access veritabanı sistemi üzerinden yapabilirdin yada xml olarak kaydedilen dosyada şifremizi * şekinde göstertebilirdin.

  14. Muhammd

    Mail gönderdiğimizde mail ilgili mail adresine ulaştığında neden gereksiz kutusuna düşmekte.

  15. HİLAL

    MERHABA BENIM BU PROGRAM HAKKINDA YARDIMA İHTIYACIM VAR YARDIMCI OLUR MUSUNUZ BEN LİSEYE GİDIYOM BU PROGRAMI YAZMAM LAZIM AMA NEYI NEREYE YAZDIĞINIZI ANLAMADIM YARDIMCI OLURSANIZ SEVINIRIM

  16. Mümin

    hocam program çalışmıyor bi bakabilrisniz?

  17. peruk

    bende dosyaları arrıyordum inş. sorun çıkmaz çok yoruldum yaaa

    paylaşım için tşk

  18. Burak

    Programla ilgili tüm dosyaları “Download” bölümünde bulabilirsiniz.

  19. chesh

    programın dosyasını da upload edebilir misiniz?

  20. paealos5

    buy paxil online keyword effects of paxil , viagra super active bottom dweller viagra , kamagra oral jelly kamagra oral gel side effects , buy caverta caverta kamagra caverta pillshoprxcom , buy intagra viagra covered california hmo , buy kamagra soft kamagra suppliers in scotland , buy lovegra online viagra free sites computer find , buy vigora uk viagra supplier .

  21. Samet

    Merhaba Burak ,
    Bu programda kendi mail adresimizi kullanabiliyormuyuz? Yani info@siteadresimiz.com gibi. Smtp servera mail.siteadresimiz.com yazdım ama hata verdi bu konuda bilgi verebilirmisiniz acaba ?

  22. Serdar Kuruca

    Attachment data;
    if (openFile.FileName != null)
    { data = new Attachment(openFile.FileName); }

    MailGonder.Attachments.Add(data);

    Error 1
    Use of unassigned local variable ‘data’

    :((

  23. Burak Özkan

    2. sorunun çözümünü söyleyeyim Form1.cs’nin içinde şöyle bir kod satırı var;
    Attachment data = new Attachment(openFile.FileName);
    bunu şununla değiştirirsen 2. sorun çözülür.
    Attachment data;
    if (openFile.FileName != null)
    { data = new Attachment(openFile.FileName); }

    ama ilk problemi anlayamadım nerede veriyor bu hatayı=? Hangi işlemi yapınca=?

  24. Serdar Kuruca

    Bende yeni ögrenmeye başladım. programınız güzel ama şimdilik şu hataları veriyor.

    1. Xml yöneticisi.cs Beklenmeyen bir dosya sonu oluştu. Aşağıdaki öğeler kapatılmadı: MailList. Satır 7, konum 1.

    kişi listesi.xml olarak c user burak desktop… adresine bakıyor.

    2. eger emaıle dosya eklemezsek filename hatası verıyor.

    Kolay gelsin

  25. Burak Özkan

    Tam olarak ne istediğinizi anlamadım, biraz daha detaylı bilgi verirseniz çok memnun olurum.

  26. deniz

    Slmlar programlama bilmediğim için bu konuda birşeyler yapamıyorum ama hazır varsa elinizde yollabilirmisiniz

  27. Burak Özkan

    Bu kadar kod ve açıklama koymamın karşılığında sizde zahmet edip keşke ‘Program çalışmıyor’ yerine ‘Programda şu işlemi yaparken şu hatayı aldım’ deseydiniz bir çözüm bulabilirdik. Program ticari amaçla yazılmamış sadece bu yorumu yaparak bana bir zararınız olmaz. Eğer amacınız birşeyler öğrenip, bilginizi paylaşmaksa lütfen buraya hatanın detaylarını verin. Ilginiz için teşekkür ederim.

  28. Faruk

    Program çalışmıyor

Bir Cevap Yazın

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