Makale Özeti

SMTP protokolü, MTA MUA nedir? c# ile SMTP protokolünü kullanarak nasıl mail gönderebiliriz? Ornek uygulama SendMailViaSMTP

Makale

C# ile SMTP sunucuları kullanarak mail göndermek

 

Tüm yazılımcı arkadaşlara selamlar,

 

Bu makalemde size SMTP protokolünün işleyişinden ve c# ile SMTP mail sunucularını kullanarak nasıl mail gönderebileceğimizden bahsedeceğim.

 

İlk önce SMTP nedir? MTA MTU nedir? protokol nedir? biraz bu kavramlardan bahsedelim.

 

Protokol – Network üzerinden çalışan yazılımların birbirleri arasında haberleşmeleri için kullandıkları kurallar topluluğuna denir.

 

SMTP Simple Mail Transfer Protocol yani Basit Mesaj Transfer Protokolüdür.İlgili RFC kaydı Ağustos 1982'de yazılmıştır.Outlook uygulamasında bir mail yazdığımız zaman outlook bu maili SMTP

protokolü kurallarına uyarak mail sunucusuna iletir.

 

MTA Mail Transfer Agent - Bugün hepimizin kullanmakta olduğu mail sunucularıdır.

Ornegin Microsoft Exchange Server.

MTU Mail User Agent - Mail yazmak ve okumak için kullandığımız yazılımlardır.

En basit örneği outlook express veya Outlook uygulamaları olacaktır.

 

Aşağıda MTA ve MUA iletişimi ve SMTP protokolü akış diyagramlarını bulabilirsiniz.

 

Peki SMTP protokolünün kuralları nelerdir?

İlk önce yapmak istediğimizi c# kullanmadan yapmamız ve bu protokolün nasıl işlediğini görmemiz gerekir.Çünkü yapmaya çalıştığımız şey tamamen görsellikten uzak, network haberleşmesidir.

MUA kullanmadan ilk mailimizi msdos komut satırını kullanarak göndereceğiz.

 

Diyelimki leventyildiz@gmail.com adresine test konulu bir mesaj gondermek istiyoruz.

Yapmamız gereken command prompt’u çalıştırıp, telnet ile MTA’ya bağlanmaktır.

C:\>telnet mail.somemta.com 25

Bu komutu yazdığımızda MTA bize aşağıdaki gibi bir mesaj gönderecektir.

220 mail.somemta.com ESMTP

Karşı komut olarak aşağıdaki komutu yazın ve enter tuşuna basın

HELO mail.somemta.com

MTA bizden komut beklediğini belirten

250 mail.somemta.com

mesajını gösterecektir.

 

Bu aşamadan sonra yapmamız gereken mailin kim tarafından, kime ve ne içerikle gönderileceğinin bilgisini vermek olacaktır.

 

Mailin kim tarafından gönderildiğini belirtmek için aşağıdaki komutu yazıp enter tuşuna basın.

mail from:lyildiz@somemta.com

sunucu bize komutun alındığına dair aşağıdaki mesajı verecektir.

250 ok

Şimdi mesajı kime göndereceğimizin bilgisini içeren aşağıdaki komutu yazıp enter tuşuna basın.

rcpt to:leventyildiz@gmail.com

yine sunucu bize komutun alındığına dair aşağıdaki mesajı verecektir.

250 ok

 

Buraya kadar sanırım problem yok J

Şimdi mesajımızın içeriğini yazabiliriz.Bu bölümde yazacağımız bilgiler MUA’da görünecek bilgilerdir.Mesajın kimden geldiği kime gittiği mesaj konusu ve içeriği.

Bu detayları girmemiz için aşağıdaki komutu yazıp enter tuşuna basın.

data

sunucu bize komutun alındığına dair aşağıdaki mesajı verecektir.

354  go ahead

 

Bu bölüme kadar yazdığımız komutlar sonucunda enter tuşuna bastığımızda sunucu bizden komutu aldığına dair 250 ok mesajları göndermekteydi.Biz data komutunu yazdıktan sonra bu değişecektir.Artık enter tuşuna bastığımızda sunucudan herhangi bir onay almayacağız.

Bu moddan çıkmak için “<Enter> . <Enter>”  (enter tuşuna basılacak , nokta tuşuna  basılacak, enter tuşuna basılacak) tuşlamamız gerekecektir.

 

Şimdi mesajın içeriğini yazalım.

 

From:Levent YILDIZ ACME Inc.

To:Levent YILDIZ MINDSTORM Inc.

Subject:ilk command prompt emailimiz

 

Bu telnet kullanarak gönderdiğimiz ilk mail

 

.

 

data kısmını yazdıktan sonra sunucu bize maili aldığına dair aşağıdaki gibi bir mesaj gönderecektir.

250 ok 1118680536 qp 21248

Bu mesaj sunucunun tipine göre değişebilir.Önemli olan 250 ok kısmıdır.

 

 

Evet artık mailimizi kontrol edebiliriz.

Eğer bu aşamada herhangi bir sorun ile karşılaşırsanız bu bağlandığınız MTA’nın güvenlik ayarları ile ilgili olabilir.Çoğu sistemler bugün “POP-before-SMTP” yöntemini kullanarak SMTP güvenliğini sağlamaktadır.Yani mail göndermeden önce sunucuya POP protokolü ile bağlanıp uname ve password göndermeniz ve sunucunun bunu doğrulaması gerekir.Bu doğrulama sonucu sunucu size 1 saatliğine SMTP bağlantısı izni verir.

 

Gelelim asıl konuya.Bunu c# kullanarak nasıl gerçekleştireceğiz?

 

Gerekli bütün kod aşağıdadır.Koda bir göz atın…

 

using System;

using System.Net.Sockets;

using System.IO;

 

namespace SendMailviaSMTP

{

       public class SMTPMailSender

       {

              string mvarSMTPServerAddress;

              string mvarSenderName;

              string mvarSenderEmailAddress;

              string mvarRecipientName;

              string mvarRecipientEmailAddress;

              string mvarEmailSubject;

              string mvarEmailBody;

 

              int mvarSMTPTimeOut;

              int mvarSMTPRemotePort;

 

              TcpClient tclSMTP;

              NetworkStream nstSMTP;

              StreamReader strSMTP;

              StreamWriter stwSMTP;

              DateTime dteTimeOutCheck;

 

              public SMTPMailSender()

              {

                     mvarSMTPTimeOut = 60;

                     mvarSMTPRemotePort = 25;

              }

              public bool SendEmail()

              {                   

                     //SMTP sunucusu ile bağlantı kuruluyor

                     //Connecting to SMTP Server

                     tclSMTP=new TcpClient();

                     try

                     {

                           tclSMTP.Connect(mvarSMTPServerAddress,mvarSMTPRemotePort);

                     }

                     catch

                     {

                           return false;

                     }

                     nstSMTP=tclSMTP.GetStream();

                     stwSMTP=new StreamWriter(nstSMTP);

                     strSMTP=new StreamReader(nstSMTP);

                     //mta'dan karşılama mesajı bekleniyor

                     //waiting for greeting message from MTA

                     if (WaitForResponse("220"))

                     {

                           //mta'ya karşılama mesajı gönderiliyor

                           //sending greeting message to MTA

                           stwSMTP.WriteLine("HELO " + mvarSMTPServerAddress);

                           stwSMTP.Flush();

                     }

                     else

                     {

                           tclSMTP.Close();

                           return false;

                     }

                     if (WaitForResponse("250"))

                     {

                           //gönderici email adresi gönderiliyor

                           //sending sender email address to MTA

                           stwSMTP.WriteLine("mail from:" + mvarSenderEmailAddress);

                           stwSMTP.Flush();

                     }

                     else

                     {

                           tclSMTP.Close();

                           return false;

                     }

                     if (WaitForResponse("250"))

                     {

                           //alıcı email adresi gönderiliyor

                           //sending recipient email address to MTA

                           stwSMTP.WriteLine("rcpt to:" + mvarRecipientEmailAddress);

                           stwSMTP.Flush();

                     }

                     else

                     {

                           tclSMTP.Close();

                           return false;

                     }

                     if (WaitForResponse("250"))

                     {

                           //mail'i yazmak için data moduna geçiliyor

                           //switching to data mode for entering body of the mail

                           stwSMTP.WriteLine("data");

                           stwSMTP.Flush();

                     }

                     else

                     {

                           tclSMTP.Close();

                           return false;

                     }

                     if (WaitForResponse("354"))

                     {            

                           //mesajin body kısmı hazırlanıyor

                           //preparing the body section of the email

                           string strSMTPData="";

                           strSMTPData="From:" + mvarSenderName + Environment.NewLine;

                           strSMTPData+="To:" + mvarRecipientName + Environment.NewLine;

                           strSMTPData+="Subject:" + mvarEmailSubject + Environment.NewLine + Environment.NewLine;

                           strSMTPData+=mvarEmailBody + Environment.NewLine + "." + Environment.NewLine;

                           //mesaj gönderiliyor

                           //sending message

                           stwSMTP.Write(strSMTPData);

                           stwSMTP.Flush();

                     }

                     else

                     {

                           tclSMTP.Close();

                           return false;

                     }

                     if (WaitForResponse("250"))

                     {

                           //gönderim başarılı ise değer true döndürülüyor

                           //returns true if the send process succeeds

                           tclSMTP.Close();

                           return true;

                     }

                     else

                     {

                           tclSMTP.Close();

                           return false;

                     }

                     //gönderim başarısız ise değer false döndürülüyor

                     //returns false if the send process fails

                     tclSMTP.Close();

                     return false;

              }

              bool WaitForResponse(string strResponseCode)

              {

                     //zamanaşımı kontrolü için mevcut tarih saat bilgisi alınıyor

                     //gathering current date time data for timeout check

                     dteTimeOutCheck=DateTime.Now;

                     //zamanaşımı değeri bulunuyor

                     //calculating timeout value

                     TimeSpan tsp=DateTime.Now-dteTimeOutCheck;

                     //zamanaşımı değeri kullanıcının belirlediği değeri aşıncaya kadar döngü çalıştırılıyor

                     //looping code until the timeout exceeds the user defined value

                     while(tsp.Seconds<mvarSMTPTimeOut)

                     {

                           //MTA bize herhangi bir mesaj göndermiş mi kontrol ediliyor.

                           //checking if MTA has sent a message to us

                           if (nstSMTP.DataAvailable)

                           {

                                  //eğer göndermişşse mesaj okunuyor

                                  //if so, get the message

                                  string strIncomingData=strSMTP.ReadLine();

                                  //gelen bilginin protokol numarası istenen koda uyuyormu kontrol ediliyor

                                  //checking if the requested protocol number matches the server response

                                  if (strIncomingData.Substring(0,strResponseCode.Length)==strResponseCode)

                                         return true;

                           }

                           //zamanaşımı değeri yeniden hesaplanıyor

                           //recalculating the timeout value

                           tsp=DateTime.Now-dteTimeOutCheck;

                     }

                     return false;

              }

              public string SMTPServerAddress

              {

                     get{return mvarSMTPServerAddress;}

                     set{mvarSMTPServerAddress=value;}

              }

              public string SenderName

              {

                     get{return SenderName;}

                     set{mvarSenderName=value;}

              }            

              public string SenderEmailAddress

              {

                     get{return SenderEmailAddress;}

                     set{mvarSenderEmailAddress=value;}

              }

              public string RecipientName

              {

                     get{return RecipientName;}

                     set{mvarRecipientName=value;}

              }

              public string RecipientEmailAddress

              {

                     get{return RecipientEmailAddress;}

                     set{mvarRecipientEmailAddress=value;}

              }

              public string EmailSubject

              {

                     get{return EmailSubject;}

                     set{mvarEmailSubject=value;}

              }

              public string EmailBody

              {

                     get{return EmailBody;}

                     set{mvarEmailBody=value;}

              }

              public int SMTPTimeOut

              {

                     get{return SMTPTimeOut;}

                     set{mvarSMTPTimeOut=value;}

              }

              public int SMTPRemotePort

              {

                     get{return SMTPRemotePort;}

                     set{mvarSMTPRemotePort=value;}

              }

       }

}

 

Levent YILDIZ

Gulf Agency Company – TURKEY

IT Manager

MCP

msmoracle@hotmail.com

levent.yildiz@gacworld.com

http://www.gacworld.com