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 porton 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 portot 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 void button1_Click(object sender, System.EventArgs e)
{
TcpClient tc = 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();
StreamReader sr = 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 + "\r\n";
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 + "\r\n";
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\r\n";
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 eleme a 10-es számot és a harmadik a 2503 számot, persze sztringként.
s = sr.ReadLine();
listBox1.Items.Add("stat: " + s);
string[] detail = s.Split(new char[] {' '});
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\r\n";
ba = Encoding.ASCII.GetBytes(s.ToCharArray());
ns.Write(ba, 0, ba.Length);
...
ns.Close();
tc.Close();
}