Home » » VB.net Hotmail İslemleri

VB.net Hotmail İslemleri


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.

 
Support : Vaganzi
Copyright © 2013. Visual Studio Kod Bankası - All Rights Reserved
Powered By Vaganzi