Merhaba arkadaşlar, uzun bir aradan sonra daha doğrusu yoğun giden bir iş temposunun ardından sonra zamanlarda üzerinde bolca zaman geçirdiğim bir konu hakkında sizleri de bilgilendirmek istedim. Basit bir iletişim formu üzerinden Silverlight 3 ile e-posta gönderimi.
Bu uygulama üzerinden çalışabilmeniz için aşağıdaki programların bilgisayarında mevcut olması gerekmektedir.
1) Visual studio 2008
2) Silverlight 3 SDK ve Tools
3) Silverlight ria proje template veya Silverlight Bussines Application Project (SBAP) template
Gördüğünüz gibi ilk etapta VS ile SBAP projesi oluşturuyoruz.
Öncelikle SBAP proje yapısı ile ilgili birkaç noktaya değinmek istiyorum:
Proje yapısından biri Silverlight, diğeri ise bunun web üzerinde yayınlanacağı web projesi yer almaktadır.
Silverlight projesinde

Assets (Skin, css, projede kullanılan resim vb dosyaların olduğu klasör)
Libs (Projeye dahil edilen dll dosyaları)
Views (Projemizdeki sayfalar, user controllerin tutulduğu klasörümüz)
Web projemizde
ClientBin (Silverlight dll ve resource dosyalarımızın bulunduğu dosya)
Services (Silverlight projemize kullanacağımız webservisimiz veya domain servislerimiz)
Projemize otomatik olarak eklenen mainpage.xaml aşağıdaki gibidir. Bunun üzerinde birkaç değişiklik yaparak projeye eklemiş olduğumuz ContactUs.xaml sayfasına bağlantı linki eklemeliyiz.
Aşağıdaki kod yapısını incelediğimizde <navigation:Frame.UriMapper> diye bir yapı gözümüze çarpmaktadır. Bu yapıda MVC framework içindeki gibi projemizdeki navigasyon url yapısını istediğimiz gibi belirleyebiliyoruz. Örneğin burada şu satır ile
Map’lenen uri ve map’leme yapısının kuralı belirlenmiştir. MVC’de routin rule veya asp.net de url mapping olarak karşımıza çıkmaktadır.
Aşağıdaki satır ise iletişim sayfamıza yönlendirmeyi sağlayan hyperlink control’dür.
MainPage.xaml
<UserControl
x:Class="MailSendingProject.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
xmlns:uriMapper="clr-namespace:System.Windows.Navigation;assembly=System.Windows.Controls.Navigation"
xmlns:dataControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm.Toolkit"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
<Grid x:Name="LayoutRoot" Style="{StaticResource LayoutRootGridStyle}">
<Border x:Name="ContentBorder" Style="{StaticResource ContentBorderStyle}">
<navigation:Frame x:Name="ContentFrame" Style="{StaticResource ContentFrameStyle}"
Source="/Home" Navigated="ContentFrame_Navigated" NavigationFailed="ContentFrame_NavigationFailed">
<navigation:Frame.UriMapper>
<uriMapper:UriMapper>
<uriMapper:UriMapping Uri="" MappedUri="/Views/Home.xaml"/>
<uriMapper:UriMapping Uri="/{pageName}" MappedUri="/Views/{pageName}.xaml"/>
</uriMapper:UriMapper>
</navigation:Frame.UriMapper>
</navigation:Frame>
</Border>
<Grid Style="{StaticResource NavigationOuterGridStyle}">
<Grid x:Name="NavigationGrid" Style="{StaticResource NavigationGridStyle}">
<Border x:Name="BrandingBorder" Style="{StaticResource BrandingBorderStyle}">
<StackPanel x:Name="BrandingStackPanel" Style="{StaticResource BrandingStackPanelStyle}">
<ContentControl Style="{StaticResource LogoIcon}"/>
<TextBlock x:Name="ApplicationNameTextBlock" Style="{StaticResource ApplicationNameStyle}"
Text="Application Name"/>
</StackPanel>
</Border>
<Border x:Name="LinksBorder" Style="{StaticResource LinksBorderStyle}">
<StackPanel x:Name="LinksStackPanel" Style="{StaticResource LinksStackPanelStyle}">
<HyperlinkButton x:Name="Link1" Style="{StaticResource LinkStyle}"
NavigateUri="/Home" TargetName="ContentFrame" Content="home"/>
<Rectangle x:Name="Divider1" Style="{StaticResource DividerStyle}"/>
<HyperlinkButton x:Name="Link2" Style="{StaticResource LinkStyle}"
NavigateUri="/About" TargetName="ContentFrame" Content="about"/>
<Rectangle x:Name="Divider2" Style="{StaticResource DividerStyle}"/>
<HyperlinkButton x:Name="Link2" Style="{StaticResource LinkStyle}"
NavigateUri="/ContactUs" TargetName="ContentFrame" Content="Contact Us "/>
</StackPanel>
</Border>
</Grid>
<Border x:Name="loginContainer" Style="{StaticResource LoginContainerStyle}"/>
</Grid>
</Grid>
</UserControl>
Uygulamamıza Silverlight projemizle başlayabiliriz. İlk etapta bu projeye Views klasörüne ContactUs.xaml uzantısında bir sayfa ekliyoruz. Bu sayfamızın design bölümü aşağıdaki gibi olmalıdır.
<navigation:Page x:Class="DumanSoftSilverlight.Views.ContactUs"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
d:DesignWidth="640" d:DesignHeight="480"
Title="ContactUs Page">
<Grid x:Name="LayoutRoot">
<StackPanel HorizontalAlignment="Left" Style="{StaticResource ContentStackPanelStyle}" Orientation="Vertical">
<TextBlock x:Name="HeaderText" Style="{StaticResource HeaderTextStyle}"
Text="İletişim"/>
<TextBlock Text="Ad/Soyad:"></TextBlock>
<TextBox x:Name="tbName" Width="300" Height="30"></TextBox>
<TextBlock Text="Mail:"></TextBlock>
<TextBox x:Name="tbMail" Width="300" Height="30"></TextBox>
<TextBlock Text="Telefon:"></TextBlock>
<TextBox x:Name="tbPhone" Width="300" Height="30"></TextBox>
<TextBlock Text="Konu:"></TextBlock>
<TextBox x:Name="tbSubject" Margin="100,0,0,0" Width="400" Height="30"></TextBox>
<TextBlock Text="Mesaj:"></TextBlock>
<TextBox x:Name="tbMesaj" Margin="100,0,0,0" AcceptsReturn="True" HorizontalScrollBarVisibility="Auto" Width="400" TextWrapping="Wrap" Height="100"></TextBox>
<Button x:Name="btnSend" Content="GÖNDER" Width="120" Click="btnSend_Click" Margin="0,50,0,0" Height="30" ></Button>
<TextBlock x:Name="lbResult"></TextBlock>
</StackPanel>
</Grid>
</navigation:Page>
BtnSend butonun click event form yapsından da anlaşılacağı gibi tıklandığında üzerindeki bilgileri istenen adresie e-posta olarak gönderecektir.
2.olarak web projemizde yukarıda bahsettiğimiz service klasörüne bir adet web servisi ekliyoruz ve adını MailSenderService olarak belirliyoruz. Bu service üzerinden kullanıcı Silverlight projemizden e-posta gönderecektir.
MailSenderService.asmx.cs aşağıdaki yapıda olmalıdır.
MailSenderService.asmx.cs
public class MailService : System.Web.Services.WebService
{
[WebMethod]
public bool Send(string ToM, string header, string MSubject, string MBody, string MailAccount, string MailPassword)
{
try
{
string smpt = ConfigurationManager.AppSettings["SmtpServer"].ToString();
MailMessage mymail = new MailMessage();
mymail.To.Add(ToM);
mymail.Bcc.Add(MailAccount);
mymail.From = new MailAddress(MailAccount);
mymail.Subject = MSubject;
mymail.SubjectEncoding = Encoding.UTF8;
mymail.IsBodyHtml = true;
mymail.Body = MBody;
mymail.BodyEncoding = Encoding.UTF8;
mymail.Priority = MailPriority.High;
SmtpClient smtpC = new SmtpClient(smpt);
System.Net.NetworkCredential nc = new System.Net.NetworkCredential(MailAccount, MailPassword);
smtpC.Credentials = nc;
smtpC.Port = 587;
smtpC.DeliveryMethod = SmtpDeliveryMethod.Network;
smtpC.Send(mymail);
return true;
}
catch (Exception ex)
{
return false;
}
}
Yukarıda da göreceğiniz üzere bool tipinde bir değer döndüren web metod ekledik. Bu metod web.config dosyasından smtp server bilgisini almaktadır. Ayrıca parametre olarak postanın gönderileceği adres, kimden gönderileceği, mail başlığı ve içeriği gibi bilgileri almaktadır. Bu parametreler Silverlight projemizdeki ContactUs.xaml sayfamızdaki parametrelerdir.
Web servisimizi yukarıdaki gibi güncelledikten sonra web projemizi build etmeliyiz.
Ardından Silverlight projemize References klasörüne add service referance demeliyiz. Açılan pencerede service reference olarak web servisinin linkini yazmalıyız. http://localhost:3434/services/Mailsenderservice.asxm ardından go butonuna tıkladığımızda bu servis referans olarak Silverlight projemize eklenecektir ve projemize ServiceReferences.ClientConfig isminde bir xml doküman dahil edilmektedir. Bu dökümanın yapısının incelediğimizde servis bilgilerinin tutulduğunu göreceğiz. Örneğin test sunucumuzdan projemizi yayına attığımızda bu dökümandaki servis bilgilerini güncelleyip Silverlight projemizi yeniden derlemeliyiz.
Aşağıdaki butonun tıklama olayında MailServiceSoapClient sınıfının bir örneği oluşturularak, bu nesne üzerinden SendAsync ve SendCompleted metodları işlenmektedir.
Bu metodlar sonucundan dönen parametrelere göre result isimli textblock kontrolümüze gönderimle ilgili mesajlar verilmektedir.
ServiceReferences.ClientConfig
<configuration> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="MailServiceSoap" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> <security mode="None" /> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="http://isadumam.com /Services/MailService.asmx" binding="basicHttpBinding" bindingConfiguration="MailServiceSoap" contract="MailSenderService.MailServiceSoap" name="MailServiceSoap" /> </client> </system.serviceModel> </configuration>
Şimdi uygulamamızın son bölümünde geldi. Burada Contactus.xaml sayfamızdaki gönder butonumuza tıkladığımızda servisimizle haberleşecek kodu yazmamız kaldı.
Contactus.xaml.cs
public partial class ContactUs : Page
{
public ContactUs()
{
InitializeComponent();
}
// Executes when the user navigates to this page.
protected override void OnNavigatedTo(NavigationEventArgs e)
{
}
private void btnSend_Click(object sender, RoutedEventArgs e)
{
MailSenderService.MailServiceSoapClient client = new DumanSoftSilverlight.MailSenderService.MailServiceSoapClient();
StringBuilder sb = new StringBuilder();
sb.Append("<b>Contact Form Formu</b><br>");
sb.Append("<br><b>Ad/Soyad:</b>" + tbName.Text);
sb.Append("<br><b>Telefon:</b>"+tbPhone.Text);
sb.Append("<br><b>Mail:</b>" + tbMail.Text);
sb.Append("<br><b>Konu:</b>" + tbSubject.Text);
sb.Append("<br><b>Mesaj:</b>" + tbMesaj.Text);
client.SendAsync("mail@domain.com", "Test Mail Gönderimi", tbSubject.Text, sb.ToString(), "mail@domain.com", "mailpassword");
client.SendCompleted += new EventHandler<DumanSoftSilverlight.MailSenderService.SendCompletedEventArgs>(client_SendCompleted);
}
void client_SendCompleted(object sender, DumanSoftSilverlight.MailSenderService.SendCompletedEventArgs e)
{
if (e.Result)
{
lbResult.Text = "Mesajınız Başarı ile gönderildi!";
lbResult.Foreground = new SolidColorBrush(Colors.Green);
}
else
{
lbResult.Text = e.Error.StackTrace;
lbResult.Foreground = new SolidColorBrush(Colors.Red);
}
}
}
}



# 2
Tutoriallerde önemli bir nokta demo uygulamanın gösterilmesidir. Keşke demo uygulamayı da ekleyeseydiniz ya da yeterli görsel materyallerle uygulamanın nasıl görüneceğini gösterseydiniz ki uygulamayı yaptığımızda neye benzeyeceğini görebilseydik. Denemedim ama ellerinize sağlık.
Çok yararlı bir paylaşım olmuş keşke demo halinde görebilseydik.