A megvalósítás menete a következő lesz. Felvesszük a kapcsolatot az Exchange szerverünkkel, mely alapértelmezésben a 110-es TCP port-on figyeli a POP3 kéréseket. A kapcsolat felvétele után be kell jelentkeznünk egy érvényes felhasználói névvel és jelszóval. Ha ez sikeresen megtörtént, akkor az adott felhasználó e-mail fiókjához hozzáférhetünk, és egy STAT parancs küldésével az Exchange válaszként megküldi azt az információt, hogy hány új e-mail van, és ezek összesen hány bájtnyi adatot takarnak. Feladatunk végén megszakítjuk a kapcsolatot az Exchange-el.
Nézzük, miként történik ez a gyakorlatban. Először is nyissuk meg a 110-es TCP port-ot a TcpClient osztály Connect függvényének hívásával. E függvény két paramétert vár: az első a mail szerverünk neve, vagy IP címe kell, hogy legyen, a második a TCP port száma, mely alapértelmezett esetben 110.
Private Sub button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles button1.Click
Dim tc As New TcpClient()
tc.Connect(textBox1.Text, Convert.ToInt32(textBox2.Text))
Ha a port megnyitása sikeres, akkor a GetStream függvény hívásával kaphatunk egy NetworkStream osztályt, melyet felhasználva létrehozhatunk egy StreamReader osztályt. E két Stream osztályra a kommunikációhoz lesz szükségünk. A NetworkStream osztályt használva tudunk majd adatokat küldeni, míg a StreamReader segítségével az adatokat olvasni.
ns = tc.GetStream()
Dim sr As New StreamReader(ns)
A TCP port megnyitása után rögtön olvashatjuk is a rendelkezésre álló adatot, melyből megtudhatjuk, hogy a művelet sikeres volt-e, vagy sem. Ha sikeres volt, akkor a visszakapott sztringből megtudhatjuk, hogy milyen mail szerver áll rendelkezésre, annak is melyik verziója.
listBox1.Items.Add(("connect: " + sr.ReadLine()))
Következő lépés lesz a felhasználói bejelentkezés, melynél először a felhasználói nevet kell elküldenünk. Ezt egy „USER loginname” formájú sztringként kell elküldeni, ahol a loginname sztring értelemszerűen az adott felhasználói név lesz. Fontos, hogy minden elküldendő sztringet egy "\r\n" sorvége jellel zárjunk. Az így létrejött sztringet át kell alakítanunk ASCII karaktereket tartalmazó tömbbé, mivel a NetworkStream osztály Write függvénye – mellyel az adatok elküldését végezzük – ilyen formájú adatot vár.
s = "USER " + textBox3.Text + ControlChars.Cr + ControlChars.Lf
ba = Encoding.ASCII.GetBytes(s.ToCharArray())
ns.Write(ba, 0, ba.Length)
Az adatküldés után végezzünk egy olvasást, melyből megtudhatjuk, hogy milyen eredménnyel járt az adatküldésünk.
listBox1.Items.Add(("user: " + sr.ReadLine()))
Most következik a felhasználói jelszó elküldése. Ez egy „PASS password” formátumú sztring elküldését jelenti, ahol a password helyére az adott felhasználó jelszava kerül. Az adatküldés folyamata, majd az eredmény visszaolvasása ugyanúgy történik.
s = "PASS " + textBox4.Text + ControlChars.Cr + ControlChars.Lf
ba = Encoding.ASCII.GetBytes(s.ToCharArray())
ns.Write(ba, 0, ba.Length)
listBox1.Items.Add(("password: " + sr.ReadLine()))
Ha a bejelentkezés is sikeres volt, akkor jöhet a „STAT” parancs elküldése, amelyre válaszként megkapjuk a számunkra szükséges információt.
s = "STAT" + ControlChars.Cr + ControlChars.Lf
ba = Encoding.ASCII.GetBytes(s.ToCharArray())
ns.Write(ba, 0, ba.Length)
Ez az információ a következőképpen nézhet ki: „+OK 10 2503”. A visszakapott sztring három részből áll, melyet szóköz választ el egymástól. Az első rész tájékoztat bennünket arról, hogy a művelet sikeres volt. A második részben lévő szám azt mondja meg, hogy hány új e-mail van, végül a harmadik paraméter az új e-mail-ek összméretét adja bájtban.
A kapott sztring értelmezése egyszerűbb, ha készítünk egy sztringeket tartalmazó tömböt, melynek minden eleme egy-egy paramétert tárol a fenti sztringből. Ezt egyszerűen elkészíthetjük a String osztály Split függvényével, mellyel felbonthatunk egy sztringet egy karakter alapján több sztringre. Ennek eredménye az lesz, hogy a tömb első eleme a +OK feliratot tartalmazza. A második elem a 10-es számot és a harmadik a 2503-as számot, persze sztringként.
s = sr.ReadLine()
listBox1.Items.Add(("stat: " + s))
Dim detail As String() = s.Split(New Char() {" "c})
A kommunikáció lezárásaként végül egy QUIT parancsot küldünk és zárjuk a két Stream-et is.
s = "QUIT" + ControlChars.Cr + ControlChars.Lf
ba = Encoding.ASCII.GetBytes(s.ToCharArray())
ns.Write(ba, 0, ba.Length)
listBox1.Items.Add(("quit: " + sr.ReadLine()))
listBox1.Items.Add("--------------")
listBox1.Items.Add(("New mail count: " + detail(1)))
listBox1.Items.Add(("Total size: " + detail(2)))
listBox1.Items.Add("--------------")
ns.Close()
tc.Close()
End Sub