SMTP (simple Mail Transfer Protocol) nin amacı e-mailleri bir bilgisayar mail sisteminden diğer bir bilgisayar sistemine transfer etme işlemini yönetmektir. sMTP sadece lokal mail sistemi ile etkileşimde olduğu için hangi mailin sisteme lokal oldugunu görmez. sMTP sadece mail'i bir makineden diğerine gönderip alınırken rol oynar.Bir mail'i başka bir makineye göndermek için sMTP client ilk önce IP hedef adresi dizin servisinden (Domain Name server olarak bilinir) alır. Bu kullanılarak sMTP server hedef host ile bağlantı kurar. Bağlantı kurulduktan sonra client bekleyen mail'i server'a transfer etmeye başlar.
Bunun için Marshallsoft’un internet'te free olarak yayımladığı librarysini kullandım. Visual Basic için sMTP/POP3 Email Engine librarysinde (sEE4VB) mail gönderip almak ile ilgili fonksiyonlar bulunuyor. Mail gönderirken dosya da attach edebiliyoruz ve mail'leride uzantısı mai olan ve aktif dizin altında Mail alt dizini olarak yarattığımız dizine kaydedebiliyoruz. Aynı şekilde mail'e attach edilmiş dosyaları da yine aktif dizindeki Attach alt dizinine kaydediyoruz.
Programımızın çalışması için gerekli library sEE32.DLL C:Windows un yada C:WINNT altına kopyalanmalıdır.(Daha fazla bilgi için web adresi marshallsoft.com) Aşağıdaki kodlar mail gönderme formuna aittir (frmsend) , librarynin özelliğinden dolayı mail To ve From adresleri <,> delimiterları içine alınır.(Mformat fonksiyonu ile).Mail gönderildikten sonra da delimiterlar adresten çıkarılır (MUnFormat ile).
Private sub cmdsend_Click()
Dim Code As Long
Dim Length As Long
Dim Bytessent As Long
Dim Nullstring As string
Dim Temp As string * 256
Dim TheFile As string
Dim Msg As string
Dim NL As string
On Error GoTo MailerErrorHandler
Nullstring = Chr$(0)
NL = Chr$(13) + Chr$(10)
eResult.Text = ""
'check that sMTP server name has been specifed
If Len(eserver.Text) = 0 Then
eResult.Text = Time$ & " sMTP server girilmemiş."
Exit sub
End If
'check "From" email address
If Len(eFrom.Text) = 0 Then
eResult.Text = Time$ & " 'Email From' adresi girilmemiş."
Exit sub
Else
eFrom = MFormat(eFrom) 'mail adresini < > delimiterları içine alır
Code = seeVerifyFormat(eFrom.Text)
If Code < 0 Then
'error in format
eResult.Text = "Hataly 'EMail From' adresi"
eFrom.Text = MUnFormat(eFrom)
Exit sub
End If
End If
"'To" email adresi kontrolü
If Len(eTo.Text) = 0 Then
eResult.Text = Time$ & " 'Email To' adresi girilmemiş."
Exit sub
Else
eTo = MFormat(eTo) 'mail adresini < > delimiterları içine alır
Code = seeVerifyFormat(eTo.Text)
If Code < 0 Then
'error in format
eResult.Text = "Hataly 'EMail To' adresi"
eTo.Text = MUnFormat(eTo)
Exit sub
End If
End If
' attach edilmiş dosya var mı?
If Len(eAttach.Text) > 0 Then
TheFile = eAttach.Text
Open TheFile For Input As 1
Close 1
End If
' mesaj kontrolü
Length = Len(eMessage.Text)
If Length > 0 Then
If Left$(eMessage.Text, 1) = "@" Then
' mesajlar "@" ile başlar
TheFile = Right$(eMessage.Text, Length - 1)
Open TheFile For Input As 1
Close 1
End If
End If
' email mesajı gönderilir
cmdsend.Enabled = False
eResult.Text = Time$ & " Email gönderiliyor..."
'log dosyası set edilir
Code = seestringParam(sEE_LOG_FILE, "mailer.log")
'server a baglanılır
eResult.Text = Time$ & eserver.Text & " sMTP serverına bağlanılıyor "
Code = seesmtpConnect(eserver.Text, eFrom.Text, Nullstring)
If Code < 0 Then
'bağlantıda hata varsa kullanıcı mesajla uyarılır
Call showError(frmsend, Code, "seesmtpConnect: ")
cmdsend.Enabled = True
Code = seeClose()
Exit sub
End If
' server IP adresi alınır
Code = seeDebug(sEE_GET_sERVER_IP, Temp, 40)
eResult.Text = Time$ & Left$(Temp, Code) & " IP ile bağlanılıyor. "
' AUTO CALL disable edilir
Code = seeIntegerParam(sEE_AUTO_CALL_DRIVER, 0)
' setup to send the email
Code = seesendEmail(eTo.Text, Nullstring, Nullstring, esubject.Text, eMessage.Text, eAttach.Text)
If Code < 0 Then
'email gönderilirken hata olu?tu ise
Call showError(frmsend, Code, "seesendEmail: ")
cmdsend.Enabled = True
Code = seeClose()
Exit sub
End If
'emaili gönderecek sürücüyü çalıştır
Do
' sonraki durumu çalıştır
Code = seeDriver()
If Code = 0 Then
' driver is done
Exit Do
End If
If Code < 0 Then
'driver returned error
Call showError(frmsend, Code, "seeDriver: ")
Exit Do
End If
' driver not yet done, so report progress.
Bytessent = seestatistics(sEE_GET_TOTAL_BYTEs_sENT)
eResult.Text = Time$ & " " & str(Bytessent) + " bytes sent."
Loop
' AUTO CALL'u geçerli hale getir
Code = seeIntegerParam(sEE_AUTO_CALL_DRIVER, 1&)
eResult.Text = Time$ & " Email has been sent (" & str$(Bytessent) & " bytes)"
'Delimiterlar silinir
eTo.Text = MUnFormat(eTo)
eFrom.Text = MUnFormat(eFrom)
cmdsend.Enabled = True
Code = seeClose()
Exit sub
MailerErrorHandler:
select Case Err
Case 53: Msg = "VB Hatası 53: File " & TheFile & " bulunmuyor."
Case 76: Msg = "VB Error: " & TheFile & " yolu bulunmuyor."
Case Else: Msg = "VB " & Err & " hatası oluştu."
End select
eResult.Text = eResult.Text + Msg + NL
MsgBox Msg
Resume Next
End sub
Mail almak için POP3 server'ın ismi, kullanıcı ismi ve kullanıcının şifresi gereklidir. İlgili form (frmGet) :
Private sub cmdGet_click()
' Emailler aktif dizin altyndaki Mail altdizinine kaydedilir
' Attachmentlar aktif dizin altyndaki Attachment altdizinine kaydedilir
' Dim i As Integer
Dim N As Integer
Dim Code As Long
Dim NbrMsg As Long
static Buffer As string * 1024
static Temp As string * 256
Dim NL As string
static FileName As string * 64
static EmailDir As string * 64
static AttachDir As string * 64
Dim BytesRead As Long
Dim AttachCount As Long
Dim Nullstring As string
Nullstring = Chr$(0)
EmailDir = ".Mail" + Chr$(0)
AttachDir = ".Attachment" + Chr$(0)
NL = Chr$(13) + Chr$(10)
eMessage.Text = ""
eResult.Text = ""
' POP3 server isminin girilip girilmediğinin kontrolü
If Len(eserver.Text) = 0 Then
eResult.Text = Time$ + " POP3 server ismi girilmemiş."
Exit sub
End If
'Kullanıcı ismi kontrolu
If Len(eUser.Text) = 0 Then
eResult.Text = Time$ + " Kullanıcı ismi girilmemiş."
Exit sub
End If
'Şifre Kontrolu
If Len(ePass.Text) = 0 Then
eResult.Text = Time$ + " Şifre girilmemiş."
Exit sub
End If
' log file set edilir
Code = seestringParam(sEE_LOG_FILE, "READER.LOG")
'connect to server
cmdGet.Enabled = False
eResult.Text = Time$ & eserver.Text & " POP3 server'a ba?lanylyyor."
Code = seePop3Connect(eserver.Text, eUser.Text, ePass.Text)
If Code < 0 Then
'bağlantıda hata
Call showError(frmGet, Code, "seePop3Connect:")
Code = seeClose()
cmdGet.Enabled = True
Exit sub
End If
' prefix attachment filenames with "1-", "2-", etc.
Code = seeIntegerParam(sEE_FILE_PREFIX, 1)
' server IP si alınır
Code = seeDebug(sEE_GET_sERVER_IP, Temp, 40)
eResult.Text = Time$ & Left$(Temp, Code) & " IP ile ba?lanylyyor "
' Bekleyen mesajların sayısı alınır
NbrMsg = seeGetEmailCount()
If NbrMsg < 0 Then
Call showError(frmGet, Code, "seeGetEmailCount:")
Code = seeClose()
cmdGet.Enabled = True
Exit sub
End If
eMessage.Text = str$(NbrMsg) & " email bekliyor." & NL
If NbrMsg = 0 Then
eResult.Text = Time$ & " server'da bekleyen emailiniz yok."
Else
eResult.Text = Time$ & " " & str$(NbrMsg) & " adet mesaj bekliyor."
' emailler okunur
For i = 1 To NbrMsg
' email için dosya ismi hazırlanır [NULL ile bitmelidir]
FileName = "Email" + LTrim$(str$(i)) + ".mai" + Chr$(0)
eMessage.Text = eMessage.Text & RTrim(FileName) & " olarak kaydedildi" & "..."
' AUTO CALL disable edilir
Code = seeIntegerParam(sEE_AUTO_CALL_DRIVER, 0)
' Okunan mail set edilir
Code = seeGetEmailFile(i, FileName, EmailDir, AttachDir)
'seeDriver kullanılarak email okunur
Do
' execute next state [reading message I]
Code = seeDriver()
If Code = 0 Then
' driver is done
Exit Do
End If
If Code < 0 Then
'driver returned error
Call showError(frmGet, Code, "seeDriver:")
Exit sub
End If
BytesRead = seestatistics(sEE_GET_TOTAL_BYTEs_READ)
eResult.Text = str(BytesRead) + " bytes read."
Loop
'email okunmuştur
BytesRead = seestatistics(sEE_GET_TOTAL_BYTEs_READ)
AttachCount = seestatistics(sEE_GET_ATTACH_COUNT)
eMessage.Text = eMessage.Text & " (" & str$(BytesRead) & " byte;"
eMessage.Text = eMessage.Text & str$(AttachCount) & " attachment)" & NL
' AUTO CALL enable edilir
Code = seeIntegerParam(sEE_AUTO_CALL_DRIVER, 1&)
Next i
For i = NbrMsg To 1 step -1
' email serverdan silinir
Code = seeDeleteEmail(i)
If Code >= 0 Then
eMessage.Text = eMessage.Text & str$(i) + " email server'dan silindi." & NL
Else
eMessage.Text = eMessage.Text & "serverdan mail silerken hata olu?tu." & NL
End If
Next i
End If
Code = seeClose()
cmdGet.Enabled = True
eResult.Text = Time$ & " Tüm emailler okundu."
End sub
Bunun için Marshallsoft’un internet'te free olarak yayımladığı librarysini kullandım. Visual Basic için sMTP/POP3 Email Engine librarysinde (sEE4VB) mail gönderip almak ile ilgili fonksiyonlar bulunuyor. Mail gönderirken dosya da attach edebiliyoruz ve mail'leride uzantısı mai olan ve aktif dizin altında Mail alt dizini olarak yarattığımız dizine kaydedebiliyoruz. Aynı şekilde mail'e attach edilmiş dosyaları da yine aktif dizindeki Attach alt dizinine kaydediyoruz.
Programımızın çalışması için gerekli library sEE32.DLL C:Windows un yada C:WINNT altına kopyalanmalıdır.(Daha fazla bilgi için web adresi marshallsoft.com) Aşağıdaki kodlar mail gönderme formuna aittir (frmsend) , librarynin özelliğinden dolayı mail To ve From adresleri <,> delimiterları içine alınır.(Mformat fonksiyonu ile).Mail gönderildikten sonra da delimiterlar adresten çıkarılır (MUnFormat ile).
Private sub cmdsend_Click()
Dim Code As Long
Dim Length As Long
Dim Bytessent As Long
Dim Nullstring As string
Dim Temp As string * 256
Dim TheFile As string
Dim Msg As string
Dim NL As string
On Error GoTo MailerErrorHandler
Nullstring = Chr$(0)
NL = Chr$(13) + Chr$(10)
eResult.Text = ""
'check that sMTP server name has been specifed
If Len(eserver.Text) = 0 Then
eResult.Text = Time$ & " sMTP server girilmemiş."
Exit sub
End If
'check "From" email address
If Len(eFrom.Text) = 0 Then
eResult.Text = Time$ & " 'Email From' adresi girilmemiş."
Exit sub
Else
eFrom = MFormat(eFrom) 'mail adresini < > delimiterları içine alır
Code = seeVerifyFormat(eFrom.Text)
If Code < 0 Then
'error in format
eResult.Text = "Hataly 'EMail From' adresi"
eFrom.Text = MUnFormat(eFrom)
Exit sub
End If
End If
"'To" email adresi kontrolü
If Len(eTo.Text) = 0 Then
eResult.Text = Time$ & " 'Email To' adresi girilmemiş."
Exit sub
Else
eTo = MFormat(eTo) 'mail adresini < > delimiterları içine alır
Code = seeVerifyFormat(eTo.Text)
If Code < 0 Then
'error in format
eResult.Text = "Hataly 'EMail To' adresi"
eTo.Text = MUnFormat(eTo)
Exit sub
End If
End If
' attach edilmiş dosya var mı?
If Len(eAttach.Text) > 0 Then
TheFile = eAttach.Text
Open TheFile For Input As 1
Close 1
End If
' mesaj kontrolü
Length = Len(eMessage.Text)
If Length > 0 Then
If Left$(eMessage.Text, 1) = "@" Then
' mesajlar "@" ile başlar
TheFile = Right$(eMessage.Text, Length - 1)
Open TheFile For Input As 1
Close 1
End If
End If
' email mesajı gönderilir
cmdsend.Enabled = False
eResult.Text = Time$ & " Email gönderiliyor..."
'log dosyası set edilir
Code = seestringParam(sEE_LOG_FILE, "mailer.log")
'server a baglanılır
eResult.Text = Time$ & eserver.Text & " sMTP serverına bağlanılıyor "
Code = seesmtpConnect(eserver.Text, eFrom.Text, Nullstring)
If Code < 0 Then
'bağlantıda hata varsa kullanıcı mesajla uyarılır
Call showError(frmsend, Code, "seesmtpConnect: ")
cmdsend.Enabled = True
Code = seeClose()
Exit sub
End If
' server IP adresi alınır
Code = seeDebug(sEE_GET_sERVER_IP, Temp, 40)
eResult.Text = Time$ & Left$(Temp, Code) & " IP ile bağlanılıyor. "
' AUTO CALL disable edilir
Code = seeIntegerParam(sEE_AUTO_CALL_DRIVER, 0)
' setup to send the email
Code = seesendEmail(eTo.Text, Nullstring, Nullstring, esubject.Text, eMessage.Text, eAttach.Text)
If Code < 0 Then
'email gönderilirken hata olu?tu ise
Call showError(frmsend, Code, "seesendEmail: ")
cmdsend.Enabled = True
Code = seeClose()
Exit sub
End If
'emaili gönderecek sürücüyü çalıştır
Do
' sonraki durumu çalıştır
Code = seeDriver()
If Code = 0 Then
' driver is done
Exit Do
End If
If Code < 0 Then
'driver returned error
Call showError(frmsend, Code, "seeDriver: ")
Exit Do
End If
' driver not yet done, so report progress.
Bytessent = seestatistics(sEE_GET_TOTAL_BYTEs_sENT)
eResult.Text = Time$ & " " & str(Bytessent) + " bytes sent."
Loop
' AUTO CALL'u geçerli hale getir
Code = seeIntegerParam(sEE_AUTO_CALL_DRIVER, 1&)
eResult.Text = Time$ & " Email has been sent (" & str$(Bytessent) & " bytes)"
'Delimiterlar silinir
eTo.Text = MUnFormat(eTo)
eFrom.Text = MUnFormat(eFrom)
cmdsend.Enabled = True
Code = seeClose()
Exit sub
MailerErrorHandler:
select Case Err
Case 53: Msg = "VB Hatası 53: File " & TheFile & " bulunmuyor."
Case 76: Msg = "VB Error: " & TheFile & " yolu bulunmuyor."
Case Else: Msg = "VB " & Err & " hatası oluştu."
End select
eResult.Text = eResult.Text + Msg + NL
MsgBox Msg
Resume Next
End sub
Mail almak için POP3 server'ın ismi, kullanıcı ismi ve kullanıcının şifresi gereklidir. İlgili form (frmGet) :
Private sub cmdGet_click()
' Emailler aktif dizin altyndaki Mail altdizinine kaydedilir
' Attachmentlar aktif dizin altyndaki Attachment altdizinine kaydedilir
' Dim i As Integer
Dim N As Integer
Dim Code As Long
Dim NbrMsg As Long
static Buffer As string * 1024
static Temp As string * 256
Dim NL As string
static FileName As string * 64
static EmailDir As string * 64
static AttachDir As string * 64
Dim BytesRead As Long
Dim AttachCount As Long
Dim Nullstring As string
Nullstring = Chr$(0)
EmailDir = ".Mail" + Chr$(0)
AttachDir = ".Attachment" + Chr$(0)
NL = Chr$(13) + Chr$(10)
eMessage.Text = ""
eResult.Text = ""
' POP3 server isminin girilip girilmediğinin kontrolü
If Len(eserver.Text) = 0 Then
eResult.Text = Time$ + " POP3 server ismi girilmemiş."
Exit sub
End If
'Kullanıcı ismi kontrolu
If Len(eUser.Text) = 0 Then
eResult.Text = Time$ + " Kullanıcı ismi girilmemiş."
Exit sub
End If
'Şifre Kontrolu
If Len(ePass.Text) = 0 Then
eResult.Text = Time$ + " Şifre girilmemiş."
Exit sub
End If
' log file set edilir
Code = seestringParam(sEE_LOG_FILE, "READER.LOG")
'connect to server
cmdGet.Enabled = False
eResult.Text = Time$ & eserver.Text & " POP3 server'a ba?lanylyyor."
Code = seePop3Connect(eserver.Text, eUser.Text, ePass.Text)
If Code < 0 Then
'bağlantıda hata
Call showError(frmGet, Code, "seePop3Connect:")
Code = seeClose()
cmdGet.Enabled = True
Exit sub
End If
' prefix attachment filenames with "1-", "2-", etc.
Code = seeIntegerParam(sEE_FILE_PREFIX, 1)
' server IP si alınır
Code = seeDebug(sEE_GET_sERVER_IP, Temp, 40)
eResult.Text = Time$ & Left$(Temp, Code) & " IP ile ba?lanylyyor "
' Bekleyen mesajların sayısı alınır
NbrMsg = seeGetEmailCount()
If NbrMsg < 0 Then
Call showError(frmGet, Code, "seeGetEmailCount:")
Code = seeClose()
cmdGet.Enabled = True
Exit sub
End If
eMessage.Text = str$(NbrMsg) & " email bekliyor." & NL
If NbrMsg = 0 Then
eResult.Text = Time$ & " server'da bekleyen emailiniz yok."
Else
eResult.Text = Time$ & " " & str$(NbrMsg) & " adet mesaj bekliyor."
' emailler okunur
For i = 1 To NbrMsg
' email için dosya ismi hazırlanır [NULL ile bitmelidir]
FileName = "Email" + LTrim$(str$(i)) + ".mai" + Chr$(0)
eMessage.Text = eMessage.Text & RTrim(FileName) & " olarak kaydedildi" & "..."
' AUTO CALL disable edilir
Code = seeIntegerParam(sEE_AUTO_CALL_DRIVER, 0)
' Okunan mail set edilir
Code = seeGetEmailFile(i, FileName, EmailDir, AttachDir)
'seeDriver kullanılarak email okunur
Do
' execute next state [reading message I]
Code = seeDriver()
If Code = 0 Then
' driver is done
Exit Do
End If
If Code < 0 Then
'driver returned error
Call showError(frmGet, Code, "seeDriver:")
Exit sub
End If
BytesRead = seestatistics(sEE_GET_TOTAL_BYTEs_READ)
eResult.Text = str(BytesRead) + " bytes read."
Loop
'email okunmuştur
BytesRead = seestatistics(sEE_GET_TOTAL_BYTEs_READ)
AttachCount = seestatistics(sEE_GET_ATTACH_COUNT)
eMessage.Text = eMessage.Text & " (" & str$(BytesRead) & " byte;"
eMessage.Text = eMessage.Text & str$(AttachCount) & " attachment)" & NL
' AUTO CALL enable edilir
Code = seeIntegerParam(sEE_AUTO_CALL_DRIVER, 1&)
Next i
For i = NbrMsg To 1 step -1
' email serverdan silinir
Code = seeDeleteEmail(i)
If Code >= 0 Then
eMessage.Text = eMessage.Text & str$(i) + " email server'dan silindi." & NL
Else
eMessage.Text = eMessage.Text & "serverdan mail silerken hata olu?tu." & NL
End If
Next i
End If
Code = seeClose()
cmdGet.Enabled = True
eResult.Text = Time$ & " Tüm emailler okundu."
End sub

