AOH :: P30-07.TXT

VAX/VMS Fake Mail



				==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************************************
_______________________________________________________________________________

AOH Site layout & design copyright © 2006 AOH