"/>"/>
Yazılım Dilleri
Asp.Net 4.5 Kitabı
Skip Navigation Links

C# ile Mail Gönderme

E-Posta gönderme isleminin nasil çalistigini inceleyelim ve C# ile e-posta gönderme uygulamasi hazirlayalim.

C#'ta mail göndermek uygulamasindan önce mail gönderme isleminin nasil çalistigi konusuna biraz deyinelim.

Mail gönderebilmek için bir sunucuda iki adet protokol vardir: Mail Gönderme Protokolü, Mail Alma Protokolü.

Mail Alma Protokolü

Bir e-posta sunucusundaki mailleri alabilmek için kullanilan protokoldür. POP3 ya da IMAP bu protokollerin basindadir.

     POP3 (Post Office Protocol 3)

SMTP olarak adlandirdigimiz protokollerle gönderdigimiz mailler eger kisiye ulasmamissa, otomatik olarak farkli yollar denenir. Farkli yollarla yine ulasmiyorsa bize bir hata mesaji gönderir. Fakat POP3 servisini bir posta kutusu gibi düsünebiliriz. Bir e-posta geldiginde sunucu içerisinde gelen posta kutusuna kaydedilir, kullanici istediginde POP3 servisi ile istedigi yazilimi kullanarak bu postalari alabilmektedir.

     IMAP (Internet Mail Access Protocol)

POP3 gibi, sunucuda kayitli olan e-postalara ulasabilmek için kullanilan bir protokoldür. POP3'ten farki, birden çok bilgisayardan bir mesaja ulasilabilmesidir. POP'da bir e-postaya tek bir bilgisayardan erisim saglanabilmektedir.

Mail Gönderme Protokolü

    SMTP (Simple Mail Tranfer Protocol)

E-Posta göndermek için sunucu ve istemci arasindaki iliskiyi kuran protokoldür. E-Posta gönderme islemini bir örnekle inceleyelim:

Benim mail adresim: veysel@ugurkizmaz.com . Mail gönderme protokolü olarak POP3'ü kullaniyorum. Yani benim web sitemin bulundugu sunucumda POP3 protokolüyle mail gönderen bir mail sunucusu da yer almaktadir. vkizmaz@zirvedekibeyinler.net mail adresine mail gönderdigim zaman mail öncelikle POP3 protokolü ile mail sunucuma gelir, oraya kaydedilir, sunucu maili gönderilecek kisiye iletir.

-------------------------------------------------------

C#'ta e-posta gönderme islemini inceleyelim:

Mail islemlerini yapabilmek için öncelikle using bölümüne asagidaki namespace'i ekleyelim:

using System.Net.Mail;
 
Mail gönderebilmek için bu namespace içerisinde bulunan MailMessage ve SMTPClient siniflarindan faydalanacagiz.
 
Mail mesajimi olusturabilmek için MailMessage sinifi türünden bir degisken olusturmamiz gerekmektedir.
 
MailMessage ePosta = new MailMessage();

ePosta degiskenimiz, göndecegimiz e-posta'mizin bütün elemanlarini bulundurmaktadir.

--------------------------

From : E-Posta'nin kimden gönderilecegi bilgisini tutar. MailAddress türünden bir degisken istemektedir.

ePosta.From = new MailAddress("gonderen@zirvedekibeyinler.net");

--------------------------

To : E-Postanin kime/kimlere gönderilecegi bilgisini tutar.

ePosta.To.Add("alan1@zirvedekibeyinler.net");
ePosta.To.Add("alan2@zirvedekibeyinler.net");
ePosta.To.Add("alan3@zirvedekibeyinler.net");

--------------------------

Attachments : E-Postaya eklenecek eklentilerin bilgisini tutar.

ePosta.Attachments.Add(new Attachment(@"C:\deneme.txt"));

--------------------------

Subject : E-Posta'nin konusu bilgisini tutar.

ePosta.Subject = "Konu";

--------------------------

Body : E-Posta'nin içerik bilgisini tutar.

ePosta.Body = icerik;

--------------------------

SMTPClient : E-Posta'nin gönderilecegi SMTP sunucu ve gönderen kullanicinin bilgilerinin yazilip, MailMessage türünde olusturulan mailin gönderildigi siniftir.

SmtpClient smtp = new SmtpClient();

--------------------------

Credentials : E-Posta'yi gönderen kullanicinin kimlik bilgilerini tutar.

smtp.Credentials = new System.Net.NetworkCredential("gonderen@zirvedekibeyinler.net", "sifre");

--------------------------

Port : SMTP sunucusunun port bilgisini tutar.

smtp.Port = 25;

--------------------------

Host : SMTP sunucusunun isim bilgisini tutar.

smtp.Host = "smtp.zirvedekibeyinler.net";

--------------------------

EnableSsl :Sunucu SSL istiyorsa bu degeri true yapacagiz.

smtp.EnableSsl = true;

--------------------------

SendAsync : E-Posta'yi asenkron olarak gönderir. Yani e-posta gönderilene kadar çalisan thread kapanmaz, gönderme islemi tamamlandiktan sonra kapatilir.

smtp.SendAsync(ePosta, (object)ePosta);

--------------------------

Send : E-Posta'yi gönderme islemini yapar. Sunucuya göre Send ya da SendAsync metodlarindan birisi kullanilir.

smtp.Send(ePosta);

--------------------------

Asagidaki uygulama, C# dili kullanilarak GMAIL hesabindan baska bir hesaba mail gönderme islemini gerçeklestiren fonksiyondur:

 

public bool Gonder(string konu, string icerik)
{
MailMessage ePosta = new MailMessage();
ePosta.From = new MailAddress("posta@gmail.com");
//
ePosta.To.Add("alan1@gmail.com");
ePosta.To.Add("alan2@gmail.com");
ePosta.To.Add("alan3@hotmail.com");
//
ePosta.Attachments.Add(new Attachment(@"C:\deneme.txt"));
//
ePosta.Subject = konu;
//
ePosta.Body = icerik;
//
SmtpClient smtp = new SmtpClient();
//
smtp.Credentials = new System.Net.NetworkCredential("posta@gmail.com", "sifre");
smtp.Port = 587;
smtp.Host = "smtp.gmail.com";
smtp.EnableSsl = true;
object userState = ePosta;
bool kontrol = true;
try
{
smtp.SendAsync(ePosta, (object)ePosta);
}
catch (SmtpException ex)
{
kontrol = false;
System.Windows.Forms.MessageBox.Show(ex.Message, "Mail Gönderme Hatasi");
}
return kontrol;
}

 

Veysel Ugur KIZMAZ

Yorumlar (14)

  1. Avatar
    mehmet x

    18.02.2013

    Teşekkürler güzel yazı olmuş=)

  2. Avatar
    hafize a

    21.03.2013

    bu zor zamanda çok yararlı oldu..cok saolun

  3. Avatar
    SERDAR ALTUNDAL

    31.03.2013

    Emeğinize sağlık olsun

  4. Avatar
    Uygar Akınalan

    04.07.2013

    teşekkürler form arayüzünüde verseydin bilmeyenler için daha güzel olurdu tekrar teşekkürler...

  5. Avatar
    Cem Korkmaz

    30.07.2013

    Çok teşekkürler güzel bir kaynak olmuş.

  6. Avatar
    Önder GÜLER

    16.09.2013

    Uzun süredir aklımda idi sağolun hocam

  7. Avatar
    furkan şimşek

    21.11.2013

    merhaba hocam kitabınızdaki gibi yapıyorum hata alıyorm yardımcı olabilrmisniz :( MailMessage eposta = new MailMessage(); eposta.From = new MailAddress("Gmail Adresim"); eposta.To.Add(kime.Text); eposta.Subject = konu.Text; eposta.Body = icerik.Text; SmtpClient smtp = new SmtpClient(); smtp.Credentials = new NetworkCredential("gmail adresim, "şifrem); smtp.Port = 587; smtp.EnableSsl = true; smtp.Host = "smtp.gmail.com"; smtp.Send(eposta); gönder.Text=("Başarı ile gönderildi"); Çalıştırdıgımda smtp.send kırmızı oluyor ve The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required. Learn more at böyle bir hata veriyor hocam yardımlarınızı beklemekteyim :)

  8. Avatar
    İbrahim Yaman

    10.02.2014

    Öncelikle paylaşım için teşekkür ederim. Ben bir deneme maili göndermeye çalıştım ama olmadı neden olabilir? port numarası mı hatalı acaba? (gamil hesabımdan hotmail hesabıma gönderdim.)

  9. Avatar
    metin tekin

    12.04.2014

    Merhabalar ben hastanede kullanılacak bir otomasyon sistemi yazıyorum hastanede bulunan bölümlerden başka bir bölüme ver aktarmak istiyorum bunu nasıl yapabilirim c# üzerinden bana yardımcı olabilir misiniz?

  10. Avatar
    Alper Kılıçaslan

    28.04.2014

    return Kontrol bi işe yaramiyo ama çok güzel.

  11. Avatar
    Adem Yurtcu

    08.05.2014

    Herşey için teşekkürler yalnız bu gönderdiğimiz mailleri spam olarak alıyor bunu nasıl düzeltebiliriz yardım edebilirseniz sevinirim

  12. Avatar
    ali nazım

    23.05.2014

    hotmail e mail göndermek için aynı işlemleri yapmak yeterlimi

  13. Avatar
    Veysel Uğur KIZMAZ

    20.06.2014

    @Adem: O konu e-posta hesabınızdan çok fazla e-posta gönderilmesinden ya da gönderim yaptığınız domainin güvenilir olmaması (tanınmaması) ile ilgili. İnternet üzerinde bununla ilgili kaynaklar mevcut, araştırabilirsiniz.

  14. Avatar
    Uğur NALBANTOĞLU

    02.12.2014

    Hocam merhaba. Örneğinizde yazdığınız kodları sayfama aktardım. Fakat açıklaması "Bu bağlamda zaman uyumsuz işlemlere izin verilmez. Zaman uyumsuz işlemi başlatan sayfanın Async özniteliğinin true olarak ayarlanmış olması gerekir ve zaman uyumsuz işlem sayfada ancak PreRenderComplete olayından önce başlatılabilir." olan bir hata aldım. Sebebi nedir acaba? Yardımınız için şimdiden teşekkür ederim.

Yorum Yap

Mail listesine katılmak için tıklayınız

Hakkımdaki son bilgilere anlık erişmek için mail listesine katılabilirsiniz.