1000 ! MAIL.BAS - Erskine College's electronic mail COMPILE <232> & ! & ! 12-Mar-87 F. Mitchell Erskine College & ! & ! 27-Sep-88 last edit *M & ! & ! Author: W. Franklin Mitchell, Jr. & ! Director of Computer Services & ! Erskine College, Due West, South Carolina & ! & ! Copyright (c) 1987, 1988 & ! Erskine College, Due West, South Carolina & ! & ! *********************************************************************** & ! * This software is furnished without charge by Erskine College and * & ! * may be copied only with the inclusion of the author's name and * & ! * copyright notice. No title to or ownership of this software is * & ! * hereby transmitted. Neither Erskine College nor the author assumes * & ! * any responsibility for the use or reliability of this software. The * & ! * author welcomes comments and/or bug reports mailed to Franklin * & ! * Mitchell, Erskine College, Box 86L, Due West, South Carolina 29639. * & ! *********************************************************************** & 1010 PROG$ = "Erskine College MAIL V1.2" & 1020 DIM M%(30) & \ DIM #3%, USER.NAME$(200)=16%, PPN%(200), & ADDRESS.LIST$(50)=16%, WHO$(50)=64% & 1030 DEF FNASK$(P$, D$, T%) & \ PRINT & \ PRINT P$; " <"; D$; ">"; 1040 INPUT LINE A$ & \ A$ = CVT$$(A$, T%) & \ A$ = D$ IF LEN(A$) = 0% & \ A$ = LEFT(A$, 1%) IF T% = -1% & \ FNASK$ = A$ 1050 FNEND & 1060 ON ERROR GOTO 19000 & \ TRAP.CTRL.C$ = CHR$(6%) + CHR$(-7%) & \ M$ = SYS(TRAP.CTRL.C$) & \ DROP.PRIV$ = CHR$(6%) + CHR$(-21%) + CHR$(255%) & \ M$ = SYS(DROP.PRIV$) & \ GAIN.PRIV$ = CHR$(6%) + CHR$(-21%) + CHR$(0%) & \ ECHO.ON$ = CHR$(2%) & \ ECHO.OFF$ = CHR$(3%) & \ LAST.R% = -1% & \ MY.KB% = 1% & \ MAIL.BOX% = 2% & \ POST.OFFICE% = 3% & \ POST.OFFICE$ = "MAIL:POST.OFF" & \ MAIL.CH% = 4% & \ MAIL.FILE% = 5% & \ XMIT.CH% = 6% & \ QUES% = ASCII("?") & \ ESC$ = CHR$(155%) & \ CR$ = CHR$(13%) & \ LF$ = CHR$(10%) & \ BELL$ = CHR$(7%) & 1070 CHANGE SYS(CHR$(6%) + CHR$(26%)) TO M% & \ JOB.NR% = M%(3%)/2% & \ KB.NR% = M%(4%) & \ PPN% = M%(21%) + SWAP%(M%(22%)) & 1075 if m%(22%) > 12% & then & print & \ print "?MAIL privilege required." & \ goto 32767 & ! & ! This patch allows mail only in accounts [0,*]-[12,*]. & 1080 OPEN "[1,3]KB.MAP" FOR INPUT AS FILE 1%, MODE 8192% & \ INPUT LINE #1%, M$ & \ CLOSE 1% & \ K% = VAL(MID(M$, KB.NR% + 1%, 1%)) & \ CRT% = (K% > 1%) & \ CLEAR$ = "" & \ ERASE$ = "" & \ CLEAR$ = CHR$(12%) IF K% = 4% & \ CLEAR$ = CHR$(126%) + CHR$(28%) IF K% = 2% & \ IF K% = 3% & THEN & ERASE$ = ESC$ + "J" & \ CLEAR$ = ESC$ + "H" + ERASE$ & 1090 IF K% = 5% & THEN & ERASE$ = ESC$ + "[J" & \ CLEAR$ = ESC$ + "[H" + ERASE$ & 1100 PRINT CLEAR$ & 1110 OPEN "KB:MAIL.MAN" AS FILE MY.KB% & 1120 OPEN "MAIL.MAI" FOR INPUT AS FILE MAIL.BOX%, & \ GOTO 1140 & 1130 P0% = SWAP%(PPN%) AND 255% & \ P1% = PPN% AND 255% & \ PRINT & \ PRINT "You are in account ["; NUM1$(P0%); ","; NUM1$(P1%); "]." & \ M$ = FNASK$("Do you want to establish a mail box in this account", & "N", -1%) & \ GOTO 32700 IF M$ = "N" & \ OPEN "MAIL.MAI" AS FILE MAIL.BOX%, & CLUSTERSIZE -4%, & FILESIZE 16%, & MODE 1% + 64% + 1536% & 1140 FIELD #MAIL.BOX%, 6% AS Z$, 2% AS VE$, 2% AS TY$, 6% AS Z$, 6% AS FO$, & 2% AS Z$, 2% AS NEW.MSG$, 16% AS MAIL.BOX.NAME$ & \ FIELD #MAIL.BOX%, 73%*X% AS Z$, 32% AS MSG.TITLE$(X%), & 16% AS MSG.WHO$(X%), 2% AS MSG.PPN$(X%), & 2% AS MSG.TIME$(X%), 2% AS MSG.DATE$(X%), & 1% AS MSG.STAT$(X%) FOR X% = 0% TO 6% & \ FIELD #MAIL.BOX%, 512% AS BUF$ & \ LSET BUF$ = " " & 1150 R%, LAST.R% = 1% & \ GET #MAIL.BOX%, RECORD R% & \ ME$ = MAIL.BOX.NAME$ + "" & \ GOTO 1180 IF FO$ = "FOLDER" & \ LSET VE$ = CVT%$(SWAP%(1%+SWAP%(3%))) & \ LSET TY$ = CVT%$(SWAP%(5%)) & \ LSET FO$ = "FOLDER" & \ LSET NEW.MSG$ = CVT%$(0%) & \ PUT #MAIL.BOX%, RECORD R% & 1160 FOR I% = 2% TO 16% & \ LSET MSG.STAT$(J%) = "X" FOR J% = 0% TO 6% & \ PUT #MAIL.BOX%, RECORD I% 1170 NEXT I% & \ OPT$ = "M" & \ GOTO 2030 & 1180 OPEN POST.OFFICE$ FOR INPUT AS FILE POST.OFFICE%, MODE 8192% & 1900 UNLOCK #MAIL.BOX% & \ DS% = -1% & \ GOSUB 18000 IF STARTED% & \ STARTED% = -1% & \ GOTO 2030 IF CCL% & 2000 PRINT CLEAR$ & \ PRINT PROG$; TAB(60%); TIME$(0%); " "; DATE$(0%) & \ GOTO 2020 IF NOT CRT% & 2010 PRINT & \ PRINT " D - Delete a message"; LF$ & \ PRINT " H - Mail Help"; LF$ & \ PRINT " I - Index of mail in your mailbox"; LF$ & \ PRINT " M - Mail Box maintenance"; LF$ & \ PRINT " R - Read the next new message"; LF$ & \ PRINT " O - Read an old message"; LF$ & \ PRINT " S - Send a message"; LF$ & \ PRINT " U - List mail system users"; LF$ & \ PRINT " X - Exit the Erskine Mail system"; LF$ & 2020 OPT$ = FNASK$("Option", "R", 188%) & \ ARG$ = RIGHT(OPT$, 2%) & \ OPT$ = LEFT(OPT$, 1%) & 2030 CCL% = 0% & \ OPT% = INSTR(1%, "MDHIROSUX", OPT$) & \ IF OPT% = 0% & THEN & PRINT BELL$ & \ GOTO 2000 & 2040 ON OPT% GOTO 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000 & 3000 PRINT CLEAR$ & \ PRINT "Change User Settings:" & 3010 M$ = SYS(GAIN.PRIV$) & \ OPEN POST.OFFICE$ FOR INPUT AS FILE POST.OFFICE% & \ X% = STATUS & \ M$ = SYS(DROP.PRIV$) & \ IF (X% AND 1024%) <> 0% & THEN & PRINT "%The Post Office is temporarily closed. "; & \ PRINT "Please try again later." & \ GOSUB 18000 & \ GOTO 11000 & 3020 X% = -1% & \ NM.DEF$ = "?" & 3030 X% = X% + 1% & \ GOTO 3050 IF X% > 200% & \ GOTO 3030 UNLESS PPN%(X%) = PPN% & \ M$ = FNASK$('Remove "' + USER.NAME$(X%) & + '" from the Mail system', "N", -1%) & \ GOTO 3040 IF M$ = "N" & \ PRINT & \ PRINT USER.NAME$(X%); " now has an unlisted address." & \ PPN%(X%) = 0% & \ USER.NAME$(X%) = CHR$(1%) & \ CLOSE #POST.OFFICE% & \ GOTO 1180 & 3040 NM.DEF$ = USER.NAME$(X%) & \ GOTO 3080 & 3050 X% = -1% & 3060 X% = X% + 1% & \ IF X% > 200% & THEN & PRINT "?The Post has no more mail boxes for rent." & \ GOTO 32700 & 3070 GOTO 3060 IF PPN%(X%) <> 0% & 3080 M$ = FNASK$("Enter your mail box name", NM.DEF$, 156%) & \ GOTO 3080 IF M$ = "?" & \ K% = LEN(M$) & \ IF K% > 16% & THEN & K% = K% - 16% & \ PRINT & \ PRINT "?Sorry, but you've exceeded the name length limit of "; & \ PRINT "16 by"; K%; "character"; & \ PRINT "s"; IF K% <> 1% & \ PRINT "." & \ PRINT & \ PRINT "Try again:" & \ GOTO 3080 & 3090 USER.NAME$(X%) = M$ & \ PPN%(X%) = PPN% & \ CLOSE #POST.OFFICE% & \ R%, LAST.R% = 1% & \ GET #MAIL.BOX%, RECORD R% & \ LSET MAIL.BOX.NAME$ = M$ & \ ME$ = MAIL.BOX.NAME$ + "" & \ PUT #MAIL.BOX%, RECORD R% & \ GOTO 1180 & 4000 PRINT CLEAR$ & \ IF LEN(ARG$) & THEN & M$ = ARG$ & ELSE & M$ = FNASK$("Message to delete", "1", 6%) & 4010 MSG% = VAL(M$) & \ PRINT & \ GOSUB 16000 & \ IF NO.MSG% & THEN & PRINT & \ PRINT '?Message number '; NUM1$(MSG%); ' not found. '; & \ PRINT 'Use option "I" for an index of messages.' & \ GOTO 1900 & 4020 PRINT 'Message is:' & \ PRINT & \ PRINT NUM1$(MSG%); '. '; MESSAGE$ & \ M$ = FNASK$('Are you sure you want to delete this message', "N", -1%) & \ IF LEFT(M$, 1%) <> "Y" & THEN & PRINT & \ PRINT "Message saved." & \ GOTO 1900 & 4030 MAIL$ = "MAIL." + RIGHT(NUM1$(100% + MSG%), 2%) & \ PRINT & \ PRINT "Working..." & \ PRINT & \ LSET MSG.STAT$(I%) = "X" & \ PUT #MAIL.BOX%, RECORD R% & 4040 OPEN MAIL$ FOR INPUT AS FILE MAIL.FILE% & \ LSET BUF$ = STRING$(512%, 0%) & \ R%, LAST.R% = -1% & \ X% = 1% & 4050 GET #MAIL.FILE%, RECORD X% & \ PUT #MAIL.FILE% + SWAP%(MAIL.BOX%), RECORD X% & \ X% = X% + 1% & \ GOTO 4050 & 4060 CLOSE #MAIL.FILE% & \ KILL MAIL$ & \ PRINT "Message deleted." & \ GOTO 1900 & 5000 M$ = "0" & \ GOTO 8010 & 6000 PRINT CLEAR$; & \ R% = 1% & \ X% = 7% & \ T% = 0% & 6010 FOR MSG% = 1% TO 99% & \ IF X% < 6% & THEN & X% = X% + 1% & ELSE & X% = 0% & \ R% = R% + 1% & \ GET #MAIL.BOX%, RECORD R% & \ LAST.R% = R% & 6020 GOTO 6040 IF MSG.STAT$(X%) = "X" & \ GOTO 6030 IF T% > 0% & \ PRINT & \ PRINT " Title"; TAB(40%); "From"; TAB(57%); "Time Date" & \ PRINT & 6030 T% = T% + 1% & \ PRINT USING "##. ", MSG%; & \ P% = CVT$%(MSG.PPN$(X%)) & \ P0% = SWAP%(P%) AND 255% & \ P1% = P% AND 255% & \ PRINT MSG.TITLE$(X%); TAB(40%); MSG.WHO$(X%); TAB(57%); & \ PRINT TIME$(CVT$%(MSG.TIME$(X%))); " "; DATE$(CVT$%(MSG.DATE$(X%))); & \ PRINT " "; MSG.STAT$(X%) & \ GOSUB 18000 IF T%/20%*20% = T% & \ GOTO 6050 IF CTRLZ% 6040 NEXT MSG% & 6050 UNLOCK #MAIL.BOX% & \ PRINT & \ PRINT "Total of"; T%; "message"; & \ PRINT "s"; IF T% <> 1% & \ PRINT "." & \ GOTO 1900 & 7000 PRINT CLEAR$; & \ R% = 1% & \ X% = 7% & \ MSG% = 0% & 7010 MSG% = MSG% + 1% & \ IF X% < 6% & THEN & X% = X% + 1% & ELSE & X% = 0% & \ R% = R% + 1% & \ GET #MAIL.BOX%, RECORD R% & \ LAST.R% = R% & 7020 IF MSG% = 100% & THEN & PRINT & \ PRINT '%No new mail messages found. Use option "O" '; & \ PRINT 'to read an old message.' & \ R%, LAST.R% = 1% & \ GET #MAIL.BOX%, RECORD R% & \ LSET NEW.MSG$ = CVT%$(0%) & \ PUT #MAIL.BOX%, RECORD R% & \ GOTO 1900 & 7030 GOTO 7010 IF MSG.STAT$(X%) <> "N" & \ GET #MAIL.BOX%, RECORD 1% & \ T% = SWAP%(CVT$%(NEW.MSG$)) - 1% & \ T% = 0% IF T% < 0% & \ LSET NEW.MSG$ = CVT%$(SWAP%(T%)) & \ PUT #MAIL.BOX%, RECORD 1% & \ GET #MAIL.BOX%, RECORD R% & \ I% = X% & \ GOTO 8040 & 8000 PRINT CLEAR$ & \ IF LEN(ARG$) & THEN & M$ = ARG$ & ELSE & M$ = FNASK$("Message to read", "1", 6%) & 8010 MSG% = VAL(M$) & 8020 IF MSG% = 0% & THEN & MESSAGE$ = "MAIL:MAIL.HLP" & \ R% = 0% & \ GOTO 8050 & 8030 GOSUB 16000 & \ IF NO.MSG% & THEN & PRINT & \ PRINT '?Message number '; NUM1$(MSG%); ' not found. '; & \ PRINT 'Use option "I" for an index of messages.' & \ GOTO 1900 & 8040 MESSAGE$ = "MAIL." + RIGHT(NUM1$(100% + MSG%), 2%) & 8050 OPEN MESSAGE$ FOR INPUT AS FILE MAIL.FILE%, MODE 8192% & \ CTRLZ%, DS%, L% = 0% & \ PRINT CLEAR$; & 8060 INPUT LINE #MAIL.FILE%, M$ & \ PRINT M$; & \ L% = L% + 1% & \ GOSUB 18000 IF L% > 22% & \ GOTO 8060 IF NOT CTRLZ% & 8070 CLOSE MAIL.FILE% & \ IF R% > 0% & THEN & LSET MSG.STAT$(I%) = "O" IF MSG.STAT$(I%) = "N" & \ PUT #MAIL.BOX%, RECORD R% & 8080 GOTO 1900 & 9000 PRINT CLEAR$; & 9010 IF LEN(ARG$) & THEN & MSG$ = ARG$ + "" & ELSE & MSG$ = FNASK$("Message file to send", "?.TMP", 38%) & 9020 ARG$ = "" & \ GOTO 9010 IF (LEN(MSG$) = 0%) OR (ASCII(MSG$) = QUES%) & \ MSG$ = MSG$ + ".TMP" IF INSTR(1%, MSG$, ".") = 0% & 9030 OPEN MSG$ FOR INPUT AS FILE MAIL.FILE% & \ M%(0%) = 30% & \ M%(1%) = 6% & \ M%(2%) = -8% & \ M%(3%) = MAIL.FILE% & \ M%(4%) = 1% & \ M%(X%) = 0% FOR X% = 5% TO 30% & \ CHANGE M% TO M$ & \ CHANGE SYS(M$) TO M% & \ MSG.SIZE% = SWAP%(M%(8%)) + M%(7%) & 9040 DEST$ = FNASK$("Send this message to", "?", 188%) & \ GOTO 9040 IF (LEN(DEST$) = 0%) OR (ASCII(DEST$) = QUES%) & 9050 FOR K% = 0% TO 200% & \ GOTO 9060 IF INSTR(1%, CVT$$(USER.NAME$(K%), -1%), DEST$) = 0% & \ P0% = SWAP%(PPN%(K%)) AND 255% & \ P1% = PPN%(K%) AND 255% & \ PPN$ = "[" + NUM1$(P0%) + "," + NUM1$(P1%) + "]" & \ M$ = FNASK$("Send to " + PPN$ + ' "' + USER.NAME$(K%) + '"', "Y", -1%) & \ GOTO 9070 IF M$ = "Y" 9060 NEXT K% & \ PRINT & \ PRINT "?Addressee not found. Try again:" & \ GOTO 9040 & 9070 M$ = SYS(GAIN.PRIV$) & \ OPEN PPN$ + "MAIL.MAI" AS FILE MAIL.CH%, MODE 1% & \ M$ = SYS(DROP.PRIV$) & \ R% = 1% & \ X% = 7% & \ MSG% = 0% & 9080 MSG% = MSG% + 1% & \ IF X% < 6% & THEN & X% = X% + 1% & ELSE & X% = 0% & \ R% = R% + 1% & \ GET #MAIL.CH% + SWAP%(MAIL.BOX%), RECORD R% & 9090 GOTO 9100 IF MSG.STAT$(X%) = "X" & \ IF MSG% < 100% & THEN & GOTO 9080 & ELSE & PRINT & \ PRINT "?Sorry, "; USER.NAME$(K%); & \ PRINT "'s mail box is full. Try again later." & \ GOTO 9150 & 9100 TITLE$ = FNASK$("Message title", "Mail", 156%) & \ GOTO 9100 IF LEN(TITLE$) = 0% & \ T% = LEN(TITLE$) & \ IF T% > 32% & THEN & T% = 32% - T% & \ PRINT & \ PRINT "%Title exceeds limit of 32 characters by "; & \ PRINT NUM1$(T%); " character"; & \ PRINT "s"; IF T% <> 1% & \ PRINT ". Try again:" & \ GOTO 9100 & 9110 LSET MSG.TITLE$(X%) = TITLE$ & \ LSET MSG.WHO$(X%) = ME$ & \ LSET MSG.PPN$(X%) = CVT%$(PPN%) & \ LSET MSG.STAT$(X%) = "N" & \ M$ = SYS(GAIN.PRIV$) & \ LSET MSG.DATE$(X%) = CVT%$(PEEK(512%)) & \ LSET MSG.TIME$(X%) = CVT%$(PEEK(514%)) & \ M$ = SYS(DROP.PRIV$) & \ PUT #MAIL.CH% + SWAP%(MAIL.BOX%), RECORD R% & \ T% = -1% & \ T% = -2% IF MSG.SIZE% > 7% & 9120 M$ = SYS(GAIN.PRIV$) & \ OPEN PPN$ + "MAIL." + RIGHT(NUM1$(100% + MSG%), 2%) & FOR OUTPUT AS FILE XMIT.CH%, & CLUSTERSIZE T%, & FILESIZE MSG.SIZE% & \ M$ = SYS(DROP.PRIV$) & 9130 GET #MAIL.FILE% & \ PUT #XMIT.CH% + SWAP%(MAIL.FILE%) & \ GOTO 9130 & 9140 GET #MAIL.CH% + SWAP%(MAIL.BOX%), RECORD 1% & \ LSET NEW.MSG$ = CVT%$(SWAP%(SWAP%(CVT$%(NEW.MSG$))+1%)) & \ PUT #MAIL.CH% + SWAP%(MAIL.BOX%), RECORD 1% & \ PRINT & \ PRINT "Message delivered." & 9150 CLOSE MAIL.FILE%, MAIL.CH%, XMIT.CH% & \ LAST.R% = -1% & \ GOTO 1900 & 10000 PRINT CLEAR$ & \ PRINT "System users with mail boxes:" & \ PRINT & \ X% = -1% & \ T% = 0% & 10010 X% = X% + 1% & \ GOTO 10020 IF X% > 200% & \ GOTO 10010 IF PPN%(X%) = 0% & \ P0% = SWAP%(PPN%(X%)) AND 255% & \ P1% = PPN%(X%) AND 255% & \ T% = T% + 1% & \ PRINT USING "###. ", T%; & \ PRINT "["; NUM1$(P0%); ","; NUM1$(P1%); "]"; TAB(18%); USER.NAME$(X%) & \ GOSUB 18000 IF T%/20%*20% = T% & \ GOTO 10010 & 10020 PRINT & \ GOTO 1900 & 11000 PRINT CLEAR$ & \ PRINT PROG$; " finished at "; TIME$(0%); "." & \ GOTO 32700 & 16000 B% = (MSG% - 1%)/7% & \ I% = (MSG% - (B% * 7%)) - 1% & \ R% = B% + 2% & 16010 GET #MAIL.BOX%, RECORD R% IF R% <> LAST.R% & \ LAST.R% = R% & \ MESSAGE$ = MSG.TITLE$(I%) & \ IF MSG.STAT$(I%) = "X" & THEN & NO.MSG% = -1% & ELSE & NO.MSG% = 0% & 16020 RETURN & 18000 L% = 0% & \ CTRLZ% = 0% & \ PRINT IF DS% & \ PRINT "Type RETURN to continue... "; & \ M$ = SYS(ECHO.OFF$) & \ INPUT LINE #MY.KB% OPT$ 18010 M$ = SYS(ECHO.ON$) & \ PRINT CR$; ERASE$; & \ OPT$ = CVT$$(OPT$, 188%) & \ ARG$ = RIGHT(OPT$, 2%) & \ OPT$ = LEFT(OPT$, 1%) & \ CCL% = LEN(OPT$) 18020 RETURN & 19000 M$ = SYS(DROP.PRIV$) & \ M$ = SYS(TRAP.CTRL.C$) & \ M$ = SYS(ECHO.ON$) & \ GOTO 20020 IF ERR = 19% & \ RESUME 1130 IF (ERR = 5%) AND (ERL = 1120%) & \ RESUME 4060 IF (ERR = 5%) AND (ERL = 4040%) & \ RESUME 4060 IF (ERR = 11%) AND (ERL = 4050%) & \ RESUME 8070 IF (ERR = 11%) AND (ERL = 8060%) & \ RESUME 9140 IF (ERR = 11%) AND (ERL = 9130%) & \ RESUME 20000 IF (ERR = 5%) AND (ERL = 8050%) & \ RESUME 20010 IF (ERR = 5%) AND (ERL = 9030%) & \ RESUME 2000 IF (ERR = 11%) AND (ERL = 1040%) & \ RESUME 20030 IF (ERR = 11%) AND (ERL = 18000%) & \ RESUME 11000 IF (ERR = 28%) & 19900 CLOSE MY.KB%, MAIL.BOX%, POST.OFFICE%, MAIL.CH%, MAIL.FILE%, XMIT.CH% & \ PRINT & \ PRINT "?Unexpected MAIL error: "; ERR & \ PRINT & \ ON ERROR GOTO 0% & 20000 PRINT & \ PRINT "%Message"; MSG%; "has been deleted." & \ LSET MSG.STAT$(I%) = "X" & \ GOTO 8070 & 20010 PRINT & \ PRINT "%Can't find a message file named "; MSG$; ". Try again:" & \ GOTO 9010 & 20020 SLEEP 2% + (7. * RND) & \ RESUME 0% & 20030 CTRLZ% = -1% & \ GOTO 18010 & 30000 M$ = SYS(CHR$(7%)) & \ IF LEFT(M$, 4%) <> "MAIL" & THEN & PRINT & \ PRINT "?Illegal entry to MAIL." & \ GOTO 32767 & 30100 OPT$ = MID(M$, 6%, 1%) & \ ARG$ = RIGHT(M$, 7%) & \ CCL% = (LEN(OPT$) <> 0%) & \ GOTO 1010 & 32700 CLOSE MY.KB%, MAIL.BOX%, POST.OFFICE%, MAIL.CH%, MAIL.FILE%, XMIT.CH% & 32767 END