==Phrack Inc.=

                    Volume Three, Issue 30, File #7 of 12

                            =-------------------=

                              VAX/VMS Fake Mail

                               by Jack T. Tab

                            =-------------------=


In the August 1986 issue of VAX PROFESSIONAL, the BASIC subroutine that appears
at the end of this text was published.  It was not until more than two years
later that DEC included a callable mail interface with VMS 5.x.  While the
official version is much more extensive, the routine included here has one
important feature.  The ability to have a mail message appear to be from
someone else is a good addition to most "toolkits."

VMS Mail works in two manners.  The first is the familiar interactive.  The
second is as a network object.  In this method, MAIL is invoked by the
NETSERVER.COM command procedure in response to an incoming connect request.
MAIL.EXE is activated as network object 27.  The other network objects can be
viewed by using the NCP command SHOW KNOWN OBJECTS.  In this mode, MAIL.EXE
operates as a slave process, receiving instructions from the master process.
The master, in most cases, is another process running MAIL.EXE interactively.
The slave process can handle requests to deliver mail to as many recipients as
necessary.  Addresses that are not on the same node as the slave process are
forwarded by activating yet another slave process on the target node.  The
information sent by the master MAIL to the slave MAIL is quite simple and
straightforward, consisting of a series of strings.

The first string is for the FROM name.  This is what makes the subroutine
useful, as it can be anything (i.e. the_Easter_Bunny).  The next set of strings
are to whom the mail is to be sent.  One address per string, with a null
string, chr(0), terminating the list.  The third item is what the receiver(s)
sees in their TO: field.  This also can be anything.  VMS MAIL can use this
option for its .DIS distribution lists.  The final information is the body of
the message.  It too is terminated by another null string.  The subject of the
mail message is taken from the first line of this text.

The MAIL slave will send back appropriate status messages indicating problems
if they occur.  Such as "Addressee Unknown" or VMS and DECnet errors like "Disk
Quota Exceeded" or "Remote Node Not Reachable").

The only privilege that seems necessary is NETMBX.  Without it the subroutine
cannot call MAIL as a network object.  Our beloved system management resolved
the problem of people pretending to be SYSTEM by installing MAIL with NETMBX
and removing the priv from the student accounts.  The subroutine works just as
well with JNET and BITNET as it does with DECNET addresses.


***********************************CUT HERE************************************
1  %TITLE 'MAIL SUBROUTINE'

  SUB MAILT( STRING NODE, &
      STRING FROM_NAME, &
      STRING TO_LIST(), &
      STRING TO_SHOW, &
      STRING SUBJECT, &
      STRING TEXT() )

  OPTION TYPE = INTEGER

  DECLARE INTEGER FUNCTION &
    PUT_MSG

  DECLARE STRING FUNCTION &
    GET_MSG, &
    GET_INPUT

  DECLARE INTEGER CONSTANT &
    TRUE = -1, &
    FALSE = 0
  Net_Link_Open = FALSE

  Z = POS( NODE + ":" , ":" , 1)
  NODE_NAME$ = LEFT$( NODE , Z - 1 )
  ON ERROR GOTO Mail_Net_Error
  MAIL_CHANNEL = 12
  OPEN NODE_NAME$ + '::"27="' AS FILE MAIL_CHANNEL

  Net_Link_Open = TRUE

  STS = PUT_MSG( FROM_NAME )
  IF STS <> 0 THEN
    GOTO ERROR_DONE
  END IF
  RECEIVERS = 0
  TO_COUNT = 1

Mail_Recipients:
  IF TO_LIST( TO_COUNT ) = "" THEN
    GOTO End_Of_Line
  END IF
  STS = PUT_MSG( EDIT$( TO_LIST( TO_COUNT ) , 32 ) )
  IF STS <> 0 THEN
    GOTO Error_Done
  END IF
  GOSUB Errchk
  IF LINK_ERR <> 0 THEN
    GOTO Error_Done
  END IF

  IF ( ERRSTS AND 1 ) = 0 THEN
    GOTO Error_Done
  END IF

  TO_COUNT = TO_COUNT + 1
  GOTO Mail_Recipients

END_OF_LINE:
  STS = PUT_MSG( CHR$(0) )
  IF STS <> 0 THEN
    GOTO Error_Done
  END IF
  IF RECEIVERS = 0 THEN
    GOTO Mail_Done
  END IF

  STS = PUT_MSG( TO_SHOW )
  IF STS <> 0 THEN
    GOTO Error_Done
  END IF

  STS = PUT_MSG( SUBJECT )
  IF STS <> 0 THEN
    GOTO Error_Done
  END IF

  FOR I = 1 UNTIL TEXT(I) = CHR$(255)
    STS = PUT_MSG( TEXT(I) )
    IF STS <> 0 THEN
      GOTO Error_Done
    END IF
  NEXT I

  STS = PUT_MSG( CHR$(0) )
  IF STS <> 0 THEN
    GOTO Error_Done
  END IF
  SAVE_COUNT = RECEIVERS
  INDEX = 0

Delivery_Check:
  GOSUB Errchk
  IF LINK_ERR <> 0 THEN
    GOTO Error_Done
  END IF
  INDEX = INDEX + 1
  IF INDEX <> SAVE_COUNT THEN
    GOTO Delivery_Check
  END IF
  GOTO Mail_Done

Errchk:
  MAIL_STS = ASCII( GET_MSG )
  IF LINK_ERR <> 0 THEN
    ERRSTS = LINK_ERR
    RETURN
  END IF
  IF ( MAIL_STS AND 1 ) = 1 THEN
    Receivers = Receivers + 1
    ERRSTS = MAIL_STS
    RETURN
  END IF

Errmsg:
  MAIL_ERR$ = GET_MSG
  IF LINK_ERR <> 0 THEN
    ERRSTS = LINK_ERR
    RETURN
  END IF
  IF LEN( MAIL_ERR$ ) <> 1 THEN
    PRINT MAIL_ERR$
    GOTO Errmsg
  END IF
  IF ASCII( MAIL_ERR$ ) = 0 THEN
    RETURN
  ELSE
    GOTO Errmsg
  END IF

  DEF INTEGER PUT_MSG( STRING M )
  ON ERROR GOTO 1550
  MLEN = LEN( M )
  MOVE TO # MAIL_CHANNEL , M = MLEN
  PUT # MAIL_CHANNEL, COUNT MLEN
  PUT_MSG = 0
  EXIT DEF

1550 RESUME 1555

1555 PUT_MSG = ERR
    END DEF

  DEF STRING GET_INPUT( INTEGER C )
  EOF = FALSE
  ON ERROR GOTO 1650
  GET # C
  R = RECOUNT
  MOVE FROM #C , TEMP$ = R
  GET_INPUT = TEMP$
  EXIT DEF

1650 RESUME 1655

1655 EOF = TRUE
    END DEF

  DEF STRING GET_MSG
  ON ERROR GOTO 1750
  GET # MAIL_CHANNEL
  R = RECOUNT
  MOVE FROM # MAIL_CHANNEL , TEMP$ = R
  GET_MSG = TEMP$
  LINK_ERR = 0
  EXIT DEF

1750 RESUME

1755 LINK_ERR = ERR
    END DEF

Mail_Net_Error:
 RESUME 1900

1900 PRINT "%Network communications error."

Error_Done:

Mail_Done:
  IF Net_Link_Open THEN
    CLOSE MAIL_CHANNEL
  END IF

  END SUB
***********************************CUT HERE************************************
_______________________________________________________________________________



Downloaded From P-80 International Information Systems 304-744-2253 12yrs+