İ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.