'=========================================================================== ' Subject: SMTP EXAMPLE FOR PB/DLL 6.0 Date: 05-24-99 (17:34) ' Author: Dave Navarro, Jr. Code: PBDLL ' Origin: dave@powerbasic.com Packet: PBDLL.ABC '=========================================================================== '============================================================================== ' ' SMTP example for PB/DLL 6.0 ' Copyright (c) 1999 PowerBASIC, Inc. ' '============================================================================== #COMPILE EXE #INCLUDE "WIN32API.INC" '------------------------------------------------------------------------------ $mailhost = "pop.yourserver.com" $mailfrom = "Your Name
" GLOBAL hServer AS LONG GLOBAL hFrom AS LONG GLOBAL hTo AS LONG GLOBAL hSubject AS LONG GLOBAL hMessage AS LONG GLOBAL hDlgMain AS LONG '------------------------------------------------------------------------------ FUNCTION MakeFont(BYVAL Font AS STRING, BYVAL PointSize AS LONG) AS LONG LOCAL hDC AS LONG LOCAL CyPixels AS LONG hDC = GetDC(%HWND_DESKTOP) CyPixels = GetDeviceCaps(hDC, %LOGPIXELSY) ReleaseDC %HWND_DESKTOP, hDC PointSize = (PointSize * CyPixels) \ 72 FUNCTION = CreateFont(0 - PointSize, 0, 0, 0, %FW_NORMAL, 0, 0, 0, _ %ANSI_CHARSET, %OUT_TT_PRECIS, %CLIP_DEFAULT_PRECIS, _ %DEFAULT_QUALITY, %FF_DONTCARE, BYCOPY Font) END FUNCTION '------------------------------------------------------------------------------ FUNCTION SendMail() AS LONG LOCAL Msg AS STRING LOCAL Buffer AS STRING LOCAL localhost AS STRING LOCAL hTcp AS LONG LOCAL position AS LONG LOCAL length AS LONG LOCAL hCursor AS LONG IF GetWindowTextLength(hServer) = 0 OR _ GetWindowTextLength(hFrom) = 0 OR _ GetWindowTextLength(hTo) = 0 THEN MsgBox "One or more of the required fields is empty.",,"Data Error!" GOTO Done END IF MOUSEPTR 11 ' ** Get the local host name HOST ADDR TO hTCP HOST NAME hTCP TO localhost ' ** Connect to mail server DIALOG DOEVENTS hTCP = FREEFILE CONTROL GET TEXT hDlgMain, 101 TO Buffer TCP OPEN "smtp" AT Buffer AS hTCP IF ERR THEN Buffer = "Error connecting to mailhost" GOTO SendError ELSE TCP LINE hTCP, Buffer IF LEFT$(Buffer, 3) <> "220" THEN GOTO SendError END IF END IF ' ** Greet the mailhost DIALOG DOEVENTS TCP PRINT hTCP, "HELO " + localhost TCP LINE hTCP, Buffer IF LEFT$(Buffer, 3) <> "250" THEN Buffer = "HELO error: " + Buffer GOTO SendError END IF ' ** Tell the mailhost who we are DIALOG DOEVENTS CONTROL GET TEXT hDlgMain, 102 TO Buffer REGEXPR "[a-zA-Z0-9._]+@[a-zA-Z0-9._]+" IN Buffer TO position, length IF length = 0 THEN Buffer = "Invalid FROM email address" GOTO SendError ELSE Buffer = MID$(Buffer, position, length) END IF DIALOG DOEVENTS TCP PRINT hTCP, "MAIL FROM: <" + Buffer + ">" TCP LINE hTCP, Buffer IF LEFT$(Buffer, 3) <> "250" THEN Buffer = "MAIL FROM error: " + Buffer GOTO SendError END IF ' ** Tell the mailhost who the message is for DIALOG DOEVENTS CONTROL GET TEXT hDlgMain, 103 TO Buffer REGEXPR "[a-zA-Z0-9._]+@[a-zA-Z0-9._]+" IN Buffer TO position, length IF length = 0 THEN Buffer = "Invalid TO email address" GOTO SendError ELSE Buffer = MID$(Buffer, position, length) END IF DIALOG DOEVENTS TCP PRINT hTCP, "RCPT TO: <" + Buffer + ">" TCP LINE hTCP, Buffer IF LEFT$(Buffer, 3) <> "250" THEN Buffer = "RCPT TO error: " + Buffer GOTO SendError END IF ' ** Send the message DIALOG DOEVENTS TCP PRINT hTCP, "DATA" TCP LINE hTCP, Buffer IF LEFT$(Buffer, 3) <> "354" THEN Buffer = "DATA error: " + Buffer GOTO SendError END IF CONTROL GET TEXT hDlgMain, 102 TO Buffer TCP PRINT hTCP, "From: " + Buffer CONTROL GET TEXT hDlgMain, 103 TO Buffer TCP PRINT hTCP, "To: " + Buffer CONTROL GET TEXT hDlgMain, 104 TO Buffer IF LEN(Buffer) THEN TCP PRINT hTCP, "Subject: " + Buffer END IF TCP PRINT hTCP, "X-Mailer: PowerBASIC SMTP example v1.0" CONTROL GET TEXT hDlgMain, 105 TO Msg REPLACE CHR$(13,10) WITH CHR$(13) IN Msg WHILE LEN(Msg) Buffer = EXTRACT$(Msg, CHR$(13)) IF ASC(Buffer) = 46 THEN Buffer = "." + Buffer END IF TCP PRINT hTCP, Buffer Msg = MID$(Msg, LEN(Buffer)+2) WEND TCP PRINT hTCP, "." TCP LINE hTCP, Buffer IF LEFT$(Buffer, 3) <> "250" THEN GOTO SendError END IF ' ** Say goodbye TCP PRINT hTCP, "QUIT" TCP LINE hTCP, Buffer IF LEFT$(Buffer, 3) <> "221" THEN Buffer = "QUIT error: " + Buffer GOTO SendError END IF TCP CLOSE hTCP FUNCTION = -1 Done: MOUSEPTR 0 SetFocus hDlgMain EXIT FUNCTION SendError: TCP CLOSE hTCP MsgBox Buffer,, "SMTP Error" GOTO Done END FUNCTION '------------------------------------------------------------------------------ CALLBACK FUNCTION DlgProc () AS LONG STATIC hFont AS LONG IF CBMSG = %WM_INITDIALOG THEN CONTROL HANDLE hDlgMain, 101 TO hServer CONTROL HANDLE hDlgMain, 102 TO hFrom CONTROL HANDLE hDlgMain, 103 TO hTo CONTROL HANDLE hDlgMain, 104 TO hSubject CONTROL HANDLE hDlgMain, 105 TO hMessage CONTROL SET TEXT hDlgMain, 101, $mailhost CONTROL SET TEXT hDlgMain, 102, $mailfrom hFont = MakeFont("Courier New", 10) CONTROL SEND hDlgMain, 105, %WM_SETFONT,hFont, 1 CONTROL SET FOCUS hDlgMain, 103 FUNCTION = 1 END IF END FUNCTION '------------------------------------------------------------------------------ CALLBACK FUNCTION CancelButton() AS LONG DIALOG END hDlgMain, 0 FUNCTION = 1 END FUNCTION '------------------------------------------------------------------------------ CALLBACK FUNCTION OkButton() AS LONG LOCAL s AS STRING CONTROL GET TEXT hDlgMain, 105 TO s IF LEN(s) = 0 THEN SetFocus hMessage EXIT FUNCTION ELSEIF SendMail THEN MsgBox "Your email message was successfully sent.",,"Success!" DIALOG END hDlgMain, 1 FUNCTION = 1 END IF END FUNCTION '------------------------------------------------------------------------------ FUNCTION PbMain () AS LONG DIALOG NEW 0, "Simple Mail Transfer Protocol (SMTP)", ,, 365, 250, 0, 0 TO hDlgMain CONTROL ADD LABEL, hDlgMain, -1, "Server:", 17, 11, 40, 8, %SS_RIGHT CONTROL ADD LABEL, hDlgMain, -1, "From:", 17, 24, 40, 8, %SS_RIGHT CONTROL ADD LABEL, hDlgMain, -1, "To:", 17, 36, 40, 8, %SS_RIGHT CONTROL ADD LABEL, hDlgMain, -1, "Subject:", 17, 50, 40, 8, %SS_RIGHT CONTROL ADD TEXTBOX, hDlgMain, 101, "", 60, 9, 299, 12, %ES_AUTOHSCROLL OR %WS_BORDER, %WS_EX_CLIENTEDGE CONTROL ADD TEXTBOX, hDlgMain, 102, "", 60, 22, 299, 12, %ES_AUTOHSCROLL OR %WS_BORDER, %WS_EX_CLIENTEDGE CONTROL ADD TEXTBOX, hDlgMain, 103, "", 60, 35, 299, 12, %ES_AUTOHSCROLL OR %WS_BORDER, %WS_EX_CLIENTEDGE CONTROL ADD TEXTBOX, hDlgMain, 104, "", 60, 48, 299, 12, %ES_AUTOHSCROLL OR %WS_BORDER, %WS_EX_CLIENTEDGE CONTROL ADD TEXTBOX, hDlgMain, 105, "", 6, 66, 353, 161, %ES_AUTOHSCROLL OR %ES_AUTOVSCROLL OR %ES_MULTILINE OR %ES_WANTRETURN OR %WS_BORDER, %WS_EX_CLIENTEDGE CONTROL ADD BUTTON, hDlgMain, %IDOK, "&Send", 275, 232, 40, 14, %BS_DEFPUSHBUTTON CALL OkButton CONTROL ADD BUTTON, hDlgMain, %IDCANCEL, "&Cancel", 319, 232, 40, 14, 0 CALL CancelButton DIALOG SHOW MODAL hDlgMain CALL DlgProc END FUNCTION