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: [email protected] 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. [email protected] 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.
--------------------------
To : E-Postanin kime/kimlere gönderilecegi bilgisini tutar.
--------------------------
Attachments : E-Postaya eklenecek eklentilerin bilgisini tutar.
ePosta.Attachments.Add(new Attachment(@"C:\deneme-upload.jpg"));
--------------------------
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.
--------------------------
Port : SMTP sunucusunun port bilgisini tutar.
smtp.Port = 25;
--------------------------
Host : SMTP sunucusunun isim bilgisini tutar.
smtp.Host = "smtp.omercebi.com";
--------------------------
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.Attachments.Add(
new
Attachment(@
"C:\deneme-upload.jpg"
));
//
ePosta.Subject = konu;
//
ePosta.Body = icerik;
//
SmtpClient smtp =
new
SmtpClient();
//
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;
}