Silverlight 2.0 Beta 2 ve PHP ile mailform uygulaması

0 dakikada yazıldı

6275 defa okundu

Düzenle

İster PHP olsun ister farklı sunucu taraflı programlama dilleri olsun
hepsi de "adı üzerinde" sunucu tarafında çalışıyorlar. Biz ise
Silverlight tarafında tamamen istemcide çalışıyor. Bu çerçevede
Silverlight'ın tamamen sunucudan bağımsız olduğunu düşünürsek aslında
sunucu ile belirli standartları yakaladığımız sürece istediğimiz sunucu
taraflı programlama altyapısı ile entegrasyon sağlayabiliriz. Bu
standartlar WSDL kuralları çerçevesinde hazırlanmış bir web servisi
olabileceği gibi bazen çok basit bir POST işlemi bile olabilir. Bu
yazımda Silverlight 2.0 Beta 2 ile beraber sunucu tarafında bir PHP
kodu kullanarak mail gönderim işlemi yapacağız. Hazırladığımız
Silverlight 2.0 uygulamasının XAP dosyasını sunucuya atmamız
uygulamamızın çalışması için yeterli olacaktır.

Önce PHP tarafını çözelim!

PHP tarafında çok detaya girmeyeceğiz. Yapacağımız şey basit bir şekilde
sayfaya POST ile gönderilen değişkenleri alıp uygun bir mail mesaj
stringi haline çevirdikten sonra mail olarak istediğimiz kullanıcıya
göndermek olacak.

<?php

$senderName = $_POST['Gonderen'];

$senderEmail = $_POST['Email'];

$emailMessage = $_POST['Mesaj'];

$recipient = "alici@domain.com";

$subject = "Mesaj Konusu";

$headers = "From: $Email";

$message = "Kimden: $Gonderen\nEposta
Adresi: $Email\n\n Mesaj: $Mesaj"
;

$message = stripslashes($message);

mail($recipient, $subject,
$message, $headers)

?>

Örneğimize devam ederken ufak bir uyarıda bulunmam gerek. Kesinlikle
yukarıdaki gibi bir PHP dosyasını sitenize bu haliyle bırakmayın. Şu an
yukarıdaki dosyada ne post eden arkadaşın kimliği, ne sender'ın agent
tipi hiçbir şey kontrol edilmiyor. Güvenlik açısından kesinlikle bu
kodun geliştirilmesi gerek aksi halde önüne gelen buraya bilgileri POST
ederek size milyonlarca mail yollayabilir.

Uygulamamızın tasarımını yapalım

Yine çok basit bir mailform hazırlayacağız. Blend 2.5 içerisinden
Silverlight sayfamıza toplam üç adet TextBox ve bir de Button koyuyoruz.
Site ziyaretçileri isimlerini, maillerini ve mesajlarını yazarak düğmeye
basıp gize gönderebilecekler. Oluşturduğumuz uygulamanın XAML kodunu
aşağıda inceleyebilirsiniz.

<UserControl
x
:Class="SilverlightApplication2.Page"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   Width="400"
Height
="300">

    <Grid
x
:Name="LayoutRoot"
Background
="White">

        <TextBox
Height
="32" Margin="96,42,74,0"
VerticalAlignment
="Top" Text="Adınız"
TextWrapping
="Wrap" x:Name="txtAdi"/>

        <TextBox
Height
="29" Margin="96,88,74,0"
VerticalAlignment
="Top" Text="Mailiniz"
TextWrapping
="Wrap" x:Name="txtMaili"/>

        <TextBox
Margin
="96,132,74,81" Text="Mesajınız"
TextWrapping
="Wrap" x:Name="txtMesaji"/>

        <Button
Height
="32" HorizontalAlignment="Stretch"
Margin
="180,0,146,31" VerticalAlignment="Bottom"
Content
="Gönder" x:Name="btnGonder"/>

    </Grid>

</UserControl>

Kodlamaya geçelim

Uygulamamızın kod kısmında bir WebClient nesnesi kullanacağız. WebClient
nesnemize sahnedeki tüm bilgileri bir String olarak vererek POST metodu
ile bilgileri kendisine parametre olarak vereceğimiz bir adrese
göndermesini isteyeceğiz.

[VB]

        Dim VeriGonder As New
System.Net.WebClient

        VeriGonder.Headers(HttpRequestHeader.ContentType) = "application/x-www-form-urlencoded"

[C#]

            System.Net.WebClient
VeriGonder = new System.Net.WebClient();

            VeriGonder.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";

VeriGonder adını verdiğimiz WebClient nesnemin hemen
ContentType bilgisini ayarlamam gerekiyor. Bunun için
WebClient'ın Headers dizisinden ContentType'ı bularak
form-urlencoded olarak değiştiriyorum. Böylece birazdan URLEncode
tekniği ile hazırladığımız verileri bu WebClient ile rahatlıkla sunucuya
gönderebileceğiz.

[VB]

        Dim GonderilecekData As String
= "Gonderen=" &
Browser.HttpUtility.UrlEncode(txtAdi.Text) & "&"

        GonderilecekData &= "Email=" &
Browser.HttpUtility.UrlEncode(txtMaili.Text) & "&"

        GonderilecekData &= "Mesaj=" &
Browser.HttpUtility.UrlEncode(txtMesaji.Text)

[C#]

            string GonderilecekData =
"Gonderen=" +
System.Windows.Browser.HttpUtility.UrlEncode(txtAdi.Text) +
"&";

            GonderilecekData += "Email=" + System.Windows.Browser.HttpUtility.UrlEncode(txtMaili.Text) +
"&";

            GonderilecekData += "Mesaj=" + System.Windows.Browser.HttpUtility.UrlEncode(txtMesaji.Text);

Kodumuz içerisinde hemen göndereceğimiz verileri Key/Value çiftleri
şeklinde birleştiriyoruz. Göndereceğimiz her verinin bir ismi ve tabi ki
değeri olması gerekiyor. Aslında yaptığımız şey normalde URL üzerinden
göndereceğimiz veriyi URLEncode ile aynı şekilde oluşturmak. Eğer
göndereceğiniz verilerin sayısı çok ise performans açısından standart
String işlemleri yerine bir StringBuilder kullanmanızı tavsiye
ederim.

[VB]

        AddHandler
VeriGonder.UploadStringCompleted, AddressOf VeriGonder_UploadStringCompleted

        VeriGonder.UploadStringAsync(New Uri("http://localhost:49424/SilverlightApplication2Web/mailgonder.php",
UriKind.Absolute), "POST",
GonderilecekData)

[C#]

            VeriGonder.UploadStringCompleted +=
VeriGonder_UploadStringCompleted;

            VeriGonder.UploadStringAsync(new Uri("http://localhost:49424/SilverlightApplication2Web/mailgonder.php",
UriKind.Absolute), "POST", GonderilecekData);

Son olarak verimizi sunucuya göndermeden önce gönderme işlemi
tamamlandığında çalıştırılmak üzere VeriGonder nesnemizin
UploadStrintCompleted event'ına da bir event-handler bağlıyoruz.
Artık verimizi sunucuya göndermeye hazır olduğumuza göre hemen adresini
vererek POST metodu ile veriyi yolculayabiliriz.

[VB]

    Private Sub VeriGonder_UploadStringCompleted(ByVal sender As Object,
ByVal e As
System.Net.UploadStringCompletedEventArgs)

        btnGonder.Content = "Tamam"

    End Sub

[C#]

        private void VeriGonder_UploadStringCompleted(object sender, System.Net.UploadStringCompletedEventArgs e)

        {

            btnGonder.Content = "Tamam";

        }

Veri gönderme işlemi tamamlandığında ekrandaki kontrolleri kaldırıp bir
teşekkür mesajı göstermek güzel olabilirdi. İşin o kısmını ben size
bırakmış oliyim. Şimdilik UploadStringCompleted event'ında düğmeye
"Tamam" yazdırarak örneğimizi çalıştırabiliriz.

@ İşaret Sorunu!

Ufak bir sorunumuz var. Silverlight 2.0 Beta 2 ile beraber gelen bu
sorun ufak gibi gözükse de aslında epey önemli :) Yukarıdaki örneği
çalıştırdığınızda göreceksiniz ki herhangi bir TextBox içerisinde @
işareti koyamıyorsunuz. Bunun basit bir nedeni var, aslında AltGr
tuşu ile oluşturduğunuz hiçbir karakteri TextBox'lara
yerleştiremeyeceksiniz. Neden mi? Bilmiyorum, bu bir bug. Silverlight
2.0'ın Beta 2 sonrasında sürümlerinde bu hata giderilecek. Şimdilik
aşağıdaki gibi bir çözüm uygulayabiliriz.

[VB]

    Dim Oncekiler(1) As Integer

 

    Private Sub txtMaili_KeyDown(ByVal sender As Object,
ByVal e As System.Windows.Input.KeyEventArgs) Handles txtMaili.KeyDown

        If e.PlatformKeyCode = 81
Then

            If Oncekiler(0) = 17 And Oncekiler(1) = 18 Then

                txtMaili.Text &= "@"

                txtMaili.SelectionStart = txtMaili.Text.Length

            End If

        End If

        Oncekiler(0) = Oncekiler(1)

        Oncekiler(1) = e.PlatformKeyCode

    End Sub

[C#]

        int[] Oncekiler = new int[2];

 

        private void txtMaili_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)

        {

            if (e.PlatformKeyCode ==
81)

            {

                if (Oncekiler[0] == 17
& Oncekiler[1] == 18)

                {

                    txtMaili.Text += "@";

                    txtMaili.SelectionStart = txtMaili.Text.Length;

                }

            }

            Oncekiler[0] = Oncekiler[1];

            Oncekiler[1] = e.PlatformKeyCode;

        }

İlk önce uygulamaya çalıştığımız mantığı kavrayalım. txtMail
adındaki textBox içerisinde herhangi bir tuşa basıldığında
yukarıdaki gibi KeyDown event'ı çalışacaktır. Bu event'a
baktığımızda klavyede AltGr tuşuna basıldığında sırası ile iki tuşa
basılmış gibi sistemin 17 ve sonrasonda da 18 numaralı
PlatformAnahtarları'nı döndürdüğünü görebiliriz. Bu tuşların Macintosh
dahil tüm sistemlerdeki PlatformKeyCode adında anahtarları vardır ve
bu değerler sürekli aynıdır. Normalde biz @ işaretini koyabilmek için
AltGr'ye bastıkdan sonra bir de Q harfine basarız. O zaman kontrol
etmemiz gereken durum şu; Q harfine basıldıysa acaba bir önceki basılan
tuş AltGr miydi? Eğer öğleyse bana bir @ işareti lazım. İşte
kodumuz da bu kontrolü yapıyor. Sürekli olarak basılan son iki tuşu
Oncekiler adındaki dizimizde saklıyor ve her tuşa basıldığında
KeyDown içerisinde eğer Q harfine basılmış ise son basılan iki tuşun
KeyCode'larının da 17 ve 18 olup olmadığını kontrol ediyoruz. Eğer
durum buysa txtMaili TextBox'ı içerisine bir @ işareti ekleyip
imleci metnin en sonuna gönderiyoruz.

Sonuç

Makalemizde kullandığımız teknik aslında web programcılığının en ilkel
zamanlarından bu güne kadar gelen ve yapı taşı diyebileceğimiz POST
metodunun ta kendisi. Bu çerçevede sunucu taraflı programlama
sistemlerinin hepsi bu şekilde veri trafiğine açık olduğu için aynı
teknikler ile Silverlight'ı sunucu tarafı ile rahatlıkla konuşturabilir
ve ister sunucunun işletim sistemi olsun, ister kullanılan teknoloji
olsun her konuda tam bağımsızlığın tadını çıkartabilirsiniz.

Hepinize kolay gelsin.