Visual Basic ile Email Gondermek

Forumda gorduğum bir soru uzerine karar vermiştim bu yazıyı yazmaya ancak zaman bulamadığım icin birkac gun gecikti. O sorunun sahibine olmasa da aynı konuda yardıma ihtiyac duyabilecek arkadaşlar icin Visual Basic ile mail gonderme işlemini becerebildiğimce basite indirgeyerek anlatıyorum. Umarım yararlı olur.

Bu programda 1 form kullanacağız ve formumuzun uzerinde 5 adet textbox olacak ve bunlar yukarıdan aşağıya sırasıyla şu şekilde adlandırılacak: txtserverdomain, txtfromemail, txttoemail, txtsubject, txtmessage. Neyin ne olduğunu karıştırmamak icin metin kutularının karşısına 5 adet label ekleyerek caption değerlerini şu şekilde değiştirin (tekrar yukarıdan aşağıya ve sırayla: Sunucu adresi, Gonderen, Kime, Konu, Mesaj. Son olarak iki adet command button ekleyin ve birinin uzerindeki metni "Gonder" diğerininkini "Cıkış" olarak değiştirin. Uzerinde Gonder yazan command buttonun ismini cmdSend olarak diğerininkini ise cmdExit olarak değiştirin. Son olarak form uzerine bir adette Microsoft Winsock kontrolu ekleyin ve bunuda "w" olarak adlandırın. Form uzerindeki metin kutularını, label leri ve command button ları gozunuze hoş gorunecek sekilde form uzerinde yerleştirin. İşin zor kısmı bitti.

Şimdi aşağıdaki kodu alarak değiştirmeden formunuzun kod penceresine yapıştırın. Daha sonra nerede ne yaptığımızı okuyun..
Option Explicit
Private Response As String

Sub SendEmail(ServerDomain As String, FromEmail As String, ToEmail As String, Subject As String, Body As String)

w.LocalPort = 0

If w.State sckClosed Then w.Close

w.Protocol = sckTCPProtocol
w.RemoteHost = ServerDomain
w.RemotePort = 25
w.Connect

WaitForResponse ("220")

w.SendData "HELO " & ServerDomain & vbCrLf
WaitForResponse ("250")

w.SendData "MAIL FROM: " & vbCrLf
WaitForResponse ("250") 'wait for response

w.SendData "RCPT TO: " & vbCrLf
WaitForResponse ("250") 'wait for response

w.SendData ("data" & vbCrLf)

WaitForResponse ("354")
w.SendData "From: " & FromEmail & vbCrLf
w.SendData "X-Mailer: BASTON SMTP Mailer" & vbCrLf
w.SendData "To: " & ToEmail & vbCrLf
w.SendData "Subject: " & Subject & vbCrLf

w.SendData Body & vbCrLf

w.SendData "." & vbCrLf
WaitForResponse ("250")

w.SendData "quit" & vbCrLf
WaitForResponse ("221")

w.Close
MsgBox "Mesajınız başarıyla gonderildi.", vbExclamation, "Mesajını Gonderildi."
End Sub
Sub WaitForResponse(ResponseCode As String)
Dim Reply As Integer
Dim Start As Single
Dim Tmr As Single
Start = Timer
While Len(Response) = 0
Tmr = Start - Timer
DoEvents
If Tmr > 10 Then
MsgBox "Hata:" + vbCrLf + "İşlem zamanaşımına uğradı!", vbExclamation, "İşlem Başarısız"
Exit Sub
End If
Wend
While Left(Response, 3) ResponseCode
DoEvents
If Tmr > 10 Then
MsgBox "Hata:" + vbCrLf + "Gecersiz bir yanıt alındı: " + Response + vbCrLf + "Expected code: " + ResponseCode, vbExclamation, "İşlem Başarısız."
Exit Sub
End If
Wend
Response = ""
End Sub
Private Sub cmdExit_Click()
Unload Me
End
End Sub
Private Sub cmdSend_Click()
SendEmail txtServerDomain, txtFromEmail, txtToEmail, txtSubject, txtMessage
End Sub
Private Sub w_DataArrival(ByVal bytesTotal As Long)
w.GetData Response
End Sub

03 nolu satırda email gonderme işlemini gercekleştirecek Sub'ı kodlamaya başlıyoruz. Gorduğunuz gibi email gonderme işleminde bazı parametreler kullanıyoruz ve bu satırda kullanacağımız parametrelerin kullanacağı veri turlerini tanımlıyoruz. Bunlar: ServerDomain, FromEmail, ToEmail, Subject ve Body.

06 nolu satırda Winsock nesnesine yerel port olarak 0'ı gosteriyoruz. Bunu yapmazsak programın her calıştırılışında 1 email gonderebiliriz.

08 nolu portta eğer winsock acık ise, kapatıyoruz.
10. satırda programa TCP/IP protokolunu kullanacağımızı belirtiyoruz.
11. satırda kullanacağımız mail sunucusunun adresini belirtiyoruz.
12. satırda mail sunucusuna bağlanmak istediğimiz bağlantı noktasını belirliyoruz. smtp sunucuları varsayılan olarak 25 numaralı portu kullandıklarından bizde 25 numaralı portu kullanmak istediğimizi belirtiyoruz. Ancak bu portu değiştirmeniz gerekebilir. Orneğin bizim networkumuzdeki mail sunucusu farklı bir port kullandığından bu programı kendi mail sunucumuzu kullanarak mail yollamak icin kullanmak istediğimde port numarasını bizim mail sunucumuzun kullandığı portla değiştirmem gerekiyor.
13. satırda karşı bilgisayarla bağlantı kuruyoruz.

Port numaraları değişebilsede asla değişmeyecek bazı şeyler vardır. Pek guclu bir cumle olmasa da anlatmak istediğim; biz mail sunucumuzun konfigurasyonu esnasında kullanacağı portu belirleyebiliriz ancak smtp protokolunun standart olarak kullandığı mesaj kodlarını değiştiremeyiz. Gorduğunuz gibi programımız 15. satırda karşı bilgisayardan bağlantımızın onaylandığına dair bir mesaj bekliyoruz ve bu mesajın kodu 220.
Programımız 220 nolu mesajı alana kadar bekleyecek, bu mesajın karşı bilgisayardan gelmemesi halinde işlemimiz Time Out olacaktır. Karşı taraftan 220 nolu mesaj geldi mi? Devam edelim o zaman..

17. satırda winsock nesnesi ile sunucuya HELO mesajı gonderiyoruz ve mesajımıza karşılık 250 numaralı mesajı bekliyoruz.
Aynı şekilde buradada programımız 250 nolu mesajı alana kadar bekleyecektir.

20. satırda maili gonderenin adresini sunucuya iletiyoruz ve işlemimize karşılık bir yanıt bekliyoruz.

23. satırda mailin kime gittiğini bildiriyoruz.

26. satırda sunucuya başlık "header" ve mesaj bilgilerini iletmeye başlayacağımızı bildiriyoruz ve 354 nolu mesajı bekliyoruz.

29. satırda maili gonderenin email adresini,
30. satırda maili gonderen yazılıma ait bilgileri (bu bilgiyi kendi programınızın ismiyle değiştirin. Tabii baston diye bir email yazılımı hazırlıyorsanız boylede kalabilir),
31. satırda mailin kime gittiğini,
32. satırda mailin başlığını
34. satırda txtMessage adlı text kutusundaki mesajı, yani mail metnini gonderiyoruz.
36. satırda veri/başlıkları sonlandırıyoruz ve bir sonraki satırda 250 nolu mesajın sunucudan gelmesini bekliyoruz.

39. satırda sunucuya quit mesajı gonderiyor ve sunucuya bağlantıyı kapatma isteğimizi bildiriyoruz.
40. satırda sunucudan 221 kodlu mesajı yani sunucunun oturumumuzu kapattığına dair mesajı bekliyoruz.
42. satırda winsock u kapatıyoruz.

Eğer işlemlerin uygulanması esnasında bir sorunla karşılaşılmışsa program bir hata mesajı verecektir. Boyle bir durumda programın hata mesajından sonra kapanmaması icin hata tuzaklama kısmını hazırlamanız gerekiyor. Eğer bir hata ile karşılaşılmamış ve herşey yolunda gitmişse kullanıcıya mailin gonderildiğini bildiriyoruz.

Şimdi (sıralama biraz ters olsa da) maili gonderme işlemi esnasında kullandığımız WaitForResponse sub ını hazırlıyoruz.
Kullanacağımız değişkenleri tanımlıyoruz.
49. satırda bir timer başlatıyoruz ve başlangıc değerini start adlı değişkenimize değer olarak atıyoruz.
51. satırda işlemin başlamasından beri gecen zamanı tesbit ediyoruz.
53.satırda sunucunun bizi yanıtlamaması halinde işlemi zamanaşımına uğradığı icin kesiyoruz.
57. satırdan itibaren sunucudan gecersiz bir mesaj almamız halinde programın uygulayacağı işlemleri kodluyoruz.
69. satırda programı sonlandırmak icin gerekli kodu yazıyoruz.
73. satırda ise mail gondermek icin gerekli komut ve parametrelerini yazıyoruz.

75. satırda (yine hatalı sıralama) mail gonderme işlemi esnasında sunucudan gelen yanıtları almak icin kullanacağımız sub'ı kodluyoruz.

Hepsi bu kadar..

__________________