22 Temmuz 2016 Cuma

C# Kodu ile GMail Hesabı Üzerinden Excel Dosyasında Kayıtlı Kişilere Mail Gönderme

Visual Studio 2013 Yazılım Platformunda C# Koduyla GMail Hesabı Üzerinden Excel Dosyasında Kayıtlı Kişilere eMail Yollama:

visual studio'dan excele bağlanmak için veritabanına bağlanır gibi bir connect string yazmamız gerekir. Bunun için ilk önce, c# kod sayfasında kullanılmak üzere yer alan kütüphanelerin olduğu kısıma System.Net.Mail ve System.IO kütüphanelerini eklememiz gerekir.

EXCEL'den C# 'a VERİ AKTARIMI:

 OleDbConnection baglanti = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + txtDosyaYolu.Text.Trim() + "; Extended Properties='Excel 12.0 xml;HDR=YES;'"); // baglanti olarak tanımladığımız bu connection nesnesi ile visual studio üzerinden excel'e bağlanıyoruz.
             
baglanti.Open();// bağlantımızı açıyoruz.

OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [Sayfa1$]", baglanti);//da ile tanımladığımız dataAdapter nesnesi ile excelin belirli bir sayfasındaki veri tablosuna ulaşıyoruz. Tıpkı veritabanı tablo sorgulmalarındaki gibi... burada dikkat edilmesi gereken nokta excel dökümanımızda ulaşmak istediğimiz sayfanın ismidir, sonradan değiştirilmemişse default adı Sayfa1 olmalıdır. Değiştirilmişse de erişilmek istenen sayfanın ismi select sorgusuna girilmelidr, tıpkı veritabanı select sorgularındaki tablo isimleri gibi... excelde her sayfa bir tablo görevi görmektedir.

DataTable dt = new DataTable();// da ile tanımlı dataAdapter nesnesi ile gelen verileri dt diye bir dataTable'a aktarmamız gerekiyor. Böylece excel sayfasından gelen veriler kod bazında sanal tablo halini almış olacaktır.

da.Fill(dt);// burada dt ile tutmuş olduğumuz verileri dataAdapter nesnesine yüklüyoruz.

dataGridView1.DataSource = dt.DefaultView;//burada dt ile tutmuş olduğumuz sayfa verilerini uygulamanın form diye adlandırılan tasarım kısmında görüntülenmesini sağlamak için forma eklemiş olduğumuz dataGridView1 nesnesine yüklüyoruz. böylece uygulamayı çalıştırdığımızda excel sayfasından çektiğimiz veriler bir veritabanı tablosu şeklinde tasarım formumuzda listelenecektir.

 baglanti.Close();//burada önceden açmış olduğumuz c#-excel bağlanma nesnesini disable ediyoruz.
-------------------------------------------------------------------------------------------------------------------------
EXCEL SAYFASINDA YER ALAN TÜM KİŞİLERE AYNI ANDA MAİL GÖNDERME:
try
{

  SmtpClient client = new SmtpClient("smtp.gmail.com", 587);//burada gmail client configürasyonu ayarlarını yaptık.
  string[,] dataValue = new string[dataGridView1.Rows.Count, dataGridView1.Columns.Count];//burada dataValue diye iki boyutlu bir dizi yaratarak excel sayfasından gelen data tablosunun satır ve sütun sayısını aldık.
             
         
               foreach (DataGridViewRow row in dataGridView1.Rows)//tablonun tüm satırlarını teker teker dolaşır..
                {
                    if (row.IsNewRow) continue;// satırlar devam ettiği sürece aynı işlemlere devam edecektir.  
               
                             using (StreamReader reader = File.OpenText(txtFormatYolu.Text.Trim()))//burada complex bir mail göndermek adına önceden hazırlamış olduğumuz txt dosyasındaki html sayfa tasarım kodlarını okutuyorz zira txt dosyasındaki html tasarım kodları bizim mesajın gövdesini oluşturmuş olacaktır, tasarımda html kodları ile yapabildiğimiz tablo image link vb yer almaktadır. tasarım mailimize zenginlik kazandıracaktır.
                             {

                                 MailMessage mesaj = new MailMessage();//burada mesaj adında mail nesnesini oluşturuyoruz.
                                 mesaj.To.Add(dataGridView1.Rows[row.Index].Cells[2].Value.ToString());//burada excel dosyasından çektiğimiz mailin kime gidecek ise onların mail adresleri döngü devam ettiğince sırayla art arda mesaj.To.Add(); kısmında yerini alacaktır.
                                 mesaj.From = new MailAddress(txtGondericiGMailAdres.Text);//burada kendi mail adresimizi giriyoruz.
                                 mesaj.Subject = txtKonu.Text;//burada gönderilecek mailin başlık ya da konu kısmını oluşturacak satırı giriyoruz.
                                 mesaj.IsBodyHtml = true;
                                 mesaj.Body = "Sayın" + " " + dataGridView1.Rows[row.Index].Cells[0].Value.ToString() + " " + dataGridView1.Rows[row.Index].Cells[1].Value.ToString() + " ,";
                                 mesaj.Body += Environment.NewLine + "\n";
                                 mesaj.Body += richTextBox1.Text;//gönderilecek mailin gövdesini oluşturacak olan mesajı tasarım formumuza eklemiş olduğumuz richTextBox1 nesnesinden okuyacaktır.
                                 mesaj.Body += reader.ReadToEnd();// burada gönderilecek mailin devamını veya alt tasarım kısmını oluşturacak olan txt dosyasından gelen html kodlar okunur.
                                 NetworkCredential guvenlik = new NetworkCredential(txtGondericiGMailAdres.Text, txtGondericiGMailSifre.Text);//burada ise kendi mail hesabımıza giriş yaparken kullandığımız kullancıIsmi ile kullanıcıSifresi yer almaktadır.
                                 client.Credentials = guvenlik;
                                 client.EnableSsl = true;//mail server güvenliğini aktif hale getiriyoruz.
                                 client.Send(mesaj);//mesajımızı gönderiyoruz.
                             
                             }
                    }
               progressBar1.Value = 100;
               MessageBox.Show("Mail Tüm Listedekilere Başarıyla Gönderildi...");
               progressBar1.Value = 0;
                }
            catch
            {
                // MessageBox.Show("Mail Gönderme Başarısız.", "Mail Gönderme");
                MessageBox.Show("Mail Tüm Listedekilere Gönderilemedi..!");

            }

Jasper Report ve IReport Kullanımı



IReportta SQL Sorgu Yazmak:

IReport içinde tanımlamış olduğunuz SQL sorgusuna göre veritabanından field çeker. Ancak siz bu SQL sorgusunu istediğiniz zaman değiştirerek getirmeyi unuttuğunuz farklı fieldları getirebilir ve ona göre raporunuzu güncelleyebilirsiniz , bunu yapmak için 'Designer' , 'XML', 'Preview' sekmelerinin yanındaki üstüste konmuş diskleri andıran sembole tıkladığınızda SQL editörü çıkmaktadır ve IReporta projesini ilk oluşturduğunuzdaki SQL sorguyu göreceksiniz. İşte o sorguyu her güncellediğinizde projenizi de güncellemiş olursunuz yazacağınız yeni sorgulara göre veritabanından istediğiniz alanları getirerek forma ekleyeblirsiniz.


IReportta SQL'e Bağlı Parametre Kullanımı (Field'a Göre Filtreleme):

IReportta veritabanınızdan gelecek bir alan adına göre filtreleme yapmak isteyebilirsiniz. Mesela veritabanınızdaki öğrenciler tablosundan gelen verileri isme göre öğrencilerin notlarını veya kişisel bilgilerini listelemek isteyebilirsiniz. Bunun için önceki konularda anlattığım gibi parametre oluşturarak oluşturduğumuz parametrenin adını 'ogradi' koyalim, ardından IReporttaki SQL sorgumuzu açarak SELECT  * FROM ogrenci   WHERE ogradi=$P{ogradi} diye güncellediimizde raporu IReporttan her Preview ettiğimizde program bize kayıtları hangi öğrenci adına göre listelemek istediğimizi soracaktır. biz de kimin adını girersek, diyelim ki "Mehmet" girersek sınıftaki tüm Mehmet adındaki öğreincilerin bilgileri raporda listelenecektir.




IReportta Dinamik İmage Ekleme:

İReportta yazdığınız SQL sorgusuna göre bazen rapora eklediğiniz image ların değişken olmasını isteğebilirsiniz. Şöyle ki, SQL sorgunuzda boolean tanımlı fieldları kullanıyor olabilirsiniz. Ve tablodan '1' değeri okunduğunda raporda "ok" işaretli image görünsün, tablodan '0' değeri okunduğunda ise, ya boş gelsin ya da "no" işaretli imagenin görünmesini istiyorsunuz. Bunun IReportta çok basit yolu var: İlk önce IReport programının Report Elements kısmından image nesnesini forma eklemek istediğimiz yere sürükleyerek bırakıyoruz. Zaten bu işlemi yaptığımızda program bize hangi image i yüklemek istediğimize dair bize bir seçim penceresi getiriyor, oradan image i seçiyoruz, ardından seçtiğimiz image nin properties kısmındaki özelliklerden "image expression" özelliği karşısındaki üç noktalı butona tıklıyoruz ve karşımıza gelen pencerede consol gibi yazı yazılan kısma $F{field_adi}.intValue()== 1 ? "ok.png" : "no.png" formülünü ekliyoruz. Burada '0' veya '1' hangi filedtan gelecekse o field in ismini yazıyoruz, daha sonra field benim örneğime göre int olarak tanımlanmış ancak siz field i veritabanında "bool" olarak tanımlamışsanız veri tipini karşıdaki pencereden ona göre ayarlamanız gerekmektedir. yazı yazılan yerde field yeşil renk olduğunda hata yapmamışsınız demektir, field isminin rengi kırmızı ise bir yerde sorun var demektir ya veri tipindedir ya da syntax tadır ona göre kontrol etmeniz gerekmektedir. Ayrıca aşağıdaki pencerelerden field ismi veya veritipine çift tıkladığınızda ya da birini seçerek diğerine çift tıkladığınızda ikisinin de yazı penceresine basıldığını göreceksiniz, yani baştan yazmanıza da gerek yok.



Jasper Report ve IReport Kullanımı


IReportta Parametre Kullanımı:

IReportta parametre kullanımının amacı, raporda kullanılacak nesneleri referans göstermektir. Mesela ana reporta sub report eklediğimizde ana reportun sub reportu görebilmesi için iki taraflı aynı adla parametre tanımlanmış olması gerekir. IReport programının Report Inspector penceresi altında yer alan parameters sekmesine tıkladığımızda altta IReportun kullandığı parametreler listelenecektir. Parameters sekmesine sağ tıklayarak Ad Parameters diyoruz. Ardından en alta oluşan parameter1 sekmesine yine sağ tıklayarak Rename özelliğinden "bagla" diye parametre ismi verdiğimizi varsayalım. Ana rapor için oluşturduğumuz "bagla" parametresi ile sub reporta bağlanmaya çalışacağız. Bunun için ana reportun design formuna eklemiş olduğumuz sub report nesnesine tıklayarak onun properties penceresindeki parameters sekmesine tıklayalım. O penceredeki parameters sekmesinin karşısındaki 3 noktalı düğmeye tıkladığımızda karşımıza $P{SUBREPORT_DIR} adında bir pencere açılacaktır. Pencerenin sağ alt tarafında yer alan "Copy From Master" butonuna tıkladığımızda sub reporta bağlanmak için oluşturmuş olduğumuz "bagla" parametresi gelecektir. Ardından Ok diyerek parametremizi ana repordaki sub report nesnesine bağlamış oluyoruz. Tüm bu işlemleri yaptıktan sonra bu sefer de sub reportun olduğu formu açarak aynı şekilde "bagla" diye aynı isimle Report Inspector penceresindeki parameters kısmına sağ tıklayarak yeni bir parametre oluşturuyoruz. Burada oluşturduğumuz bu aynı parametre sub reportu karşılıklı olarak ana rapora bağlamış olacaktır.

IReport Field Gruplama:

Bazen tabloları veya veritabanından çektiğiniz kayıtları yine veritabanından çekmiş olduğunuz bir alan adı altında listelemek veya gruplamak isteyebilirsiniz. Bu işlemi yapmak için IReport progamı arayüzündeki Report Inspector penceresindeki proje adına sağ tıklayarak Ad Report Group diyoruz. Ardından New group wizard penceresi karşımıza gelecektir. Group Name altına verilerinizi hangi alan adı altında gruplamak istiyorsanız o alanın adını verirseniz daha mantıklı olur. Çünkü daha sonra  "Group by the following report object" altında veri gruplaması yapacağınız veritabanından gelen fieldlerden bir field adını seçmeniz gerekecektir. o yüzden field adı ile group name adı aynı olursa amacın ne olduğu belli olacağından daha mantıklı olur. Bu işlemleri yaptıktan sonra next diyerek gruplama işleminin Details diye ikinci aşamasına geçiyoruz. Burada da "Add the group header" ile "Add the group footer" seçenekleri yer almaktadır. verilerinizi raporun neresinde gruplamak istiyorsanız amaca bağlı seçim yapabilirsiniz. Tüm bu işlemleri bitirdikten sonra göreceksiniz ki formunuza verdiğiniz isimle group header ve/veya group footer oluşacaktır. ve o alana eklediğiniz fieldlar altında diğer verileriniz listeleniyor olacaktır. Örneğin; group header adına username demişsek ve group header a $F{username} fieldini eklemişsek veritabanından gelen her username adı altında ona ait bilgileri listeleyebiliyor olacaksınız tabi bu da yazacağınız sql sorgunuza bağlıdır.

      


Jasper Report ve IReport Kullanımı


IReportta Sub Report Oluşturma:

Sub Report oluşturma amacı rapor niteliğine göre veritabanından çekilen fields lara bağlıdır. Bu da ayrı bir SQL sorgu yazdırmayı gerektireceği için ana rapor altında paletteden sürükle-bırak mantığıyla sub report nesnesi oluşturmamız gerekir. Böylece sub report oluşturma sihirbazı sayesinde ayrı bir sql sorgu yazabilirsiniz. Sub report nesnesi oluşturma sihirbazında 7 aşama vardır ilk aşamada yeni oluşturduğunuz rapor için yeni bir sql yazmak istiyorsanız, "create a new report" u seçiyorsunuz. Önceden oluşturmuş olduğunuz bir sub rapora bağlamak istiyorsanız, "Use an existing report" u seçiyorsunuz. Sub report oluştururken kaynak dosyaların salt kendi pc nizde konumlanmasını yani path belirterek rapor oluşturmak istemiyorsanız, "Just create sub report element" seçeneğini seçmeniz gerekmektedir.( Bu seçenek değişken tanımlama konusudur). Bu saydığımız seçeneklerden birini seçtikten sonra Layout kısmında raporda kullanmak istediğiniz temalar soruluyor, o temalardan işinize yarayacak bir tema seçerek next diyebilirsiniz. 3. aşamada sql query aşmasıdır. buraya veritabanından çekerek raporda göstermek istediğiniz veya kullanmak istediğiniz fieldlara göre sql sorgumuzu yazabiliriz. 4. aşamada önceki şamada yazdığınız sql sorgunun fieldsları gelecektir formda hangi fieldsleri kullanacaksanız o field ları karşı listbox a atarak tekrar fields eleme hakkınız vardır. 5. aşamada ise aynen sql sorgulardaki group by mantığına göre kayıtlarınızı bir field adı altında gruplayabilirsiniz ama zorunlu değildir tabi. 6. ve bana göre konunun en canalıcı aşması burada yer alıyor. Report Name: doğal olarak sub reportunuzun ismidir buraya isim vererek geçelim.Location: oluşturulacak sub report jrxml dosyasının konumunu belirtir ki bu yolu değiştirmemenizi tavsiye ederim zaten progam otomatik olarak dosyayı diğer ana jrxml dosyasının yeraldığı klasörde oluşturacaktır. yolu değiştirirseniz ana report sub rebortu görmeyebilir. File kısmını da değiştirmeyiniz. orası da jrxml dosyasının adı ile birlikte konumunu belirtir. Şimdi gelelim aşağıdaki iki seçeneğe: Store the directory name in a parameter seçeneği size sub report daha sonra ana report tan kolayca çağırabilmeniz için bir $P{SUBREPORT_DIR} diye bir parametre oluşturacaktır. bunun önemi de oluşturduğunuz raporu ireport kurulu veya java tabanlı rapor okuyucu düzenleyici kurulu başka bir bilgisayar üzerinden açmak istediğinizde başka bilgisayarda path hatası yaşamadan kendi pc nizde oluşturuyor olduğunuz bu raporu kullanabileceksiniz. ancak öyle bir durum yoksa raporu sadece kendi sisteminizde kullanacaksanız o zaman bir alt seçenek olan Use a static absolute path reference seçeneğini seçebilirsiniz. 7. ve son aşamada ilk seçenek olan use the same connection used to fill the master report seçeneğini seçebilirsiniz.


Jasper Report ve IReport Kullanımı


IREPORT KURULUMU:

   İReportu kurmak için JDK'ya ihtiyacımız vardır. JDK'yı indirdikten sonra İReport programını kurarız. Programı kurduktan sonra programı kurarken dosyaları nereye atacağını belirttiğiniz klasöre gidiyoruz. Kurulum sırasında path'ini değiştirmediyseniz diğer programlar gibi default olarak sistemin program files klasörüne atar. Dolayısıyla kurulum bittikten sonra program files klasörüne giderek jasperSoft veya ireport klasörünü bularak içine giriyoruz. Klasörün içinde etc diye bir klasör yer alıyor olmalı, o klasörün de içine girerek programın konfigürasyon dosyası olan klasörün içindeki ireport.conf dosyasını notepad++ ve benzeri programlarda açıyoruz. Dosyanın içerisinde #jdkhome="/path/to/jdk" diye sistem yolu göreceksiniz. # işareti olmaksızın bu path'i kopyalayarak enter ile bir alt satıra iniyoruz ve bir alt boş satıra yapıştırıyoruz. daha sonra önceden indirmiş olduğumuz JDK sürümünün Java adı altındaki klasöründen bularak JDK sürümünün yer aldığı klasörün yolunu pencerenin üst adres satırından kopyalıyarak jdkhome="" yapıştırıyoruz.(örnek:jdkhome="C:\Program Files\Java\jdk1.7.0_79") daha sonra dosya üzerinde yaptığımız bu değişikiliği kaydediyoruz. Ama değişikliğin kaydedilebilmesi için ireport.conf dosyasını masaüstüne attıktan sonra üzerinde değişiklik yapmak üzere notepad++ da açıyoruz. değişikliği kaydettikten sonra da dosyayı etc klasörünün içine tekrar atıyoruz.Sonra da ireportun masaüstündeki ikonuna tıklıyoruz program kesinlikle çalışacaktır. Bu işlemlerden sonra hala çalışmama durumunun tek bir sebebi daha olabilir o da JDK sürümü ile uyumsuzluk yaşıyor olmasındandır.