/* SendMsgFun 1.1 (11.11.2000) */

signal on halt
signal on break_c
signal on syntax
signal on error

SafeStart:
  global.keyword=word(arg(1),1)
  global.this=x2d(pragma("ID"))
  "MACRO" global.keyword global.this
  global.haltok=1
  if global.halted=1 then exit

call start()
call SafeQuit()
/* never reached  */
/**************************************************************************/
start: procedure expose global.
    parm.8.value="+0100"

    /*            0    1      2      3          4          5       6    7         8           */
    if ~ReadArgs("ID/A,TYPE/N,HOST/A,HOSTPORT/A,REALNAME/A,EMAIL/A,TO/A,SUBJECT/A,TEXT/A/K/F") then
        call call err(DosString(IoErr()))

    global.key=parm.0.value

    global.eol="D0A"x

    call info("Opening connection...")
    global.sock = OpenConnection("tcp",parm.3.value,parm.2.value)
    if global.sock<0 then do
        select
            when sock=-2 then call err("Host <"parm.2.value"> not found")
            otherwise call err("Can't connect to <"parm.2.value":"parm.3.value"> ("errorstring()")")
        end
    end

    if GetSockName(global.sock,"LOCALE")<0 then call err("Not enogh memory")
    thisHost=locale.addraddr

    call info("Entering...")
    call rec

    call info("Sending message...")

    msg=,
    "Message-ID: <smtp"time(s)"@"thisHost">" || global.eol ||,
    "From:" parm.4.value "<"parm.5.value">" || global.eol ||,
    "Subject:" parm.7.value || global.eol || ,
	"Date:" GMTInetDate() || global.eol

    if parm.1.value then do

        call sen "POST"
        call rec

        msg=msg || ,
        "Newsgroups:" parm.6.value || global.eol ||,
        "X-Newsposter: sendmsg/1.0" global.eol
    end
    else do
        call sen "MAIL FROM: <"parm.5.value">"
        call rec

        call sen "RCPT TO: <"parm.6.value">"
        call rec

        call sen "DATA"
        call rec

        msg=msg ||,
        "To: <"parm.6.value">" || global.eol ||,
        "X-Mailer: sendmsg/1.0"
    end

    call sen msg

    call sen parm.8.value

    call sen global.eol || "."
    call rec

    call sen "QUIT"
    call rec

    call info("Done.")

    "EOM" global.key
    exit
/***********************************************************************/
sen: procedure expose global.
parse arg string
    string=string || global.eol
    if send(global.sock,string)~=length(string) then call err("Send error" ErrorString())
    return
/***********************************************************************/
rec: procedure expose global.
    if recv(global.sock,"BUF",256)<0 then call err("Recv error" ErrorString())
    parse var BUF code rest (global.eol)
    if code>=400 then call err("Error from server: ("code")"rest)
    return
/***********************************************************************/
GMTInetDate: procedure expose global.
    m.1="Jan";m.2="Feb";m.3="Mar";m.4="Apr";m.5="May";m.6="Jun";m.7="Jul";m.8="Aug";m.9="Sep";m.10="Oct";m.11="Nov";m.12="Dec"
    call GetDate("D","GMT")
    parse value(FormatDate("D","%d %m %Y %H:%M:%S")) with i j rest
	j=j%1
    return i m.j || rest
/***************************************************************************/
info: procedure expose global.
parse arg msg
    "INFO" global.key msg
    return
/***********************************************************************/
err: procedure expose global.
parse arg msg,err
    "ERR" global.key msg
    exit
/***********************************************************************/
break_c:
    call err "User break detected"
/***********************************************************************/
halt:
    call err "Global halt detected"
/***********************************************************************/
syntax:
    call err "Syntax error" rc sigl
/***********************************************************************/
error:
    call err "Error" rc sigl
/***********************************************************************/
