You can't have a loop in the sockread event. The loop has to be done with global variables and comparisons not a while loop. Try code that I made:

usage: /getmail <server> <port> <username> <password>

Code:
alias getmail {
;1=server 2=port 3=username 4=password
  ;--------
  set %chkADDR $1
  set %chkPORT $2
  set %chkUSER $3
  set %chkPASS $4
  ;--------

  set %getmail.write 0
  set %getmail.state 1
  if ($sock(getmail)) sockclose getmail
  sockopen getmail %chkADDR %chkPORT
  .timer 1 5 sockclose getmail
}

on *:SOCKREAD:getmail:{
  var %s
  sockread %s
  tokenize 32 %s
  ;echo -a &gt; $1-

  if (-ERR isin $1) {
    echo 4 -a ERROR: $1-
    echo 4 -a %getmail.state QUIT
    sockwrite -n $sockname QUIT
    set %getmail.state -1
  }
  elseif (%getmail.state &lt; 0) {
    echo 4 -a %getmail.state Done
    sockclose $sockname
  }
  elseif ((OK isin $1) &amp;&amp; (!%getmail.write)) {
    if (%getmail.state == 1) {
      echo 3 -a USER
      sockwrite -n $sockname USER %chkUSER
      inc %getmail.state
    }
    elseif (%getmail.state == 2) {
      echo 3 -a PASS
      sockwrite -n $sockname PASS %chkPASS
      inc %getmail.state
    }
    elseif (%getmail.state == 3) {
      echo 3 -a STAT
      sockwrite -n $sockname STAT
      inc %getmail.state
    }
    elseif (%getmail.state == 4) {
      echo 12 -a $2 $iif($2 == 1,message,messages)
      if ($2 &gt; 0) {
        set %getmail.count 1
        set %getmail.state 5
        set %getmail.num $2
        .remove mailget.tmp
        echo 3 -a RETR %getmail.count
        sockwrite -n $sockname RETR %getmail.count
      }
      else {
        echo 3 -a QUIT
        sockwrite -n $sockname QUIT
        set %getmail.state 99
      }
    }
    elseif (%getmail.state == 5) {
      echo 7 -a Receiving %getmail.count
      set %getmail.write 1
    }
    elseif (%getmail.state == 6) {
      if (%getmail.dele &lt; %getmail.num) {
        inc %getmail.dele
        echo 3 -a DELE %getmail.dele
        sockwrite -n $sockname DELE %getmail.dele
      }
      else {
        echo 3 -a QUIT
        sockwrite -n $sockname QUIT
        set %getmail.state 99
      }
    }
    elseif (%getmail.state == 99) {
      echo 3 -a DONE
      sockclose $sockname
      unset %getmail.*
    }
  }
  elseif (%getmail.state == 5) {
    if ($1- == .) {
      var %getmail.ticks = $ticks
      .rename mailget.tmp $+(%getmail.ticks,.txt)
      echo 7 -a Received %getmail.count
      echo 7 -a Saved as $+(%getmail.ticks,.txt)
      set %getmail.write 0
      if (%getmail.count &lt; %getmail.num) {
        inc %getmail.count
        echo 3 -a RETR %getmail.count
        sockwrite -n $sockname RETR %getmail.count
      }
      else {
        set %getmail.dele 1
        echo 3 -a DELE 1
        sockwrite -n $sockname DELE 1
        set %getmail.state 6
      }
    }
    else {
      write mailget.tmp $iif($1,$1-,$crlf)
    }
  }
}


The sockread event will check for existing messages then retrieve all of them and then delete all of them.

-genius_at_work

Last edited by genius_at_work; 15/02/06 09:06 PM.