Bir Web Sitesindeki E-Mail Adreslerini Yakalamak (Düzenli Ýfadeler 2)

Gene þu sýkýcý düzenli ifadeler deðil mi? Bu makalede düzenli ifadelerin ne kadar etkileyici olduðunu bir örnek üzerinde anlatmaya çalýþacaðým.
Web sitelerinin birebir kopyasýný kendi bilgisayarýnýza kopyalayan ( Teleport gibi) programlarý bilirsiniz. Önce bir sayfanýn kaynak kodunu indirir. Ýçindeki linkleri ve resim dosyalarýný belirler. Sonra sýra bu link ve resim dosyalarýna gelir.

Hiç elinizdeki kaynak kodun linklerini nasýl ayýklayacaðýnýzý düþündünüz mü?
Ýþte düzenli ifadeler burada gerçekten harikalar yaratýr.
Fazla uzatmadan örneðimize geçelim...

E-Mail Yakalayýcý



Þimdi yapacaðýmýz örnekte önce bir web sitesinin kaynak kodunu indirip, içerisindeki e-mail linklerini elde edeceðiz.
Öncelikle sayfanýn kaynak kodunu indirelim
Bunun için iki basit metod yazdým. Ýlki sayfanýn adresini kullanýcýdan alýyor, ikincisi sayfaya baðlanýp kaynak kodu indiriyor :


 

// Adresi Alan Metod :
private string AdresiAl()
{
    string adres="http://" + txtAdres.Text;
    return adres;
}

// Sayfanýn Kaynak Kodunu Döndüren Metod :
private string KaynakAl(string adres)
{
    lblStat.Text="Siteye Baðlanýyor...";
    WebResponse benimResponse=null;
    try
    {
        WebRequest benimWebRequest=WebRequest.Create(adres);
        benimResponse=benimWebRequest.GetResponse();
    }
    
// Eðer internet baðlantýsý yoksa yada site adresi yanlýþ ise :
    catch(WebException e)
    {
        lblStat.Text="Siteye Baðlanamýyor.";
        return null;
    }
    
// Site içeriði stream olarak alýnýyor :
    Stream str=benimResponse.GetResponseStream();
    StreamReader reader=new StreamReader(str);
    string kaynak=reader.ReadToEnd();
    
// Tüm içerik küçük harfle döndürülüyor.
    //Daha fazla kontrol yapmamak için bir önlem

    return kaynak.ToLower();
}


Sayfanýn kaynak kodunu indirdikten sonra içindeki e-mail linklerini bulup bir diziye atan bir baþka fonksiyon daha yazdým. Öncelikler e-mail linkini yakalayan deseni (pattern) açýklamaya çalýþalým.

Bildiðiniz gibi e-mail linkleri
<a href="mailto:aaa@bbb.ccc"> gibi ifade edilir.

O zaman desenimiz (href=) ifadesi ile baþlamalýdýr.
Ardýndan (') yada (") karakterleri gelebilir.

"(href=)((')|(""))"

Sonra "mailto:" ifadesi gelir :

"(href=)((')|(""))(mailto:)"

"mailto:" ifadesinden sonra istediðimiz ifade yani e-mail adresi gelir. Bunu "mail" isminde bir grup tanýmlayarak elde edeceðiz.

"(href=)((')|(""))(mailto:)(?<mail>(.*))"
// (.*) ifadesi kendinden sonra gelen desene kadar her karakteri alan bir desendir.

Þimdi desenimizi sonlandýralým :

"(href=)((')|(""))(mailto:)(?<mail>(.*))((')|(""))"


Kýsaca, "mailto:" ile týrnak karakterleri arasýndaki her ifade bizim için mail grubuna dahil oldu.

Þimdi E-mail adreslerini dizi þeklinde döndüren metodumuzu yazalým :


 

// Sayfanýn içindeki mail adreslerini dizi þeklinde döndüren metod :
private string[] MailAl(string kaynak)
{
    lblStat.Text+= "Kaynak kod alýndý... " + "Mailler ayrýþtýrýlýyor... ";
    
// Desenimiz :
    string mailDeseni=@"(href=)((')|(""))(mailto:)(?<mail>(.*))((')|(""))";
    int i=0;
    
// Regular Expressionumuzu tanýmlýyoruz :
    Regex benimRegex=new Regex(mailDeseni);
    Match str=benimRegex.Match(kaynak);
    
// Oluþturduðumuz deseni sitenin kaynak kodunda karþýlaþtýrýyoruz :
    MatchCollection mailCol=benimRegex.Matches(kaynak);
    string[] mail=new string[mailCol.Count];
    
// Bulunan her e-mail adresini mail[] dizisine atýyoruz :
    foreach(Match mailMatch in mailCol)
    {
        mail[i]=mailMatch.Groups["mail"].ToString();
        i++;
    }
    return mail;
}



Þimdi Yakala butonuna basýlýnca icra edilecek olay kodunu yazalým :


 

// Þimdi e-mail yakalamak için bu yazdýðýmýz metodlarý button_Click olayý ile birleþtirelim :
private void btnYakala_Click(object sender, System.EventArgs e)
{
    lblStat.Text="";
    if(txtAdres.Text=="")
    {
        MessageBox.Show("Lütfen Bir Adres Girin !");
    }
    else
    {
        
// Sitenin Adresini alýyoruz :
        string adres=AdresiAl();
        
// Sitenin Kaynak Kodunu alýyoruz :
        string kaynak=KaynakAl(adres);
        
// E-Mail adreslerini alýyoruz :
        if(kaynak!=null)
        {
            string[] mail=MailAl(kaynak);
            lblStat.Text+="Ýþlem sona erdi." + mail.Length + " tane mail adresi yakalandý.";
            foreach(string yakalananMail in mail)
            {
                
// Her e-mail adresi listbox'a giriliyor :
                lbxEmail.Items.Add(yakalananMail);
            }
        }
    }
}

Açýklama

Bazý sitelerde frameset kullanýldýðýndan sayfada e-mail linki görülse bile programýmýz bunlarý döndürememekte. Bu sayfalarýn framelerinin linkleri verilerek e-mail adresleri elde edilebilir.
Yine bazý sitelerde linkler javascript kodu ile eriþildiðinden bu adreslerde programýmýz tarafýndan eriþilememektedir.