From:	CSBVAX::MRGATE!@KL.SRI.Com:kang%robax.decnet@venus.ycc.yale.edu@SMTP 29-SEP-1987 00:27
To:	EVERHART
Subj:	Re: Wollongong TCP-IP Mailer

Received: from venus.ycc.yale.edu by KL.SRI.COM with TCP; Mon 28 Sep 87 11:18:09-PDT
Date: 28 Sep 87 14:17:00 EDT
From: "ROBAX::KANG" <kang%robax.decnet@venus.ycc.yale.edu>
Subject:  Re: Wollongong TCP-IP Mailer
To: "info-vax" <info-vax@kl.sri.com>
Reply-To: "ROBAX::KANG" <kang%robax.decnet@venus.ycc.yale.edu>

> We have a VAX750 running Wollongong TCP-IP.  When sending mail to
> the internet you do the following:
>     
> mailer!<somebody@somewhere.arpa>
>     
> What is want to know is how to set forward using the Wollongong
> mailer.  I have tried all kinds of quoting but it still dosen't
> work.
>     
> Anyone familiar with the Wollongong implementation of TCP-IP
> please send me email.  Thanks.

As far as I know, it is not possible to set forward for such
an address, because the "!" introduces a comment in VMS. Not only that, you 
can not use logicals, nor the distribution list. I have written a command
procedure that accepts logicals. I am posting it here for those who are 
interested. To run it, extract the command procedure LMAIL.COM and first
run it by @LMAIL ?. I hope the built-in HELP is conprehensive enough. You can
define all your logicals in a file SYS$LOGIN:LMAIL.INI, here is a sample

 $! LMAIL.INI
 $!
 $ DEFINE SK1 "KANG%ROBAX.DECNET@VENUS.YCC.YALE.EDU" ! A sample internet add
 $ DEFINE SK2 "SUN@YALEVMS.BITNET"		     !          BITNET add
 $ DEFINE SK3 "SEISMO!YALE!SUN-KANG"		     !          UUCP address
 $ DEFINE CJ  "CHEN@VAX1.OXFORD.AU.UK"		     !          JANET address
 $ DEFINE SK4 "ROBAX::KANG"			     ! 	Local DECNET address
 $ EXIT

Another thing you need to do is to change the GATEWAY definitions to your
local ones. these are GATEWAY, BITGATE, UUCPGATE, JANGATE, CDNGATE etc.

------------------------------ cut here -----------------------------------
$! LMAIL.COM
$! For Logical Mail
$! Send mail to Internet. YCC recently provided a way of sending mails
$! to internet hosts from DECnet host. The syntax is VENUS::MAILER!<...>.
$! However, for some reason, the VMS comment mark '!' can not be carried
$! on in logicals and in distribution list. This file is writen in hope
$! that one can send mails using logicals as address.
$! RELEASE: 1.0
$!
$! Author's Info
$!
$! --- Kang Sun
$!
$! US Mail : Kang Sun
$!	     Yale University
$!	     Becton Center, P.O.Box 2157
$!	     New Haven, CT 06520
$!
$! Internet: kang%robax.decnet@venus.ycc.yale.edu               (prefered)
$!           sun@venus.ycc.yale.edu            (if the above doesn't work)
$!           sun-kang@yale.edu
$! Bitnet:   kang%robax.decnet%venus@yalecs.bitnet 	     (prefered)
$!           sun-kang@yalecs.bitnet            (if the above doesn't work)
$!           sun@yalevms.bitnet              (for file transfer over JNET)
$!
$! Record of changing
$! 08/16/87 Release 1.0
$!          First created from RMAIL.COM
$! 08/19/87 BITNET mails to <@yale.edu:user@host.bitnet>
$!          DECNET addresses identified by symbol "::"
$! 08/22/87 In order to prevent the txt lose due to link failure, save
$!	    the message to be sent in file sys$login:lmail.txt
$! 08/26/87 Venus is now also serving as a gateway to bitnet. The new gateway
$!          is therefore <user%site.bitnet@venus.ycc.yale.edu>.
$!          UUCP mails still go through yale.edu.
$! 08/30/87 Add in the ability to handle the case of sending multiple files.
$!          In case the file name is presented, ask if want to edit.
$! 09/17/87 Add qualifiers and help at the end.
$! 09/28/87 Change UUCP Gateway to UUNET.UU.NET
$!          Post to INFO-VAX
$!          
$!*********************************************************************
$!
$ GATEWAY = "VENUS::"   ! The DECNET node through which mails are delivered 
$                       ! to internet etc. If this program is run on such a
$                       ! node, let GATEWAY = "".
$          ! The following gateway nodes has to be set to your local 
$          ! gateways. In this command procedure, the gateway will be 
$          ! appand to the given address. For example, if the given address 
$          ! is node2!node1!user, then the finally formed address will
$          ! be VENUS::MAILER!<node2!node1!user@UUNET.UU.NET>.
$ BITGATE = "@YALE.EDU" 		! BITNET gateway
$ CDNGATE = "%UBC.CSNET@RELAY.CS.NET"	! CDNnet gateway
$ JANGATE = "@CS.UCL.AC.UK"             ! JANET gateway
$ UUCPGATE = "@UUNET.UU.NET"		! UUCP gateway
$ MSGNO = "00000000"	! This initialization is vital, for if quit while
$                       ! MSGNO is empty, the DELETE command at the end will
$			! delete file in the default directory.
$ ON CONTROL_Y THEN GOTO PANIC
$ ON CONTROL_C THEN GOTO PANIC
$ IF F$LOGICAL("LMAIL$INI") .NES. "" THEN GOTO LMAILINI_DEFINED
$ IF F$SEARCH("SYS$LOGIN:LMAIL.INI") .NES. "" THEN GOTO RUN_LMAILINI
$ WRITE SYS$OUTPUT "Cannot find file LMAIL.INI in directory SYS$LOGIN."
$ GOTO LMAILINI_DEFINED
$RUN_LMAILINI:
$ @SYS$LOGIN:LMAIL.INI		! define the logical equivalent.
$ DEFINE LMAIL$INI "TRUE"	! mark that logicals have been defined
$LMAILINI_DEFINED:
$ IF P1 .EQS. "?" THEN GOTO HELP
$				! parse the parameters for qualifiers
$ STRING = " ''P1' ''P2' ''P3' ''P4' ''P5' ''P6' ''P7' ''P8'"
$ P1 = ""			! file name
$ P2 = ""			! recipients
$ P3 = ""			! subject
$ P4 = ""
$ P5 = ""
$ P6 = ""
$ P7 = ""
$ P8 = ""
$ STRING = F$EDIT(STRING,"COMPRESS")
$ SSTRING = F$EDIT(STRING,"UPCASE")
$ STRLN = F$LENGTH(STRING)
$ EDITING = "N"			! By default, EDITOR is not invoked.
$ IF F$LOCATE("-E",SSTRING) .NE. STRLN THEN EDITING = "Y"
$ CONFIRMING = "N"		! By default, no confirm.
$ IF F$LOCATE("-C",SSTRING) .NE. STRLN THEN CONFIRMNG = "Y"
$ FILING = "N"			! By default, sending no file
$ IF F$LOCATE("-F",SSTRING) .NE. STRLN THEN FILING = "Y"
$ SUBJECTING = "N"		! Do not prompt for subject if sending file
$				! Superseed by FILING and EDITING
$ IF F$LOCATE("-S",SSTRING) .NE. STRLN THEN SUBJECTING = "Y"
$ IF FILING .AND. EDITING THEN SUBJECTING = "Y"
$ IF .NOT. FILING THEN SUBJECTING = "Y"
$				! Remove the qualifiers and assign the rest
$				! to P1, ....., P8.
$ STRING = STRING - """"	! Remove the possible '"' for subject
$ STRING = STRING - """"
$ STRING = F$EDIT(STRING,"COMPRESS")
$				! Extract the parameters
$				! P1 file name
$				! P2 address
$				! p3 subject
$ N = 0
$ NN = 2			! if no -F then P1 = ""
$ IF FILING THEN NN = 1
$PLOOP:
$ N = N+1
$ KEY = F$ELEMENT(N," ",STRING) ! extract an element.
$ IF KEY .EQS. " " THEN GOTO NOPS ! No more if key is " ".
$ IF F$LOCATE("-",KEY) .EQ. 0 THEN GOTO PLOOP	! ingnore qualifiers
$ P'NN' = KEY
$ NN = NN+1
$ IF NN .NE. 9 THEN GOTO PLOOP
$NOPS:				! No more quals or paras.
$ P3 = "''P3' ''P4' ''P5' ''P6' ''P7' ''P8'"	! P3 is the subject.
$ IF F$EDIT(P3,"COMPRESS,COLLAPSE,TRIM") .EQS. "" THEN P3 = ""
$				!
$ IF .NOT. FILING THEN GOTO FILE_FOUND
$ENTER_FILENAME:		! Enter file name(s) to be sent
$ FILESPEC = """"""		! also an important initialization. 
$ IF P1 .EQS. "" THEN  READ SYS$COMMAND P1/PROMPT="File(s) to send: "
$ IF P1 .EQS. "" THEN GOTO ENTER_FILENAME
$ P1 = F$PARSE(P1,"*.*;*")	! Create directory wildcard specification
$ FILESPEC = F$SEARCH(P1,1)	! See if the file exist.
$ IF FILESPEC .NES. "" THEN GOTO FILE_FOUND
$ WRITE SYS$COMMAND  "File ''P1' doesnot exist, enter again."
$ P1 = ""
$ GOTO ENTER_FILENAME
$FILE_FOUND:
$                       	! Enter recipent address(es)
$ IF P2 .EQS. "" THEN READ SYS$COMMAND P2/PROMPT="Receiver's Address: "
$ IF P2 .EQS. "" THEN GOTO ADDRESSES	! No recipents
$                       ! Initialization, generate the messagge file names
$ MSGNO = f$time()                      ! take hour,minute,seconds part
$ MSGNO = f$edit(MSGNO,"TRIM")          ! of the current time
$ MSGNO = f$element(1," ",MSGNO)
$ MSGNO = MSGNO-":"                     ! remove delimiters between hour,
$ MSGNO = MSGNO-":"                     ! minutes and seconds
$ MSGNO = f$extract(0,6,MSGNO)          ! save the first six digits
$ MSGJOB = "SYS$LOGIN:MSGNO" + ".JOB"   ! file that to be executed as a job
$ MSGNOPLUS = "''MSGNO'0"		! for multiple files, sequetial number
$ open/write job 'MSGJOB'		! open job control file
$ write job     "$ mail"
$
$                       ! File_loop were executed for each file
$FILE_LOOP:
$ ADDR = f$edit(p2,"COLLAPSE,TRIM,LOWERCASE")
$		 			! Enter Subject
$ IF .NOT. FILING THEN GOTO ENTER_SUBJECT
$ IF .NOT. CONFIRMING THEN GOTO ENTER_SUBJECT
$ INQUIRE Y "Send file ''FILESPEC' to ''P2' ? (Y/N) "
$ IF .NOT. Y THEN GOTO ENDMAIN
$ENTER_SUBJECT:
$ IF P3 .EQS. "" .AND. SUBJECTING THEN  READ SYS$COMMAND P3/PROMPT="Subject: "
$ IF P3 .EQS. "" .AND. FILING THEN -
  P3 = F$ELEMENT(1,"]",F$PARSE(FILESPEC)) ! file name for default.
$ SUBJECT = " ''P3'"
$ P3 = ""				! Clear up P3 for next iteration
$					! generate message number
$ MSGMSG = "SYS$LOGIN:''MSGNOPLUS'.MSG" ! file that contains the message
$					! prepare the message body
$ IF .NOT. FILING THEN GOTO ENTER_MESSAGE ! Send no file
$ IF .NOT. EDITING THEN GOTO SKIP_EDIT
$ENTER_MESSAGE:
$ IF EDITING .AND. F$LOGICAL("mail$edit") .NES. "" THEN GOTO INVOKE_MAILEDIT
$					! MAIL$EDIT is not defined or no EDITING
$ WRITE SYS$OUTPUT -
 "Enter your nessage. To send it, type Control-Z, or to quit, Control-C"
$ WRITE SYS$OUTPUT -
 "****************************** Message Body *************************"
$ CONVERT/WRITE SYS$COMMAND: 'MSGMSG'
$ GOTO SEND_MESSAGE
$INVOKE_MAILEDIT:
$ @MAIL$EDIT 'FILESPEC' 'MSGMSG' ! invoke the default MAIL editor
$ GOTO SEND_MESSAGE
$SKIP_EDIT:
$ COPY 'FILESPEC' 'MSGMSG'
$SEND_MESSAGE:
$		   ! check if the file 'MSGMSG' exists, if not, goto PANIC
$! IF P1 .NES. "" THEN GOTO NOCHECKING		     !The next SEARCH will
$ IF F$SEARCH("''msgmsg'",2) .EQS. "" THEN GOTO PANIC  ! discontinue the 
$ COPY 'msgmsg' SYS$LOGIN:LMAIL.TXT
$NOCHECKING:					     ! search for files
$!
$ CLEAR
$
$! the following loop is executed for each name in ADDR
$ NEXT = 0
$MAINLOOP:
$! extract a name
$ NAME = f$element(NEXT,",",ADDR)
$ if NAME .eqs. "," then goto ENDMAIN   ! no more names
$RETRY:
$ LENGTH = f$length(NAME)
$ if f$locate("@",NAME)  .nes. LENGTH  .or.-	! INTERNET address
     f$locate("!",NAME)  .nes. LENGTH  .or.-  	! UUCP address
     f$locate("::",NAME) .nes. LENGTH then goto NOTRANS ! local DECNET address
$ NNAME = ""
$ NNAME = f$logical("''NAME'")
$ if NNAME .eqs. "" then goto done1
$ ADDR = ADDR + "," + NNAME
$ NEXT = NEXT + 1
$ goto MAINLOOP
$!
$done1:         ! the nick name is not found
$ IF F$LOGICAL("LMAIL$INI") .EQS. "" THEN -
   WRITE SYS$OUTPUT "File SYS$LOGIN:LMAIL.INI does not exist"
$ read sys$output NAME/prompt="Nick name ''NAME' is not defined, enter again "
$ if NAME .eqs. "" then goto MAINLOOP
$ goto RETRY
$!
$NOTRANS:
$!
$! form the address suitable GATEWAY mailer
$ GATE = "''GATEWAY'MAILER!<''NAME'>"      ! for mails to internet
$ LENGTH = f$length(NAME)
$! for bitnet 
$ if f$locate(".bitnet",NAME) .NES. LENGTH then -
     GATE ="''GATEWAY'MAILER!<" + f$element(0,"@",NAME) + "%" -
	+ f$element(1,"@",NAME) + "''BITGATE'>" 
$ if f$locate(".cdn",NAME) .NES. LENGTH then -
     GATE ="''GATEWAY'MAILER!<" + f$element(0,"@",NAME) + "%" -
	+ f$element(1,"@",NAME) + "''CDNGATE'>" 
$! for janet
$ if f$locate(".ac.uk",NAME) .NES. LENGTH then -
     GATE ="''GATEWAY'MAILER!<" + f$element(0,"@",NAME) + "%" -
	+ f$element(1,"@",NAME) + "''JANGATE'>"
$! for uucp
$ if f$locate("!",NAME) .nes. LENGTH then -
     GATE ="''GATEWAY'MAILER!<''NAME'" + "''UUCPGATE'>"
$! for DECNET
$ if f$locate("::",NAME) .nes. LENGTH then GATE = NAME
$ write sys$output " Sending messages to ''GATE', wait ... "
$ write job     "send/noself ''MSGMSG' "
$ write job     "''GATE'"
$ write job     "''SUBJECT'"
$next:
$ NEXT = NEXT + 1
$ goto MAINLOOP
$ENDMAIN:
$ IF P1 .EQS. "" THEN GOTO NO_MORE
$ TMPSPEC = FILESPEC			!
$ FILESPEC = F$SEARCH(P1,1)
$ IF F$ELEMENT(0,";",TMPSPEC) .EQS. F$ELEMENT(0,";",FILESPEC) THEN GOTO ENDMAIN
$                   ! if the two files differ only by version number
$ MSGNOPLUS = MSGNOPLUS + 1		! for multiple files, sequetial number
$ IF FILESPEC .EQS. TMPSPEC THEN GOTO NO_MORE  ! Two files are exactly the same.
$ IF FILESPEC .NES. "" THEN GOTO FILE_LOOP ! See if the file exist.
$NO_MORE:
$ write job     "exit"
$ write job     "$ exit"
$ close job
$
$ @'MSGJOB'
$!
$ goto END
$panic:
$ write sys$output "Quit without sending message."
$ if f$logical("out") .nes. "" then close out
$END:
$ if f$search("''MSGNO'*.*;*") .nes. "" then delete/noconfirm 'MSGNO'*.*;*
$ exit
$
$HELP:
$ CLEAR
$       typeh sys$input

 LMAIL

   A program for sending mail to a remote node over networks
                ARPA, CSnet, UUCP, BITnet or local DECnet.

  Syntax:
	 LMAIL [-cefs] [filename] [addresses] [subject]

  More information available on

  Qualifiers(-cefs)
  ADDRESSES 	FILENAME 	Nicknames	SUBJECT		Example

$
$TOPIC:
$ INQUIRE TOPIC "LMAIL Subtopic"
$ Y = F$EDIT(F$EXTRACT(0,1,TOPIC),"UPCASE")
$ IF Y .EQS. "A" THEN GOTO ADDRESSES
$ IF Y .EQS. "E" THEN GOTO EXAMPLES
$ IF Y .EQS. "F" THEN GOTO FILENAME
$ IF Y .EQS. "N" THEN GOTO NICKNAMES
$ IF Y .EQS. "Q" THEN GOTO QUALIFIERS
$ IF Y .EQS. "S" THEN GOTO SUBJECT
$ IF Y .EQS. "?" THEN GOTO HELP
$ IF Y .EQS. "" THEN EXIT
$ GOTO HELP
$ADDRESSES:
$ CLEAR
$ TYPEH SYS$INPUT

   LMAIL
      ADDRESSES

	One or more of the followings separated by commas:

    	      node::user			(DECNET)
	      user@node.BITNET  		(BITNET)
	      user@node.CDN			(CDNnet)
	      user@domains			(Internet)
	      ...!node2!node1!user		(UUCP)
	      user@node1.node2.AC.UK		(JANET)
	      nickname

	Where a nick name is an alias of addresses defined in LMAIL.INI.

$ GOTO TOPIC
$EXAMPLES:
$ CLEAR
$ TYPEH SYS$INPUT

   LMAIL
      Examples

	EX 1. LMAIL SK,SUNKANA@YALEVM.BITNET "Hello"
          Here, SK, a nickname, together with SUNKANGA... forms the address;
	        "Hello" is the subject.

	EX 2. LMAIL -F TMP.TXT SK,SUNKANA@YALEVM.BITNET
          Qualifer -File indicate that the first parameter is a file name.
	  W/o qualifers -Edit or -Subject, Subject is default to filename.

	Ex 3. LMAIL -E SK Hello morning
          Qualifier -Edit invokes the MAIL$EDIT to edit the outgong message.
	  The Subject "Hello morning" does not need quotation marks.

	Ex 4. LMAIL -F-C-S *.* SK
          Qualifier -Confirm confirms before sending each file matching *.*.
	  Subjects will be prompted for each comfirmed file.


$ GOTO TOPIC
$FILENAME:
$ CLEAR
$ TYPEH SYS$INPUT

   LMAIL
      FILENAME

	Any VMS file specification, including wildcard.


$ GOTO TOPIC
$NICKNAMES:
$ CLEAR
$ TYPEH SYS$INPUT

   LMAIL
      Nicknames

	LMAIL allows you to define nicknames in a file SYS$LOGIN:LMAIL.INI with
     DCL Commands line $DEFINE nickname "addresses" for each nickname.

$ GOTO TOPIC
$QUALIFIERS:
$ CLEAR
$ TYPEH SYS$INPUT

   LMAIL
      Qualifiers
	-Confirm Valid only if -F is used as well. Prompt user to confirm 
	      if he realy want to send the file. Useful when wildcards are
	      used in the file specification.

	-Edit Invoke the EDITOR defined in logical MAIL$EDIT to edit the
	      outgoing mail message.

	-File Send an existing file. When used, the first parameter is 
	      interpreted as file name instead as addresses.

	-Subject Valid only if -F is used as well. When used, user are
	      prompts for subject for each file sent. Otherwise, the file
	      names are used as subjects.	

$ GOTO TOPIC
$SUBJECT:
$ CLEAR
$ TYPEH SYS$INPUT

   LMAIL
      SUBJECT

	Subject of the mail. 

$ GOTO TOPIC
------
