home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / fwd-1.0.zip / process.cmd < prev    next >
OS/2 REXX Batch file  |  2000-10-29  |  11KB  |  371 lines

  1. /* this cmd is called from forward.cmd . Do not use it alone. */
  2.  
  3. critsize=307200 /* If message size>critsize then executing smtp logoff before receiving it*/
  4. smtpsock=-1
  5.  
  6.  server=arg(1)
  7.  user=arg(2)
  8.  password=arg(3)
  9.  forward=arg(4)
  10.  keep=arg(5)
  11.  cenum=arg(6)
  12.  smtpserver=arg(7)
  13.  logfile=arg(8)
  14.  tempfdir=arg(9)
  15.  
  16. call saynlog 'Forwarding from 'server' for 'user' to 'forward
  17.  
  18. /*------------------------------------------------------------------
  19.  * get address of servers
  20.  *------------------------------------------------------------------*/
  21. rc = SockGetHostByName(server,"host.!")
  22. if (rc = 0) then
  23.    do
  24.     call saynlog "Unable to resolve pop3server name" errno
  25.     return -1
  26.    end
  27. server = host.!addr
  28. /*------------------------------------------------------------------
  29.  * open socket
  30.  *------------------------------------------------------------------*/
  31. sock = SockSocket("AF_INET","SOCK_STREAM","IPPROTO_TCP")
  32. if (sock = -1) then
  33.    do
  34.     call saynlog "Error opening socket:" errno
  35.     return -1
  36.    end
  37. /*------------------------------------------------------------------
  38.  * connect socket
  39.  *------------------------------------------------------------------*/
  40. server.!family = "AF_INET"
  41. server.!port   = 110
  42. server.!addr   = server
  43. rc = SockConnect(sock,"server.!")
  44. if (rc = -1) then
  45.    do
  46.      call saynlog "Error connecting to popserver :" errno
  47.      rc=SockSoclose(sock)
  48.      return -1
  49.    end
  50.  
  51.    call saynlog 'Connected to 'server
  52.    trc = GetResponse(sock)
  53.  
  54.    trc = SendMessage(sock,'USER 'user)
  55.    trc = GetResponseLine(sock)
  56.    parse var trc status rest
  57.    if status <> '+OK' then
  58.      do
  59.        qrc = SendMessage(sock,'QUIT')
  60.        call saynlog ' Error: User' user 'unknown on' server '.'
  61.        rc=SockSoclose(sock)
  62.        return -1
  63.      end
  64.  
  65.    trc = SendMessage(sock,'PASS 'password)
  66.    trc = GetResponseLine(sock)
  67.    parse var trc status rest
  68.    if status <> '+OK' then
  69.      do
  70.        qrc = SendMessage(sock,'QUIT')
  71.        call saynlog ' Error: Password wrong for' user ' on 'server'.'
  72.        rc=SockSoclose(sock)
  73.        return -1
  74.      end
  75.    else
  76.      do 
  77.        call saynlog 'Authentication completed successfully. Sending List command'
  78.        trc = SendMessage(sock,'LIST')
  79.        trc = GetResponse(sock)
  80.        messages = 0
  81.        parse var line.1 status rest
  82.        if status = '+OK' then 
  83.          do 
  84.            msginfo = GetResponseLine(sock)
  85.            do while msginfo <> '.'
  86.              messages = messages + 1
  87.              msginfo = GetResponseLine(sock)
  88.            end
  89.          end /* do */
  90.        if messages = 0 
  91.          then 
  92.           do
  93.            call saynlog ' There are no messages waiting for you.'
  94.           end
  95.          else
  96.            do 
  97.              call saynlog ' There are' messages 'messages waiting for you.'
  98.  
  99.              trc = SendMessage(sock,'LIST')
  100.              trc = GetResponse(sock)
  101.              do 
  102.                msginfo = GetResponseLine(sock)
  103.                messize.0=messages
  104.                do while msginfo <> '.'
  105.                  parse var msginfo number size
  106.                  messize.number=size
  107.                  call saynlog ' Message' number 'has' size 'bytes.'
  108.                  msginfo = GetResponseLine(sock)
  109.                end
  110.              end /* do */
  111.  
  112.              if messize.1<=critsize then smtpsock=ConnectSmtp(smtpserver)
  113.  
  114.              /* Get Mails */
  115.              do i = 1 to messages
  116.                if messize.i>critsize then smtpsock=closesmtp(smtpsock)
  117.                say ' Getting Message' i
  118.                trc = SendMessage(sock,'RETR 'i)
  119.                trc = GetResponse(sock)
  120.                parse var line.1 status rest
  121.                oneline = GetResponseLine(sock)
  122.                linenum=0
  123.                fromaddr=''
  124.                do while oneline <> '.'
  125.                  linenum=linenum+1
  126.                  message.linenum=oneline
  127.                  res=translate(substr(oneline,1,4))
  128.                  if res='FROM' then 
  129.                   do
  130.                    beg=pos('<',oneline)
  131.                    if beg>0 then
  132.                     do 
  133.                      length=pos('>',oneline)-pos('<',oneline)+1
  134.                      fromaddr=substr(oneline,beg,length)                 
  135.                     end
  136.                              else
  137.                     do
  138.                      parse var oneline from addr rest
  139.                      if space(addr)<>'' then fromaddr=space(addr)
  140.                     end
  141.                    call saynlog 'Message from: 'fromaddr
  142.                   end
  143.                  oneline = GetResponseLine(sock)
  144.                end
  145.                rc=stream(tempfname,'c','close')                 
  146.                if fromaddr='' then
  147.                 do
  148.                  call saynlog 'From adress not found. Substituting with nobody@mail.ru'
  149.                  fromaddr='nobody@mail.ru'
  150.                 end 
  151.  
  152.                if smtpsock<0 then smtpsock=ConnectSmtp(smtpserver)
  153.                trc25 = SendMessage(smtpsock,'HELO')
  154.                trc25 = GetResponseLine(smtpsock)
  155.                trc25 = SendMessage(smtpsock,'Mail from: 'fromaddr)
  156.                trc25 = GetResponseLine(smtpsock)
  157.                trc25 = SendMessage(smtpsock,'Rcpt to: 'forward)
  158.                trc25 = GetResponseLine(smtpsock)
  159.                trc25 = SendMessage(smtpsock,'Data')
  160.                trc25 = GetResponseLine(smtpsock)
  161.                do ind=1 to linenum
  162.                 trc25 = SendMessage(smtpsock,message.ind)              
  163.                end
  164.                trc25 = SendMessage(smtpsock,'.')
  165.                trc25 = GetResponseLine(smtpsock)
  166.                call saynlog 'Sendmail said: 'trc25
  167.                mesnum=left(trc25,3)
  168.                if mesnum=250 then '@del' tempfname
  169.  
  170.                if keep="" then
  171.                 do
  172.                  trc = SendMessage(sock,'DELE 'i)
  173.                  trc = GetResponse(sock)
  174.                  call saynlog ' Got, forwarded and deleted Message' i
  175.                 end
  176.                           else
  177.                 do
  178.                  call saynlog ' Got, forwarded and kept Message' i
  179.                 end 
  180.              end  
  181.            end
  182.      end
  183.  
  184. if smtpsock>0 then  smtpsock=closesmtp(smtpsock)
  185. trc = SendMessage(sock,'QUIT')
  186. trc = GetResponse(sock)
  187. rc=SockSoclose(sock)
  188.  
  189. exit
  190.  
  191. /*--------------------End of processing current pop3account-----------*/ 
  192.  
  193. /*-------------Connecting to SmtpServer procedure----------------------------*/
  194. ConnectSmtp: procedure expose logfile cenum
  195.  
  196. smtpserver=arg(1)
  197.  
  198. call saynlog 'Connecting to smtp server 'smtpserver
  199.  
  200. rc = SockGetHostByName(smtpserver,"host.!")
  201. if (rc = 0) then
  202.    do
  203.     call saynlog "Unable to resolve smtpserver name" smtpserver 
  204.     rc=stream(logfile,'c','close')
  205.     return -1
  206.    end
  207. smtpserver = host.!addr
  208. smtpsock = SockSocket("AF_INET","SOCK_STREAM","IPPROTO_TCP")
  209. if (smtpsock = -1) then
  210.  do
  211.   call Saynlog "Error opening socket :" errno
  212.   rc=stream(logfile,'c','close')
  213.   return -1
  214.  end
  215. smtpserver.!family = "AF_INET"
  216. smtpserver.!port   = 25
  217. smtpserver.!addr   = smtpserver
  218. rc = SockConnect(smtpsock,"smtpserver.!")
  219. if (rc = -1) then
  220.  do
  221.   call saynlog "Error connecting to smtpserver :" errno
  222.   rc=stream(logfile,'c','close')
  223.   return -1
  224.  end
  225. trc25 = GetResponse(smtpsock)
  226. call saynlog 'We are connected to smtp server'
  227.  
  228. return smtpsock
  229.  
  230. /*------------------------------------------------------------------
  231.  * get a response from the server
  232.  *------------------------------------------------------------------*/
  233. GetResponse:     procedure expose !. line. logfile cenum smtpsock
  234.    sock = arg(1)
  235.  
  236.    moreids = "100 215 220 221 222 223 230 231"
  237.  
  238.    line.0 = 1
  239.    line.1 = GetResponseLine(sock)
  240.  
  241.    parse var line.1 rid .
  242.  
  243.    if (wordpos(rid,moreids) = 0) then
  244.       return ""
  245.  
  246.    say ' getting further lines '
  247.  
  248.    do forever
  249.       o = line.0 + 1
  250.  
  251.       line.o = GetResponseLine(sock)
  252.       say line.o 
  253.  
  254.       if (line.o = ".")|(line.o = "") then
  255.          return ""
  256.  
  257.       line.0 = o
  258.    end
  259.  
  260.    return ""
  261.  
  262. /*------------------------------------------------------------------
  263.  * get a line from the server
  264.  *------------------------------------------------------------------*/
  265. GetResponseLine: procedure expose !. logfile cenum smtpsock
  266.    sock = arg(1)
  267.  
  268.    crlf = d2c(13) || d2c(10)
  269.  
  270.    if (symbol('!.buff') = "LIT") then
  271.       !.buff = ""
  272.  
  273.    nullcount=0
  274.    do while (pos(crlf,!.buff) = 0)
  275.       semname='\SEM32\sem'||cenum     
  276.       call SemEventCreate 'sem.cenum', semname      
  277.       call SemStartTimer 'timer.cenum', 1000000, sem.cenum
  278.       call ipccontextcreate contextsr.cenum
  279.       call proccreatethread contextsr.cenum,'sockrcv.cmd', sock, queue.cenum, sem.cenum
  280.  
  281.       call SemEventWait sem.cenum,15000 /* timeout time is 15 sec for receiving 512 bytes */
  282.       if result=640 then 
  283.         do
  284.          call saynlog 'Timeout receiving data from socket 'sock'. Closing forwarding.'
  285.          call IpcContextClose contextsr.cenum
  286.          call SemStopTimer timer.cenum
  287.          call SemEventClose sem.cenum
  288.          if smtpsock\=sock then smtpsock=closesmtp(smtpsock)
  289.          rc=SockSoclose(sock)
  290.          exit 
  291.         end
  292.       call IpcContextResult contextsr.cenum
  293.       count=left(result,5)
  294.       data=delstr(result,1,5)
  295.       if count=0 then 
  296.        do
  297.         call saynlog 'Null characters received '||count||'  '||nullcount||' *'||data||'*'
  298.         nullcount=nullcount+1
  299.        end
  300.       if nullcount>10 then 
  301.        do
  302.          Call saynlog 'Server closed connection on receive'
  303.          if smtpsock\=sock then smtpsock=closesmtp(smtpsock)
  304.          rc=SockSoclose(sock)
  305.          exit
  306.        end
  307.       call SemStopTimer timer.cenum
  308.       call SemEventClose sem.cenum
  309.       !.buff = !.buff || data
  310.    end
  311.  
  312.    p = pos(crlf,!.buff)
  313.    line = substr(!.buff,1,p-1)
  314.    !.buff = substr(!.buff,p+2)
  315.  
  316.    if left(line,4)='-ERR' then call saynlog 'Pop3server says:'line
  317.    return line
  318.  
  319. /*------------------------------------------------------------------
  320.  * send a string to the server
  321.  *------------------------------------------------------------------*/
  322. SendMessage:     procedure expose !. smtpsock logfile cenum
  323.    sock = arg(1)
  324.    data = arg(2) || d2c(13) || d2c(10)
  325.  
  326.    /* say 'Sending "'data'" to server.' */
  327.    len = length(data)
  328.    do while (len > 0)
  329.      
  330.       len = SockSend(sock,data);
  331.  
  332.       /* say 'Returncode: ' len   */
  333.       /* say 'Errorcode:  ' errno */
  334.       /*
  335.       if (errno <> 0) then
  336.          Error(-1,"Error sending data to server.")
  337.       */
  338.  
  339.       if (len <= 0) then
  340.        do
  341.          call saynlog "Server closed the connection."
  342.          if smtpsock\=sock then smtpsock=closesmtp(smtpsock)
  343.          rc=SockSoclose(sock)
  344.          exit
  345.        end
  346.       
  347.       data = substr(data,len+1)
  348.       len  = length(data)
  349.    end
  350.  
  351.    return 0
  352.  
  353. /*-----------------------------*/
  354. closesmtp: procedure expose !. logfile cenum
  355. smtpsock=arg(1)
  356.  
  357. if smtpsock>0 then
  358.  do
  359.   trc = SockSend(smtpsock,'QUIT') 
  360.   rc = SockSoclose(smtpsock)
  361.  end 
  362.  
  363. return -1
  364.  
  365. /*-----------------------------*/
  366. saynlog: procedure expose logfile cenum
  367.  mes='Thread '||cenum||':'||arg(1)
  368.  say mes
  369.  call lineout logfile , mes
  370. return
  371.