Gerekenler
1 Adet Listwiev
8 Adet Label
4 Adet Textbox
1 Adet Listbox
1 Adet Button
1 Adet Form :D
Fazla Bekletmeden Hemen Dersimize Başlayalım
Önce Formumuzun
Listwiev Ekledikten Sonra 3 Colum Ekleyin veya Kodlan Halledin Sonra
Formun load olayında WebBrowserimizi hotmailin login sayfasına navigate ediyorum.
WebBrowser1.Navigate("http://login.live.com/login.srf?wa=wsignin1.0&rpsnv=11&ct=1271359550&rver=6.0.5285.0&wp=MBI&wreply=http:%2F%2Fmail.live.com%2Fdefault.aspx&lc=1055&id=64855&mkt=tr-TR")
Daha sonra WebBrowserimizin onDocumentCompleted olayını kullanıyorum : Global olarak en yukarıda Nerdeyim diye string bir değişkenimiz var. İşte WebBrowserimizin onDocumentCompleted olayında bu değişkenin değerine göre hareket ediyorum.
Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
If GirisYaptim = False Then
Timer1.Enabled = True
Timer1.Start()
End If
If Nerdeyim = "AnaSayfa" Then
WebBrowser1.Navigate(GelenKutusuLinkiniAl())
Nerdeyim = "GelenKutusu"
ElseIf Nerdeyim = "GelenKutusu" Then
ListViewiDoldur()
Nerdeyim = "GelenKutusundaMailYukledim"
ElseIf Nerdeyim = "GelenKutusundaMailYukledim" And OkumakIcinTiklandimi = True Then
OkumakIcinTiklandimi = False
EMailiOku()
Nerdeyim = "GelenKutusu"
WebBrowser1.Navigate(GelenKutusuLinkiniAl())
End If
End Sub
Burada herşey girisyaptim değişkeni ile tetikleniyor. Bunuda ilk olarak false yaptm. Yani WebBrowserin ilk documentCompleted olayında ne olacak ? Timer1 başlayacak. Bakalım orada neler oluyor.
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If Zamanlayici = 1 Then
If GirisYaptim = False Then
Gir()
End If
Zamanlayici = 0
Me.Timer1.Stop()
Else
Zamanlayici += 1
End If
End Sub
Global olarak tanımladığım bir değişken daha karşımıza çıktı. Bu da Zamanlayici değişkeni. Bu eğer zamanlayici =1 ise şunu yap şartı 1 saniyelik zaman gecikmesi kullanmak için. Başka bir espirisi yok. Sonra baktı zamanlayıcı 1 değil sonra hemen else den sonraki şart çalıştı ve zamanlayıcı 1 arttı. Sonra tekrar kontrol ediyoruz : zamanlayici = 1 mi ? Evet artık login olabiliriz. Şimdi Gir() fonksiyonuna gidiyoruz.
Sub Gir()
Nerdeyim = "AnaSayfa"
GirisYaptim = True
WebBrowser1.Document.GetElementById("i0116").SetAttribute("Value", "xxxxxx@hotmail.com")
WebBrowser1.Document.GetElementById("i0118").SetAttribute("Value", "xxxxxxn")
Dim btn As Object
btn = WebBrowser1.Document.GetElementById("idSIButton9").DomElement
btn.click()
End Sub
Şimdi artık login olacağımız için Nerdeyim değişkeninin değeri AnaSayfa oldu. Çünkü bu işlemin ardından login olmuş olup mail sayfamızın ana sayfasında olacağız. Kullanıcı adı ve Şifre alanlarına kullanıcı bilgilerimizi Set ediyorum. Sonrada giriş yapıyoruz. WebBrowser anasayfaya gitti ve sayfayı yükledi. Şimdi ne çalışacak ? WebBrowserimizin onDocumentCompleted olayı çalışacak.
If Nerdeyim = "AnaSayfa" Then
WebBrowser1.Navigate(GelenKutusuLinkiniAl())
Nerdeyim = "GelenKutusu"
Yukarıya bakarsanız eğer nerdeyim = "Anasayfa" şartı sağlandığında WebBrowserimizi bir yere yönlendiriyoruz ve Nerdeyim değerimizi bu kez GelenKutusu yapıyoruz. Çünkü artık GelenKutumuza ulaşacağız. GelenKutusuLinkiniAl() fonksiyonu bize ne değer döndürüyor bir bakalım haydi
Function GelenKutusuLinkiniAl()
Dim aa As HtmlElement
For Each aa In WebBrowser1.Document.GetElementsByTagName("a")
If aa.GetAttribute("id") = "h_inboxCount" Then
RichTextBox1.Text &= aa.GetAttribute("href") & Environment.NewLine
RichTextBox1.Text &= aa.InnerText & Environment.NewLine
Return aa.GetAttribute("href")
End If
Next
End Function
Burada WebBrowserin bulunduğu sayfadaki tüm a etiketlerini yakalıyoruz ve bunların id özelliklerini sorguluyoruz. id = h_inboxCount olan a etiketinin href özelliğini return ediyoruz. Yani Hotmail giriş sayfamızda Gelen Kutusu linkine tıklatmış oluyoruz. RichTextBox1 kafanızı karıştırmasın. Onunla işimiz yok. Şimdi yine webBrowserimizin documentCompleted olayı çalışacak ve bu sefer acaba neler olacak ?
Gelen Kutumuza gittik ve artık ne yapmalıyız ? Maillerimizi çekmeliyiz dimi ? Haydi hemen yapalım.
ElseIf Nerdeyim = "GelenKutusu" Then
ListViewiDoldur()
Nerdeyim = "GelenKutusundaMailYukledim"
documentCompeleted olayında bu şart çalışacak. ve ListViewiDoldur() Sub u çalışacak ve Nerdeyim değişkenimizin değeri GelenKutusundaMailYukledim olacak. Peki ya ListViewiDoldur() da neler oluyor. Hemen bir göz atalım :
Sub ListViewiDoldur()
ListView1.Items.Clear()
RichTextBox1.Clear()
Dim degerler(4) As String
Dim Tablem As HtmlElement
Dim tr As HtmlElement
Dim td As HtmlElement
Dim saysay As Byte = 0
Dim icsayac As Byte = 0
Dim kacincitd As Byte = 0
For Each Tablem In WebBrowser1.Document.Window.Frames(0).Document.GetElementById("messageListContentContainer").GetElementsByTagName("table")
For Each tr In Tablem.GetElementsByTagName("tr")
Dim Okunmusmu As String = tr.GetElementsByTagName("img").Item(0).GetAttribute("alt")
If Okunmusmu = "Okunmamış" Then
’ListView1.Items.Item(icsayac).ForeColor = Color.Blue
OkunmamisMesajSayisi += 1
End If
IDlerim(icsayac) = tr.GetAttribute("id")
For Each td In tr.GetElementsByTagName("td")
If td.InnerText <> Nothing Or td.InnerText <> "" Then
If kacincitd = 0 Or kacincitd = 2 Then
RichTextBox1.Text &= td.InnerText
degerler(saysay) = td.InnerText
saysay += 1
kacincitd += 1
Else
RichTextBox1.Text &= td.InnerText
degerler(saysay) = td.InnerText
saysay += 1
kacincitd += 1
End If
End If
Next
saysay = 0
Dim itms As New ListViewItem(degerler)
ListView1.Items.Add(itms)
icsayac += 1
kacincitd = 0
Next
Next
lblOkunmamisMesajSayisi.Text = OkunmamisMesajSayisi
maviyap()
End Sub
Öncelikle listviewimizi temizliyoruz. İçindeki bütün elemanları siliyoruz.
Burada şu satıra dikkat ediyoruz. En önemli nokta burası : Çünkü sayfanın içindeki frame nin kaynak koduna bu kod sayedinde ulaşabiliyoruz : Kod ;
For Each Tablem In WebBrowser1.Document.Window.Frames(0).Document.GetElementById("messageListContentContainer").GetElementsByTagName("table")
sanırım anlamışsınızdır. Sayfadaki 0. (sıfırıncı) framenin içindeki messageListContentContainer id sine sahip olan nesnenin içindeki tüm table etiketlerini yakalıyoruz. İş burada idi. Olay artık tamamdır. Haydi artık bu table nin içeriğini parse edelim.
Mailerimiz bu table içinde ve her mail bir tr içinde yani bir satırda. Ve her satır içinde de sütunlar yani td ler var. Bunları da yukarıdaki gibi sorguluyoruz ve elde ettiğimiz değerleri degerler() dizimize atıp bunları da listviewimize yüklüyoruz. Burada okunmamış e-maili nasıl anlıyoruz derseniz o da şöyle : Hani yeni gelen mailin önünde sarı bir mektup işareti olur ya, işte onun sayesinde. Hemen tablenin içindeki satırları sorgularken her satırın içindeki img etiketllerini alıyorum ve bunun alt özelliğine bakıyorum. Eğer e-mail yeni gelmiş ise bu alt özelliği Okunmamış oluyor, eğer daha önce okumuş iseniz bu img etiketinin alt özelliği Okunmuş oluyor. Bu sayede de mailin yeni gelip gelmediğini de elde etmiş olduk. OkunmamisMesajSayisi değişkenimizi de 1 arttırıyoruz eğer okunmamış mail varsa. Daha sonra bu işlemler bittikten sonra maviYap Sub ını çağırıyoruz. Neden ? Çünkü okunmuş mailler ile okunmamış mailler arasındaki farkı belirgin yapabilmek için. Kullanıcı maillerine baktığında okunmamış mailleri MAVİ okunmuşları ise kahverengi renkte görecek.
Haydi birde maviYap() Sub ımıza bakalım:
Sub maviyap()
Dim degerler(2) As String
Dim Tablem As HtmlElement
Dim tr As HtmlElement
Dim saysay As Byte = 0
Dim icsayac As Byte = 0
Dim kacincitd As Byte = 0
Dim kactayim As Long = 1
For Each Tablem In WebBrowser1.Document.Window.Frames(0).Document.GetElementById("messageListContentContainer").GetElementsByTagName("table")
For Each tr In Tablem.GetElementsByTagName("tr")
Dim Okunmusmu As String = tr.GetElementsByTagName("img").Item(0).GetAttribute("alt")
If Okunmusmu = "Okunmamış" Then
ListView1.Items(icsayac).ForeColor = Color.Blue
Else
ListView1.Items(icsayac).ForeColor = Color.Brown
End If
icsayac += 1
Next
Next
End Sub
burada yukarıda da dediğim gibi okunmuş ve okunmamış mailler arasındaki renk ayrımını yapıyoruz. E ne kaldı artık ? Tamam kardeşim sen bu mailleri çektin ama ya ben bunları okumak istesem ne olacak ? Okuyabilecek miyim ? Bir bakalım yapabilecek miyiz =)
Listview de listelenen maillerden okumak istediğiniz mailin üzerine tıkladığınız zaman okuma işleminin gerçekleşmesini istiyorsunuz varsayalım. O zaman listviewimizin Click olayı altına birşeyler yazmamız gerekiyor. Bakın burada yeni birşey daha karşımıza çıkacak. Hotmail maillleri okurken java kullanıyor. Onclick olayını kullanıyor, yani herhangi bir a etiketi kullanıp href değerine göre mail çekmek yok. Tıklanan nesnenin onclick olayına göre işlem yapıyor. Peki biz bir nesne ile onClick olayını nasıl gerçekleyebiliriz ? Varmı bir yolu ? Olurmu ki =)
Evet oluyor. Uzuun araştırmalardan sonra zor girersin dedikleri .zul uzantılı öğrenci not sorgulama sayfamızda bunu başardım. Neyse sadede gelelim.
Private Sub ListView1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView1.Click
OkumakIcinTiklandimi = True WebBrowser1.Document.Window.Frames(0).Document.GetElementById(IDlerim(Val(ListView1.SelectedItems(0).Index))).RaiseEvent("onClick")
Me.Width = 886
Me.Height = 493
End Sub
Burada olay şu: maillerimizin bulunduğu framedeki maili okumak için o mailin id sine ihtiyacımız var. O id li nesneyi yakaladıktan sonra da onclick olayını gerçekleştirtiyoruz.
RaiseEvent("onClick")
bu raiseEvent in çok önemli bir yeri var bende :) çok işe yarıyor :)
E ne oldu şimdi onClick olayını gerçekleştirdik ve mailimizi okuyacağız. WebBrowserimiz yeniden navigate oldu ve documentCompleted olayında bu kez
ElseIf Nerdeyim = "GelenKutusundaMailYukledim" And OkumakIcinTiklandimi = True Then
OkumakIcinTiklandimi = False
EMailiOku()
Nerdeyim = "GelenKutusu"
WebBrowser1.Navigate(GelenKutusuLinkiniAl())
End If
şartı sağlanıp çalışacak. EmailiOku altyordamımız (Sub ımız) çağrılıyor. Bakalım orda neler oluyor.
Sub EMailiOku()
Dim trm As HtmlElement
Dim tdm As HtmlElement
Dim sayac As Byte = 0
Dim NeSayiyorum As Byte = 0
For Each trm In WebBrowser1.Document.Window.Frames(0).Document.GetElementById("readingPaneContentContainer").GetElementsByTagName("tr")
For Each tdm In trm.GetElementsByTagName("td")
If sayac = 0 Then
sayac += 1
ElseIf sayac = 1 Then
If NeSayiyorum = 0 Then
txtKimden.Text = tdm.InnerText
NeSayiyorum += 1
ElseIf NeSayiyorum = 1 Then
txtGondermeTarihi.Text = tdm.InnerText
NeSayiyorum += 1
ElseIf NeSayiyorum = 2 Then
txtKime.Text = tdm.InnerText
NeSayiyorum += 1
ElseIf NeSayiyorum = 3 Then
txtEkDosyaAdedi.Text = tdm.InnerText
NeSayiyorum += 1
End If
sayac = 0
End If
Next
RichTextBox1.Text &= trm.InnerText & Environment.NewLine
Next
Dim MesajinIcerigi As String = WebBrowser1.Document.Window.Frames(0).Document.GetElementById("mpf0_MsgContainer").InnerText
txtEMailIcerik.Text = MesajinIcerigi
End Sub
Şimdi ise WebBrowserimizin içindeki readingPaneContentContainer id sine sahip olan nesnenin içindeki tüm tr leri yakalayıp bunların içeriğini sorguluyoruz. Sonrada e-mail bilgilerini formumuzda yer alan textboxlara aktarıyoruz. Bunun içinde neler oluyor neler bitiyor kısmına girmiyoırum. Çünkü herşey ortada ama yinede anlamaz iseniz kafanıza takılan bir yer olursa sorabilirsiniz arkadaşlar.
Hadi gözümüz aydın =) bitti artık ...
Sadece ilk sayfadaki mailleri çekiyor sanırım şu an ya da 34 tane mi ne. Kodlar ve mantık burada. Geliştirmesi size kalmış. Elbette hatalarım olabilir. Lütfen bana bildiriniz çok sevinirim.
Size soru : Neden EmailOku altyordamında tekrar Nerdeyim = "GelenKutusu" ve WebBrowser1.Navigate(GelenKutusuLinkiniAl()) işlemlerini yapıyoruz ? Deneyin ve görün.