Visual Basic ile Email Göndermek
Forumda gördüğüm bir soru üzerine karar vermiştim bu yazıyı yazmaya ancak zaman bulamadığım için birkaç gün gecikti. O sorunun sahibine olmasa da aynı konuda yardıma ihtiyaç duyabilecek arkadaşlar için Visual Basic ile mail gönderme işlemini becerebildiğimce basite indirgeyerek anlatıyorum. Umarım yararlı olur.
Bu programda 1 form kullanacağız ve formumuzun üzerinde 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 için 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, Gönderen, Kime, Konu, Mesaj. Son olarak iki adet command button ekleyin ve birinin üzerindeki metni "Gönder" diğerininkini "Çıkış" olarak değiştirin. Üzerinde Gönder yazan command buttonun ismini cmdSend olarak diğerininkini ise cmdExit olarak değiştirin. Son olarak form üzerine bir adette Microsoft Winsock kontrolü ekleyin ve bunuda "w" olarak adlandırın. Form üzerindeki metin kutularını, label leri ve command button ları gözünüze hoş görünecek sekilde form üzerinde 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: <" & FromEmail & ">" & vbCrLf
WaitForResponse ("250") 'wait for response
w.SendData "RCPT TO: <" & ToEmail & ">" & 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 gönderildi.", vbExclamation, "Mesajını Gönderildi."
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 + "Geçersiz 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 gönderme işlemini gerçekleştirecek Sub'ı kodlamaya başlıyoruz. Gördüğünüz gibi email gönderme işleminde bazı parametreler kullanıyoruz ve bu satırda kullanacağımız parametrelerin kullanacağı veri türlerini tanımlıyoruz. Bunlar: ServerDomain, FromEmail, ToEmail, Subject ve Body.
06 nolu satırda Winsock nesnesine yerel port olarak 0'ı gösteriyoruz. Bunu yapmazsak programın her çalıştırılışında 1 email gönderebiliriz.
08 nolu portta eğer winsock açık ise, kapatıyoruz.
10. satırda programa TCP/IP protokolünü 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. Örneğin bizim networkümüzdeki mail sunucusu farklı bir port kullandığından bu programı kendi mail sunucumuzu kullanarak mail yollamak için 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 güçlü bir cümle olmasa da anlatmak istediğim; biz mail sunucumuzun konfigurasyonu esnasında kullanacağı portu belirleyebiliriz ancak smtp protokolünün standart olarak kullandığı mesaj kodlarını değiştiremeyiz. Gördüğünüz 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ı gönderiyoruz 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 gönderenin 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 gönderenin email adresini,
30. satırda maili gönderen 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 böylede 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 gönderiyoruz.
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ı gönderiyor 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. Böyle bir durumda programın hata mesajından sonra kapanmaması için 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 gönderildiğini bildiriyoruz.
Şimdi (sıralama biraz ters olsa da) maili gönderme 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ıç değerini start adlı değişkenimize değer olarak atıyoruz.
51. satırda işlemin başlamasından beri geçen zamanı tesbit ediyoruz.
53.satırda sunucunun bizi yanıtlamaması halinde işlemi zamanaşımına uğradığı için kesiyoruz.
57. satırdan itibaren sunucudan geçersiz bir mesaj almamız halinde programın uygulayacağı işlemleri kodluyoruz.
69. satırda programı sonlandırmak için gerekli kodu yazıyoruz.
73. satırda ise mail göndermek için gerekli komut ve parametrelerini yazıyoruz.
75. satırda (yine hatalı sıralama) mail gönderme işlemi esnasında sunucudan gelen yanıtları almak için kullanacağımız sub'ı kodluyoruz.
Hepsi bu kadar..