sockets

Sarah sarahr at genesearch.com.au
Tue Jul 9 20:32:01 EDT 2002


Sorry for the long email, but here are the basic routines I use for POP 
communications.
You'll need to customize to fit in with your field names instead of 
mine. Also, check the setupNextCall handler as that is specifically for 
my button ID.

Everything gets logged so debugging is quite easy.

Regards,
Sarah

-----------------------------
-- these variables are up here so all handlers in this button can use it
local socketAddr, msgList

on mouseUp
   put empty into fld "Log"
   put empty into fld "Email"
   put "Checking email..." into fld "Status"

   -- close any open sockets (in case there has been a failure already)
   repeat until the openSockets  is empty
     close socket line 1 of the openSockets
   end repeat

   -- open POP port & login (fld "POP" contains the address of my mail 
server)
   put fld "POP" & ":110" into socketAddr
   open socket to socketAddr with message "startEmail"
end mouseUp


-- this handler gets called after the socket has opened
on startEmail
   -- read the welcome message from the server
   read from socket socketAddr until CRLF
   put it & cr after fld "Log"

   -- send all the header stuff, checking for a response after each one
   -- the error checking is in the sendReceive handler
   sendReceive "USER " & fld "User"
   sendReceive "PASS " & the cHiddenPass of fld "Password"

   getList   -- this puts a list of waiting emails into msgList

   repeat for each line m in msgList
       put "Reading email..." into fld "Status"
       put getMsg(msgNum) into newMsg
       put newMsg & cr after fld "Email"

         -- delete message from server
         -- comment this out while you're testing
         sendReceive "DELE " & msgNum
   end repeat

   -- close the port before closing the socket
   sendReceive "QUIT"
   close socket socketAddr

   setupNextCall
end startEmail


on setupNextCall
   -- set up next check, making sure to delete any leftover pending 
messages
   put the pendingMessages into pendMsg
   repeat for each line L in pendMsg
     if L contains "button ID 1013" then cancel item 1 of L
   end repeat

   send mouseUp to button ID 1013 in (fld "Check" * 60) seconds
   put the seconds + (fld "Check" * 60) into checkTime
   convert checkTime to long time
   put "Next check at " & checkTime into fld "Status"
end setupNextCall


-- this function gets the list and extracts the number of waiting emails
on getList
   sendOnly "LIST"
   read from socket socketAddr until "." & CRLF
   put it into msgList
   -- delete header & footer
   put line 2 to -2 of msgList into msgList
   put msgList & cr after fld "Log"
end getList


-- this function retrieves the whole message if it is small enough
function getMsg msgNum
   sendOnly "RETR " & msgNum
   read from socket socketAddr until "." & CRLF
   return it
end getMsg


-- this routine sends data to the server and reads the response
-- POP responses always start with +OK or -ERR
on sendReceive theData
   put "-> " & theData & cr after fld "Log"
   write theData & CRLF to socket socketAddr
   read from socket socketAddr until CRLF
   put it after fld "Log"

   if word 1 of it is not "+OK" then
     close socket socketAddr
     exit to top
   end if
end sendReceive


-- this routine is for sending only, with no response expected
on sendOnly theData
   put "-> " & theData & cr after fld "Log"
   write theData & CRLF to socket socketAddr
end sendOnly


-- these 2 handlers are just to catch a connection failure
on socketTimeOut
   close socket socketAddr
   setupNextCall
   exit to top
end socketTimeOut

on socketError sockID, errMsg
   close socket socketAddr
   setupNextCall
   exit to top
end socketError

-----------------------------



On Wednesday, July 10, 2002, at 10:21  AM, Larry Forsgren wrote:

> Thanks for your reply Sarah,
>
> I actually did try to close the socket by sending "QUIT" to it
> using the write command but that didn't change anything.
> I only get a reply from the socket the first time so the quit
> command is not forwarded either. I also tried to wait for the
> connection to time out but I cannot access the socket again
> until I restart Revolution.
> Perhaps someone has a Rev example of how to use sockets
> to access a mail server.
> (I run this on Windows XP if that has any bearing on this).
>
> Larry





More information about the Use-livecode mailing list