Simple Mail Transfer Protocol (SMTP)

One of the easiest high-level TCP protocols to use is SMTP for sending an email message.  This application simply connects to an SMTP server via TCP, identifies itself, and identifies who the message is for, sends the text of the message, and finally says goodbye.  As each line of text is sent to the server, it returns a status code and message to indicate progress.  The following code demonstrates this:

 

' Be sure to change the following two string equates

' to the name of your SMTP mail server and your email

' address.

#COMPILE EXE

 

$mailhost = "mailserver.mydomain.com"

$mailfrom = "email@address.com"

 

FUNCTION PBMAIN() AS LONG

  ' Get the local computer's IP address and name

  HOST ADDR TO ip&

  HOST NAME ip& TO hostname$

 

  ' ** Connect to the mailhost

  hTCP& = FREEFILE

  TCP OPEN "smtp" AT $mailhost AS hTCP&

  IF ERR THEN

    MSGBOX "Error connecting to mailhost"

    EXIT FUNCTION

  ELSE

    TCP LINE hTCP&, buffer$

    IF LEFT$(buffer$, 3) <> "220" THEN

      MSGBOX "Mailhost Error: " & buffer$

      EXIT FUNCTION

    END IF

  END IF

 

  ' Get the local computer's IP address and name

  HOST NAME TO hostname$

 

  ' ** Greet the mailhost

  TCP PRINT hTCP&, "HELO " + hostname$

  TCP LINE hTCP&, buffer$

  IF LEFT$(buffer$, 3) <> "250" THEN

    MSGBOX "HELO Error: " & buffer$

    TCP CLOSE hTCP&

    EXIT FUNCTION

  END IF

 

  ' ** Tell the mailhost who we are

  TCP PRINT hTCP&, "MAIL FROM:<" & $mailfrom & ">"

  TCP LINE hTCP&, buffer$

  IF LEFT$(buffer$, 3) <> "250" THEN

    MSGBOX "MAIL FROM Error: " & buffer$

    TCP CLOSE hTCP&

    EXIT FUNCTION

  END IF

 

  ' ** Tell the mailhost who we want to send the message to

  TCP PRINT hTCP&, "RCPT TO:<info@powerbasic.com>"

  TCP LINE hTCP&, buffer$

  IF LEFT$(buffer$, 3) <> "250" THEN

    MSGBOX "RCPT TO Error: " & buffer$

    TCP CLOSE hTCP&

    EXIT FUNCTION

  END IF

 

  ' ** Now we can send the message

  TCP PRINT hTCP&, "DATA"

  TCP LINE hTCP&, buffer$

  IF LEFT$(buffer$, 3) <> "354" THEN

    MSGBOX "DATA Error: " & buffer$

    TCP CLOSE hTCP&

    EXIT FUNCTION

  END IF

 

  TCP PRINT hTCP&, "From: " & $mailfrom

  TCP PRINT hTCP&, "To: info@powerbasic.com"

  TCP PRINT hTCP&, "Subject: Greetings!"

  TCP PRINT hTCP&, ""

  TCP PRINT hTCP&, "Just wanted to say hello."

  TCP PRINT hTCP&, "This TCP stuff is great!

 

  ' ** End of the message

  TCP PRINT hTCP&, "."

  TCP LINE hTCP&, buffer$

  IF LEFT$(buffer$, 3) <> "250" THEN

    MSGBOX "DATA Error: " & buffer$

    TCP CLOSE hTCP&

    EXIT FUNCTION

  END IF

 

  ' ** Say goodbye

  TCP PRINT hTCP&, "QUIT"

  TCP LINE hTCP&, buffer$

  IF LEFT$(buffer$, 3) <> "221" THEN

    MSGBOX "QUIT Error: " & buffer$

    TCP CLOSE hTCP&

    EXIT FUNCTION

  END IF

 

  TCP CLOSE hTCP&

END FUNCTION

 

The SMTP protocol is fully described in RFC 821 http://www.rfc-editor.org

 

See Also

TCP and UDP Communications

TCP clients and servers

An ECHO client and server using TCP