Bu işlem icin SMTP protokolunu kullanacağız, ve anlatımım sanki kendi serverınız varmış gibi kabul ederek , burdaki ayarlara biraz değinerek olacak, ancak genel olarak sadece kodlara ihtiyacı olanlar da burda rahatca bulabilirler. Oncelikle zaten vb.net ile web projeleri yazabilmemiz icin kendi bilgisayarımıza bi server kurmamız gerekiyor (tercihen windows paketiyle beraber gelen IIS server) server kurulumuna pek girmiycem, sonucta bir webproje geliştiriyorsanız serverınız kurulmuş demektir. SMTP yi ise yine IIS i yuklediğiniz yerden, Program Ekle/Kaldır da yeni bileşen yukleme kısmında IIS in detayları altından kurabilirsiniz. Evet, burdam SMTP server kurulumumuzu da tamamladıktan sonra e-mail işlemlerine nerdeyse hazırız. Benim burda değineceğim iki tip e-mail gonderme işleminin birinde en az .net frameworks v1.1 yuklemeniz gerekiyor, bunu da microsoft un sitesinden ucretsiz temin edebilirsiniz.

Dediğim gibi aslen iki ceşit mail gondermekten bahsedicem, biri , ki aslında en cok kullanılanı anonim mail gondermek, diğeri ise Authenticated(izinli gibi bişey oluyor herhalde) mail gondermek, aslında ikisinin arasında pek bi fark yok, fazladan 3 satır kod var o kadar. Mail yollamak icin oncelikle System.Web.Mail e referans vermemiz gerekiyor (Sayfanın declaration kısmına import System.Web.Mail yazarak yapabilirsiniz)

Genel kod kalıbımız aslında şu:

Private Sub sendmail(sender As Object, e As System.EventArgs)

Dim mail As New MailMessage()

mail.To = "[email protected]"

mail.From = "[email protected] "

mail.Subject = "bu bir test mesajıdır."

mail.Body = "buralar işte mailin ici"

mail.body & = "daha fazla icerik olunca tek satırda takip etmek zordur boyle yapmak daha iyi"

SmtpMail.SmtpServer = "mail.mycompany.com"

SmtpMail.Send(mail)

End Sub 'send mail

Body kısmında tabi satır atlama kodları ve bicok kod kullanarak formatınızı yaratmanız da onemlidir.

Burada genel kodu verdim, artık icine ne koyacağınız tamamem sizin sorunununuz, artık bi veritabanına bağlanıp bişiyler ceker onları mı koyarsanız naparsınız bilmem. Burda yaptığımız şeyi ozetliycek olursak, once bir mail objesi tanımladık, bu mail objesine gonderen ve gonderilen ve sonra konu ve de icerik tanımladık ve smtpmail e bu mail i yollamasını soyledik. Eğer SMTP sunucunuz sizin adresinizden gelecek postaları gondermeye izin veriyorsa ve smtp mail gonderilmesi sırasında ozellikle şifre sormuyorsa bu kod size yeterli olacaktır.

Peki burda genellikle karşılaşabilieceğiniz sorunlar nelerdir?

Oncelikle Smtp sunucunuzun yanıt vermemesi gibi bir sorunla karşılaşabilirsiniz, bu durumda smtp sunucunuzun ayarlarını kontrol edin (IIS in icinde default virtual SMTP server ın ayarlarına gireceksiniz, tabi exchange server kullanıyorsanız bu durumda bu default smtp sunucuyu system manager ın icinde bulabilirsiniz) , sunucunuzun hangi porttan dinlediğine bakın, default olarak port 25 dir, değilse zaten yukardaki koda ozel olarak hangi port olduğunu belirtmeniz yeterli olur. Doğru porta ulaşmaya calıştığınıza eminsiniz ama hala tepki yok diyelim, o zaman bir de smtpserver adresinizi kontrol edin, kodla smtp server aynı makinadaysa localhost yazmak daha yararlı olacaktır. Bunara rağmen ulaşamamanız smtp serverın bir firewall tarafından engellenmekte olduğuna işaret olabilir, sunucunun firewall ayarlarını kontrol edip izinlerinlerin yeterli olduğundan emin olun. Sorun acaba kodda mı diye mi meraklandınız, hemen bir telnet acın (komut isteminden "telnet" yazın. sonra "open 'sunucuadresi' 25" bu tabi 25 porta bağlanır, serverınız başka porttaysa oraya bakın. Eğer serverınız size burdan cevap vermiyorsa sorun serverınızda, ayarlarına ve izinlere bakın, daha detaylı araştırma icin arama motorlarını ziyaret edin.

Diyelim ki bu kodu calıştırdık ama "permission denied" lı bir hata verdi bize mail atma scriptimiz. Bu demektir ki serverımız bizden kullanıcı ve şifre tanımlayarak servera giriş yapmamızı istiyor. İşte burda Authenticate olayı devreye giriyor, boyle mail sunucularına ulaşmak istediğinizde kodunuza şu 3 satırı eklemeniz gerekiyor (tabi postayı gondermeye calışmadan once)

mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1")

mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "kullanıcı adı")

mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "şifre")

İlk satırdaki kod authenticate in tipini belirler, 1 basic authentication icindir, yani şifreniz acık olarak gonderilir ve bu nedenle risklidir, ancak bunu başardıktan sonra kucuk bir araştırmayla diğerlerinde de sorunsuz halledebilirsiniz, bunu sadece ornek olarak verdim. Burda tabi SMTP sunucusu ayarlarımızda "Erişim" sekmesinde "Kimlik Doğrulaması" nın ozelliklerinde "Temel kimlik Doğrulaması" nın acık olması gerekiyor. (basic authentication) diğer tip kimli doğrulamaları icin ayarlar da yine buradan yapılıyor (mesela en yukardaki anonim bağlantıya izin verilip verilmemesi ile ilgili ayardır)Bu kullanıcılar, serverda posta kutusu bulunan, active directory kullanıcıları olabilir.

Burda karşımıza cıkabilecek bir sorun da kodu bir turlu derleyememenizdir(tabi bu satırlardaki bi hata yuzunden), cok olmasa da yine karşılaşılan bi durum, zaten kodu yazarken MailMessage() kısmında altında bir cizgi bıraktığını, fare ile uzerinde beklediğinizde, "type not defined" gibi de bir mesaj verdiğini ve ".Fields not defined" gibi bi derleme cıktısı gorursunuz, bu sizin kendi bilgisayarınızdaki izinlerle ilgili, yonetimsel araclardan "Microsoft .net Frameworks 1.1 Wizards" a girip Adjust .Net Security sekmesini calıştırın, burda gelen izin sayfasında(internet explorer izinleri sayfasına benzer) local ın guvenilirliğini maksimuma getirin, ok deyip kapatın. Artık derlemede buyuk olasılıkla sorun yaşamayacaksınız. Yaşarsanız da nette arama yapma zamanı gelmiş demektir, hata kodunu gormeden bişey soylemek zor acıkcası.

Anonim -Kimlik Doğrulaması Secimi;

Peki neden anonime izin vermek isteriz ya da istemeyiz. Kısaca ozetleyecek olursak, anonime izin verdiğimizde SMTP sunucumuz uzerinden mail gondermek isteyen herkes gonderebilir, herhangi bir şifreye ihtiyac yoktur ve eğer doğru ayarları yapmadıysanız kısa surede sunucunuzun spammer lar tarafından somurulduğunu ve kısa surede de sunucumuzun "block list" lere girmeye başladığını, gonderdiğimiz postaların bir coğununun filtrelerce reddedildiğini, kabul edilenlerin de spam kutularına duştuğunu gorururuz, bu tabi istenen bir durum değildir, peki ne yapmak gerekir bunu engellemek icin. Burda cok duşulen bir hata da bunu cozmek icin kimlik doğrulamalı posta kullanmak gerektiğini sanmaktır. Bu aslında yerine gore doğru bir cozum olabilir, ancak sonucları arasında dışarıdan gonderilen hicbir postayı alamamak da vardır. Bunun nedeni de posta alma ve gonderme sisteminde yatar, birine bir posta gonderdiğinizde sizin Smtp sunucunuz o kişinin Smtp sunucusuna bağlanır ve gonderir, eğer kimlik doğrulaması acıksa sizin Smtp sunucunuz herkese kimlik soracaktır, siz bu kimliği sağlayabilirsiniz, ama bir başkası size posta gonderirken onun smtp sunucusu sizinkine bağlanır ve o sunucu , eğer ozellikle ayarlanmadıysa yani gecerli bir kimliğe sahip değilse sizin smtp sunucunuz tarafından reddedilecektir. Yani SMTP sunucuları hem posta alır hem posta gonderir (tabi daha buyuk sistemlerde bir smtp sunucusu alırken biri gonderiyor olabilir, bunlar daha detaylı işlerdir ve kucuk olcekli yerlerce cok da kullanılmazlar). Yani kısaca Kimlik Doğrulamasını sadece ve sadece eğer smtp sunucumuz ozelse, illa ki sadece bizim ve şifresini bilen, buna gore ayarlanmış başka sunucuların kullanabilmesini istiyorsak (cunku dediğim gibi diğer sunucular da posta iletmek icin sizin smtp sunucunuza bağlanmaktadır) kullanmamız gerekir, SMTP nin tek gorevi posta gondermek değil aynı zamanda almaktır da.Anonimi kapatmak coğu sistem icin pek de tercih edilir değildir kısaca.

Peki bu spammer sorununu nasıl cozmek gerekir, nasıl engelliycez bu adamları da block listlerin dışında kalmayı başarıcaz. İşte burda "Relay" denen olay devreye giriyor, yani Geciş Kısıtlamaları(ilgili ayar sekmesi yine Smtp'nin "erişim" sekmesinde bulunur.) burda "yalnızca aşşağıdaki liste" seceneği seciliyken aşşağıdaki listeye "127.0.0.1" ekleyip, en alttaki kimliği doğrulanan bilgisayarların gecişine izin ver kısmının secili olmadığına emin olmak gerekir.(cunku anonim acıkken gelen her istek kimlik doğrulamasını gecmiş sayılır) Artık bu durumda anonime izin verebilirsiniz. Cunku spammerlar sunucunuz uzerinden posta atmaya calıştıklarında, posta gondermeye calıştıkları posta adresi 127.0.0.1 adresi uzerinde(yani kısacasası sunucu bilgisayardaki posta hesapları arasında) olmadığı icin sunucumuz buna izin vermeyecektir, ancak dışarıdan sizin posta adreslerinize gelen postalar da anonim acık olduğu icin smtp tarafından alınabilecektir.

Not: uzaktaki bir sunucuyla ilgili bir smtp sunucusuysa 127.0.0.1 yerine o sunucusnun adresini vermek gerekir.

Not: Kimlik Doğrulaması ile posta atmak istediğinizde, hem kodlama yaptığınız sistemde hem de sunucunuzda en az .net Framework v1.1 in kurulu olması zorunludur, cunku Fields. ozelliği v1.1 ile geldi, 1.0 da yok.

__________________