VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "SmtpClient"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False

Public Server$
Public ReplyEMail$
Public Recipient$
Public Subject$
Public MailText$
Public LastError$

Private answer%
Private WithEvents Socket As CSocket
Attribute Socket.VB_VarHelpID = -1

Private Sub Class_Initialize()
Set Socket = New CSocket
Socket.LineSeparator = vbCrLf
Server$ = ""
ReplyEMail$ = ""
Recipient$ = ""
Subject$ = ""
MailText$ = ""
LastError$ = ""
End Sub

Private Sub Class_Terminate()
Set Socket = Nothing
End Sub

Public Function Connect%()

If Socket.State = sockConnected Then Disconnect

answer% = 0
Socket.Connect Server$, 25

Do While Socket.State = sockConnecting: DoEvents: Loop
If Socket.State <> sockConnected Then Connect% = False: Exit Function

'erste Zeile abwarten
Do Until answer% <> 0: DoEvents: Loop

'say hello (HELO)
a$ = ReplyEMail$
If InStr(a$, "<") Then sender$ = Trim$(parse$(a$, "<")): email$ = parse$(a$, ">") Else email$ = a$
cmd% = smtpcommand%("HELO " + Mid$(email$, InStr(email$, "@") + 1))

Connect% = cmd% > 0

End Function

Public Function SendMail%()

SendMail% = False

a$ = ReplyEMail$
If InStr(a$, "<") Then sender$ = Trim$(parse$(a$, "<")): email$ = parse$(a$, ">") Else email$ = a$

If smtpcommand%("MAIL FROM: <" + email$ + ">") < 0 Then Exit Function
If smtpcommand%("RCPT TO: <" + Recipient$ + ">") < 0 Then Exit Function
If smtpcommand%("DATA") < 0 Then Exit Function

Socket.SendData "From: " + ReplyEMail$
Socket.SendData "To: " + Recipient$
Socket.SendData "Subject: " + Subject$
Socket.SendData ""
Socket.SendData MailText$
If smtpcommand%(".") < 0 Then Exit Function

SendMail% = True

End Function

Public Sub Disconnect()

If Socket.State = sockConnected Then
   smtpcommand "QUIT"
   Socket.Disconnect
End If

End Sub

Private Function smtpcommand%(cmd$)
smtpcommand% = False
If Socket.State <> sockConnected Then LastError$ = "Not Connected.": Exit Function
Debug.Print "> "; cmd$
answer% = 0
Socket.SendData cmd$
Do Until answer% <> 0: DoEvents: Loop
smtpcommand% = answer%
End Function

Private Function parse$(a$, ch$)
ai% = InStr(a$, ch$)
If ai% = 0 Then
  parse$ = a$: a$ = ""
Else
  parse$ = Left$(a$, ai% - 1): a$ = Mid$(a$, ai% + Len(ch$))
End If
End Function

Private Sub SOCKET_ERROR(Error As Long, Description As String)
LastError$ = Description
answer% = -1
End Sub

Private Sub Socket_LineDataArrival(LineData As String, RemoteHostIP As String)
Debug.Print "< "; LineData
LastError$ = LineData
answer% = Val(parse$((LineData), " "))
End Sub


