C#nedir?com
 
YAZAR HAKKINDA
Ethem Evlice
Ethem Evlice
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
2 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler:  ASP.NET Ethem Evlice
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : ASP.NET
Yayınlanma Tarihi : 6.8.2003
Okunma Sayısı : 41653
Yorum Sayısı : 7     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
XML - Deniz Kılınç
emre TAŞ
yazının devamı >
emre TAŞ
Decompiling and Reverse Engineering .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Masaüstü mü ? İnternet Mi? .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
.Net Kavramları - .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Yeni Başlayanlar için - .Net Radyo
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer 'in Blogu
Conda install environment.yml Package 25.2.2020
Turhal Temizer 'in Blogu
Mac OS/X Removing CUDA 25.2.2020
Burak Selim Şenyurt
Sekiz Saatlik Sonsuz Döngü 25.2.2020
Burak Selim Şenyurt
Switch Case Kullanmadan Kod Yazılabilir mi? 25.2.2020
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
SMTP Server Kullanmadan E-mail Gonderme (.NET)
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
    Bilgisayarınızda kurulu olan mail server’ın çalışma mantığı hiç aklınıza geldi mi? Gelmediyse CDONTS örneğiyle açıklayalım:

    Siz bir nesne oluşturursunuz ve bu nesneye e-maili göndermesini söylersiniz. Bu nesnenin yaptığı aslında birkaç dosya işleminden başka bir şey değildir. Önemli olan bundan sonrasıdır. Bu makalede anlatmak istediğimiz de bu işi kendimizin nasıl yapacağıdır. Bir emaili bilgisayarda kurulu olmayan bir mail server olmadan nasıl göndeririz?

    Şimdi bir mail sunucusu(server)’nun çalışma mantığı nedir? İsterseniz bunu aşağıdaki grafik üzerinde açıklayalım.

  1. Öncelikle mail sunucu istemciden email gönderme isteği geldiğinde bunu kabul eder.
  2. Mail sunucu alicinin domain’ine ait MaileXchange kayıtlarını DNS sunucudan ister.
  3. Dns sunucusu cevabını gönderirir.
  4. Mail sunucu öğrenmiş olduğu MX kayıtlarına ait IP kayıtlarına bağlanır. Bu IP adresleri karşı sunucunun IP numaralarıdır.
  5. Bağlantı kurulduktan sonra email isteği iletilir. Karşı taraf alıcı gerçekten varsa bunu kabul eder. Yoksa ya da kota aşımı gibi durumlar söz konusuysa bunu hata kodu olarak iletir.


    Bir mail sunucunun çalışma mantığı aklınıza oturduysa bunu hazırlamış olduğum komponentle nasıl yapacağımızı göstereceğim:

    Windows uygulaması olarak programınızda kullanmak istiyorsanız Erle.dll’e referans verin. Web uygulamasında kullanmak istiyorsanız /bin/ klasörünün içine Erle.dll’i atın.
(Erle.dll aşağıdaki zipli dosyanın içinde)

    Mail bilgileri için MailInfo, bu emaili göndermek için DnsMail sınıfını kullanacağız. Bundan önce bu sınıflar hakkında çok önemli bilgiler vermek istiyorum:

MaiInfo ve DnsMail hakkında önemli bilgiler:
  1. MailInfo’nun Recipients (alıcılar) özelliği aynı olan alan adlarını kabul eder. Kısaca ilk eklenen isim@hotmail.com ise, diğerleri de xxx@hotmail.com, yyy@hotmail.com olmak zorundadır. Eğer bu kurala uymazsanız EmailException istisna durumu fırlatılır.
  2. Sadece alıcı(lar)nın gerçekten var olup olmadığını merak ediyor, emaili göndermek istemiyorsanız MailInfo sınıfının SendMail özelliğini false yapmalısınız. (varsayılan true)
  3. Şimdi gelelim DnsMail’in önemine; Maili göndermek için MailInfo’u DnsMail’e aktarmak gerekir ve Send() metodunu çağırmak gerekir. (SendMail=false ise maili göndermez)
  4. DnsMail’in UseLog özelliğini true yaparsanız ve Closed olayını yakalarsanız karşı sunucu tarafından oluşan logu görebilirsiniz.
  5. DnsMail’in TickCount özelliği mailin kaç ms’de gönderildiğini gösterir.


    Şimdi gelelim DnsMail’in can alıcı noktasına: Olaylar

    Gelişmiş bir uygulama kendini oluşturduğu olaylarla belli eder. DnsMail’in Send() metodunu çağırdığınızda sırasıyla hangi olaylar oluşur?

DnsMail’in Olayları:
  • Resolved: domain.com için herhangi bir MX kaydı veya IP adresi bulunduğunda bu olay gerçekleşir. Bir alan adına ait bu kayıtları bu olayda öğrenebilirsiniz.
  • Connected: Yukarıdaki olaylan sonra bütün IP kayıtlarına emaili gönderesiye kadar bağlanmaya çalışır. Biriyle bağlantı kurulduysa bu olay gerçekleşir ve hangi IP ile bağlandığını öğrenebilirsiniz.
  • Authorized: MailInfo’u yapılandırıken mailserver kullanacağınızı belirttiyseniz ve kullanıcı adı ve şifreyi ayarladıysanız bu olay yetki işleminin başarılı olduğunu söyler.
  • RecipientsAdded: İşte en önemli özellik bu. Alıcılar karşı sunucuya sırasıyla gönderilir ve hepsi gönderildiğinde bu olay gerçekleşir. Bu durumda bu olay içinde hangi kullanıcının gerçekten var olup olmadığını, hangisinin kotasını aştığını öğrenebilirsiniz.
  • Ready: Bu da önemli bir özelliktir. Yukarıdaki olaydan sonra alıcılardan en az 1 tanesi kabul edildiyse bu olay gerçekleşir. Bu durumda MailInfo’nun Subject, Body gibi özelliklerini atayabilirsiniz. Örneğin kullanıcı kayıt sisteminiz var ve kullanıcının email adresine bir yetki kodu göndermek istiyorsunuz. Bu olay gerçekleştiğinde veritabınıza yetki kodunu ve kullanıcı ile bilgileri ekleyip Body özelliğine atama yapmak mantıklı olacaktır. Böylece gereksiz kayıtlar veritabanına eklenmemiş olacaktır.
  • SendProggress: Bu karizmatik bir olaydır. Göndermek istediğiniz içerik çok fazla ve uygulamanızda bir proggress bar kullanıyorsunuz. Emailin gidişiyle ilgili bir ilerleme çubuğu tam size göre ise işte size olay.
  • Sent: Fazla söze gerek yok. Email gönderildi olayıdır.
  • Closed: UseLog özelliğini true yaptıysanız ve oluşan logu görmek istiyorsanız bu olayı kullanmanız gerekir.


    Bu kadar güzel özellikleri ve olayları öğrendikten sonra gelelim bunu uygulamalarımızda nasıl kullanacağımıza. DnsMail geliştirilmeye açık bir sınıftır. Bu sınıftan kendi sınıflarınızı türeterek hayal gücünüze bağlı daha fazla özellik ya da olay ekleyebilirsiniz. Yok benim için bu yeterli diyorsanız işte size her şeyiyle açıklanarak yazılmış bir aspx örneği:

Not:
/bin/ klasörüne Erle.dll dosyasını kopyalamayı unutmayın!

ASPX ÖRNEĞİ:
// Uygulamamıza Erle.DnsMail isim alanını dahil edelim. <%@ Language="C#" Debug="true"%> <%@ Import Namespace="Erle.DnsMail"%> <script runat="server"> void Mail_Resolved(string mailhost, ICollection mx) { // Sırasıyla mx ya da IP kayıtlarını ekrana yazdıralım. Siz başka şeyler de yapabilirsiniz. string[] servers = new string[mx.Count]; mx.CopyTo(servers, 0); Response.Write("<b>@" + mailhost + "</b><ul>"); for (int i = 0; i < servers.Count; i++) Response.Write("<li>" + servers[i]); Response.Write("</ul>"); } void Mail_Connected(string host) { // Bağlanılan IP adresi neresi? Response.Write("<b>Connected host:</b> " + host + "<br>"); } void Mail_RecipientsAdded(IEnumerator records) { /* Burada hangi emailin geçerli olduğunu, hangi emailin kotasını aştığını öğrenebiliriz: * Code: 250: OK, 550: Kullanıcı yok, 552: Kota aşılmış */ Response.Write("<table border=1 bordercolor=000000>"); Response.Write("<tr><td><b>Email</b></td><td><b>Valid</b></td><td><b>Response</b></td></tr>"); while ( records.MoveNext() ) { Recipient rec = records.Current as Recipient; Response.Write( "<tr><td>" + rec.Email + "</td>" + "<td>" + rec.Valid.ToString() + "</td>" + "<td>" + rec.Answer + "</td></tr>\r\n"); } Response.Write("</table>"); } void Mail_Ready(MailInfo mailinfo) { /* BU OLAY GERCEKLESTIYSE EMAILI GÖNDEREBİLME ÖZELLİĞİNİ TRUE YAPABİLİRİZ.*/ mailinfo.SendMail = true; /* Burada gönderilecek mail oluşturulabilir. */ mailinfo.Subject = inputSubject.Value; mailinfo.Body = inputBody.Text; } void Mail_Sent() { /* Email gittiiii. */ EXP.Text = "Başarıyla gönderildi."; } void Mail_Closed(string Log) { /* Oluşan logu göster. */ XXX.Text = Log; } void Mail_SendProgress(int bytesSent, int bytesRemaining) { /* Kaç byte gitti, kaç byte kaldı? */ Response.Write("[" + bytesSent.ToString() + "-" + bytesRemaining.ToString() + "]<br>"); Response.Flush(); } void Submit_Click(object sender, EventArgs e) { // İllaki mail server kullanicaksa aşağıdaki şekilde yazin: // 1.(yetkisiz) // MailInfo mi = new MailInfo("mail.xxx.com"); // 2. (yetki gerekiyor) // MailInfo mi = new MailInfo("mail.xxx.com", "username", "password"); // Mail server kullanmazsanız, alicinin MX kayitlarini bulur ve bu kayitlar // uzerinden gonderir. MailInfo mi = new MailInfo(); mi.From = inputFrom.Value; mi.FromName = inputFromName.Value; mi.Recipients.Add(new Recipient(inputTo.Value)); // ŞİMDİLİK EMAILI GÖNDERMEYELİM. Ready olayında SendMail=true yapalım. mi.SendMail = false; // DnsMail yapilandirilirken mailInfomuzu da aktaralim. DnsMail dm = new DnsMail(mi); // Loglari görmek istedğimiz için true yapıyoruz. Varsayilan (false). dm.UseLog = true; // Bazi önemli olaylari yakalayalim. // Resolved; MX kaydi veya IP varsa oluşur. // RecipientsAdded; Alıcılar eklendiyse oluşur. // Ready; Email gönderilmeye hazir. En az 1 alici karşı sunucu tarafından // kabul edildi demektir. Veritabani işlemlerini bu olayda yapabilirsiniz. // Sent; Mail gönderildiyse oluşur. // Closed; Bağlantı kapandıysa oluşur. Oluşan logu görebilirsiniz. // *** Olayları yakalamak istemiyorsanız önüne yorum işareti (//) koyun. *** dm.Resolved += new ResolvedEventHandler(Mail_Resolved); dm.Connected += new ConnectedEventHandler(Mail_Connected); dm.RecipientsAdded += new RecipientsAddedEventHandler(Mail_RecipientsAdded); dm.Ready += new ReadyEventHandler(Mail_Ready); //dm.Sent += new SentEventHandler(Mail_Sent); dm.Closed += new ClosedEventHandler(Mail_Closed); dm.SendProgress += new ProgressEventHandler(Mail_SendProgress); try { dm.Send(); } catch(Exception exp) { EXP.Text = "Email gönderildi mi: " + mi.Sent.ToString(); XXX.Text = exp.Message; } finally { // Olusturdugumuz nesneleri yok edelim. dm = null; mi= null; } } </script> <form runat="server"> <font face="Verdana, Arial, Helvetica, sans-serif" size="2"><asp:label ID="XXX" runat="server" Text="" /> </font> <hr> <font face="Verdana, Arial, Helvetica, sans-serif" size="2"><asp:label ID="EXP" runat="server" Text="" EnableViewState="false" /> </font> <hr> <font face="Verdana, Arial, Helvetica, sans-serif" size="2"><br> <br> From: <input type="text" id="inputFrom" runat="server" name="text" /> <br> To: <input type="text" id="inputTo" runat="server" name="text2" /> <br> FromName: <input type="text" id="inputFromName" runat="server" name="text2" /> <br> Subject: <input type="text" id="inputSubject" runat="server" name="text2" /> <br> Body: <asp:textbox TextMode="MultiLine" id="inputBody" runat="server" Rows=10 Columns=55 EnableViewState="false" /> <br> <input type="submit" name="Submit" onserverclick="Submit_Click" runat="server" /> </font> </form>


    Bu örneği Windows uygulamarında da kullanabilirsiniz. Yalnız Erle.dll’e referans vermeyi unutmayın!


SONUÇ:

    Bu makalede elimden geldiğince bir mail sunucunun nasıl çalıştığını ve hazırlamış olduğum component’i nasıl kullanabileceğinizi açıkladım. Daha fazla bilgiyi Erle.DnsMail.doc belgesinde bulabilirsiniz. Bu komponent her email gonderilmek istenildiginde DnsServer’ı sorgulamaz. Örneğin hotmail.com’un kayıtları alındığında bunu 2 dakika boyunca hafızada tutar. Her 10 dakikada hafızadaki bütün kayıtları siler.



NOTLAR:

NOT-1:

    Aşağıdaki zipli dosya da sizin için gerekli bütün dosyalar vardır:
  1. Erle.dll: Kullanmanız gereken .net dll’i
  2. Erle.DnsMail.doc: Tam 17 sayfalık açıklamarıyla, uygulamarıyla bir yardım dosyası
  3. mailgonder_cs.aspx: c# örneği
  4. mailgonder_vb.aspx: VB.net örneği
  5. mx_srogula.aspx: Mx kayıtlarının nasıl sorgulandığına dair bir örnek
[Yukarıdaki dosyaların tamamını indirmek için tıklayın!]

NOT-2:

    Bu component için dnsapi.dll dosyasının bilgisayarınızda bulunması gerekir. WinXP ve Win2000 işletim sistemleri ve sonrasında bu dosya bulunmaktadır. Eğer Win98 kullanıyorsanız dnsapi.dll dosyasını internetten bulup C:\System\ klasörüne atarsanız sorun kalmayacaktır.

NOT-3:

    Projenin kaynak kodlarını istiyorsanız belirli bir ücret karşılığında kodlara sahip olabilirsiniz. İletişim için (ev.et [AT] rocketmail.com) email adresini kullanabilirsiniz.
Makale:
SMTP Server Kullanmadan E-mail Gonderme (.NET) ASP.NET Ethem Evlice
  • Yazılan Yorumlar
  • Yorum Yaz
AĞU
24
2005
bencede çok karıştırmış işi
AĞU
10
2005
Sanırım sen sadece email göndermek istiyorsun. Senin için bağlanılan yerin IP si ve Mail sunuculari nedir, kullanici gercekten var mi yok mu, kullanici gercekten varsa bodynin içeriği o anda atamak seni ilgilendirmiyorsa daha kısa bir kod örneği var. Eger kodları biraz anlamaya gayret etseydin işin özetinin şu satırlar olduğunu anlardın: MailInfo mi = new MailInfo() mi.From = gonderen@email.com mi.FromName = Gonderen isim mi.Recipients.Add(new Recipient(alan@kisi.com)) mi.Subject = Konu mi.Body = Mesaj DnsMail dm = new DnsMail(mi) dm.Send()
TEM
26
2005
Çok güzel bir konu da sen bunu çok karışık bir hale getirip zorlaştırmışsın
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor