Code updated For 5.20+ (same As SendMail())
Restored from previous forum. Originally posted by Berikco.
Here example that checks the 220 reply , thx fweil

I use the RegisterWindowMessage_ API to generate my owne message , PB_TCP_MESSAGE.
So you get a message when there is data to be read.
Code: Select all
Global SMTPserver$, Sender$, Receiver$,domain$
SMTPserver$ = "192.168.4.1" ; ip SMTP server
Sender$="somebody@server.com" ; Sender e-mail
Domain$="server.com"; Sender domain, everyting after the @
Receiver$="nobody@far.west" ; receiver e-mail
#sockaddr_size = 16
#SOCK_STREAM = 1
#AF_INET = 2
#WSA_DESCRIPTIONLEN = 256
#WSA_DescriptionSize = 257
#WSA_SYS_STATUS_LEN = 128
#WSA_SysStatusSize = 129
#MAXGETHOSTSTRUCT = 1024
Structure sockaddress
sin_family.w
sin_port.w
sin_addr.l
sin_zero.s
EndStructure
Structure WSADataType
wVersion.w
wHighVersion.w
szDescription.s[#WSA_DescriptionSize]
szSystemStatus.s[#WSA_SysStatusSize]
iMaxSockets.w
iMaxUdpDg.w
lpVendorInfo.l
EndStructure
#FD_READ = $1
#FD_ACCEPT = $8
#FD_CONNECT = $10
#FD_CLOSE = $20
Global Socket_Number.w
Global Read_Sock.l
Global Read_Sock_Buffer.sockaddress
Global Start_up_Data.WSADataType
Global Socket_Buffer.sockaddress
Global Read_Buffer$
Global ontvangen$
Global timer1
#timeout=10
Global crlf$
crlf$=Chr(13)+Chr(10)
Global RC.l, X.l, Bytes.l
Global RemoteIP.l
Global RemotePort.l
remoteport = 25
PB_TCP_MESSAGE = RegisterWindowMessage_("WM_TCPMESSAGE_PB")
Debug "message is :"+Str(PB_TCP_MESSAGE)
#hostent_size = 16
#receive=1
Global hwnd
hwnd= OpenWindow(1, 200, 200, 673, 455,"test" ,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
Procedure Connect_winsock()
Socket_Number.w = SOCKET_(#AF_INET, #SOCK_STREAM, 0)
Debug "Socket_Number: " + Str(Socket_Number.w)
If Socket_Number.w <> 0
X = WSACleanup_()
ProcedureReturn 0
EndIf
EndProcedure
Procedure cleanup_winsock()
RC = WSACleanup_()
Debug "WSACleanup() = " + Str(RC)
EndProcedure
Procedure Zend(zbuf$)
Debug zbuf$
send=send_(Socket_Number.w, @zbuf$, Len(zbuf$), 0)
EndProcedure
Procedure receive_TCP()
Read_Buffer$=Space(1024)
Bytes = recv_(Socket_Number, @Read_Buffer$, 1024, 0)
If Bytes <> 0
ontvangen$ = Left(Read_Buffer$, Bytes)
Debug ontvangen$
EndIf
EndProcedure
Procedure check_smtp(reply$)
timer1=0
Repeat
WaitWindowEvent()
If Timer1 > #timeout
ProcedureReturn 0
EndIf
Until Left(ontvangen$, 4) = reply$
ontvangen$ = ""
ProcedureReturn 1
EndProcedure
Procedure SendMail()
RC = WSACleanup_()
RC = WSAStartup_($101, @Start_up_Data)
RemoteIP = inet_addr_(SMTPserver$)
If RemoteIP > 0
Connect_winsock()
If check_smtp("220 ")=1
zend("HELO "+domain$ + crlf$ )
If check_smtp("250 ")=1
zend("MAIL From: " + crlf$)
If check_smtp("250 ")
zend("RCPT To: " + crlf$)
If check_smtp("250 ")
zend("DATA" + crlf$)
If check_smtp("354 ")
zend("X-Mailer: PB testapp" + crlf$)
zend("Date: Sat, 28 Sep 2002 22:50:23 +0100 (GMT)" + crlf$)
zend("From: "+Sender$+ crlf$)
zend("To: "+receiver$ + crlf$)
zend("Subject: testing mail" + crlf$)
zend( crlf$ )
zend("Hello world..." + crlf$)
zend( crlf$ + "." + crlf$)
If check_smtp("250 ")
zend("QUIT" + crlf$ )
check_smtp("221 ")
closesocket_(Socket_Number)
timer1=0
Repeat
rc= WSACleanup_()
WindowEvent()
Until rc=-1 Or timer1>5
ProcedureReturn 1
Else
send_ok=-1
EndIf
Else
zend("QUIT" + crlf$ )
EndIf
Else
zend("QUIT" + crlf$ )
EndIf
Else
zend("QUIT" + crlf$ )
EndIf
Else
zend("QUIT" + crlf$ )
EndIf
EndIf
EndIf
ProcedureReturn -1
EndProcedure
Procedure MyWindowCallback(WindowID, Message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
Select message
Case PB_TCP_MESSAGE
receive_TCP()
result=0
Case #WM_TIMER
result=0
Select wparam
Case 1
timer1 +1
If timer1>$FFFFFF
timer1=0
EndIf
EndSelect
EndSelect
ProcedureReturn Result
EndProcedure
If hwnd
ButtonGadget(1, 25, 11, 50, 19, "TestMail" ,#PB_Text_Center )
SetWindowCallback(@MyWindowCallback())
; -------------- timers ----------------
SetTimer_(hWnd,1,1000,0) ; 1 seconden timer
; SetTimer_(hWnd,2,50,0) ; 50 milisecond timer
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_Gadget
Select EventGadget()
Case 1
SendMail()
EndSelect
EndIf
Until eventid=#PB_Event_CloseWindow
EndIf
End
Regards,
Berikco
http://www.benny.zeb.be