[comp.os.vms] Pre-sorting NEWMAIL entries

CBSY8001@IRUCCIBM.BITNET ("J.F.Murphy") (06/26/88)

Hi,
From a recent info-vax entry -

> ... I have examined the
> manuals, and I see no description of any routines for manipulating
> mail files, or even a description of the format of said files. Where
> do I have to go to get one? The microfiche of the system source. I
> don't know about you, but *I'm* not likely to put a lot of work into
> something that someone else in an office somewhere can radically
> change on a whim.
>> ... you don't particularly _need_ to do it in mail ... a simple
>>TPU program which worked on an extracted mail file would be enough).

I'm glad to see other folks find at least SOME aspects of VMS MAIL less
than a total joy.   My main gripe used to be the inability to sort entries
in anything OTHER than date sequence. Normally this isn't a problem
BUT if I've been away a few days and come back to 100+ NEWMAIL items
then, not posessing a photographic memory, I find it a nuisance
having to flit around the mail menu looking thru related-subject entries.

We've VAX and IBM BitNet/EARN nodes here and I used to subscribe
to "busy" lists via the IBM 'cos RiceMAIL, although slow, is VERY
versatile when it comes to re-sequencing mail entries.
(Also, one has the option of replying directly to From: (the individual)
 or Sender: (the list)  ).

Anyway, I eventually cobbled together  MAILSORTER.COM  to help
re-sequence unread VAX Mail entries. Its painfully slow, the method
used is cumbersome -but I've come to find it quite useful and now
look on it as a stopgap until DEC see fit to give the world a
DIR/SEQ=xxx add-on  to the STANDARD mail command..
                           ********

Herewith is a de-commented version - mail me direct if
you feel you must have the full gory detailed, commented one !.
All improvements to this routine gratefully accepted.

Enjoy.
jfm

J.F.Murphy (Project Manager -Systems)
Cork University, Ireland
BITNET/EARN   CBSY8001@IRUCCIBM.BITNET,  CBSY8001@IRUCCVAX.BITNET
HEANET        CBSY8001@IBM1.UCC.IE,      CBSY8001@VAX1.UCC.IE




....................... Cut between dotted lines and save .....................
$!..............................................................................
$! VAX/VMS archive file created by VMS_SHAR V-5.01 01-Oct-1987
$! which was written by Michael Bednarek (U3369429@ucsvc.dn.mu.oz.au)
$! To unpack, simply save and execute (@) this file.
$!
$! This archive was created by CBSY8001
$! on Monday 20-JUN-1988 16:00:50.85
$!
$! It contains the following 1 file:
$! MAILSORTER.COM
$!==============================================================================
$ Set Symbol/Scope=(NoLocal,NoGlobal)
$ Version=F$GetSYI("VERSION") ! See what VMS version we have here:
$ If Version.ges."V4.4" then goto Version_OK
$ Write SYS$Output "Sorry, you are running VMS ",Version, -
                ", but this procedure requires V4.4 or higher."
$ Exit 44
$Version_OK: CR[0,8]=13
$ Pass_or_Failed="failed!,passed."
$ Goto Start
$Convert_File:
$ Read/Time_Out=0/Error=No_Error1/Prompt="creating ''File_is'" SYS$Command ddd
$No_Error1: Define/User_Mode SYS$Output NL:
$ Edit/TPU/NoSection/NoDisplay/Command=SYS$Input/Output='File_is' -
        VMS_SHAR_DUMMY.DUMMY
f:=Get_Info(Command_Line,"File_Name");b:=Create_Buffer("",f);
o:=Get_Info(Command_Line,"Output_File");Set(Output_File,b,o);
Position(Beginning_of(b));Loop x:=Erase_Character(1);Loop ExitIf x<>"V";
Move_Vertical(1);x:=Erase_Character(1);Append_Line;
Move_Horizontal(-Current_Offset);EndLoop;Move_Vertical(1);
ExitIf Mark(None)=End_of(b) EndLoop;Position(Beginning_of(b));Loop
x:=Search("`",Forward,Exact);ExitIf x=0;Position(x);Erase_Character(1);
If Current_Character='`' then Move_Horizontal(1);else
Copy_Text(ASCII(INT(Erase_Character(3))));EndIf;EndLoop;Exit;
$ Delete VMS_SHAR_DUMMY.DUMMY;*
$ Checksum 'File_is
$ Success=F$Element(Check_Sum_is.eq.CHECKSUM$CHECKSUM,",",Pass_or_Failed)+CR
$ Read/Time_Out=0/Error=No_Error2/Prompt=" CHECKSUM ''Success'" SYS$Command ddd
$No_Error2: Return
$Start:
$ File_is="MAILSORTER.COM"
$ Check_Sum_is=1697399019
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X$! MAILSORTER.COM - decommented on 20-JUN-1988 15:34:18.31
X$ v = 'f$VERIFY(0)'
X$ SET NoON
X$ IF P1.EQS."?" THEN GOTO HELP
X$ set = "SET"
X$ SET SYMBOL/SCOPE=(NoLOCAL,NoGLOBAL)
X$ say = "WRITE SYS$OUTPUT"
X$ subj_seq = "SUBJECT:"
X$ subject_key = "/KEY=(POS:41,SIZ:38)"
X$ from_seq = "FROM:"
X$ from_key = "/KEY=(POS:07,SIZ:20) /KEY=(POS:41,SIZ:38)"
X$ IF P1.EQS."" THEN P1 = "FROM:"
X$ par = f$EDIT(P1,"TRIM,UPCASE")
X$ parl = f$LENGTH(par)
X$ sequence = ""
X$ flag = par.EQS.f$EXTRACT(0,parl,subj_seq)
X$ IF flag THEN sortkey = subject_key
X$ IF flag THEN sequence = subj_seq
X$ flag = par.EQS.f$EXTRACT(0,parl,from_seq)
X$ IF flag THEN sortkey = from_key
X$ IF flag THEN sequence = from_seq
X$ IF sequence.EQS."" THEN GOTO BAD_PAR
X$ scratchfile = "SYS$SCRATCH:MAILSORTER.SCRATCH"
X$ rdir = f$ENVIRONMENT("DEFAULT")
X$ SET DEFAULT SYS$LOGIN
X$ mailfile = f$SEARCH("MAIL.MAI;")
X$ IF mailfile.EQS."" THEN mailfile = f$SEARCH("[.MAIL]MAIL.MAI;")
X$ IF mailfile.EQS."" THEN mailfile = f$SEARCH("[...]MAIL.MAI;")
X$ IF mailfile.EQS."" THEN GOTO NO_MAIL_FILE
X$ SET DEFAULT 'rdir'
X$ IF f$SEARCH(scratchfile).NES."" THEN DELETE 'scratchfile';* /NoLOG
X$ say "... Generating a list of folder NEWMAIL contents"
X$ DEFINE/USER_MODE SYS$OUTPUT 'scratchfile';1
X$ MAIL
XSELECT NEWMAIL
XDIR
XEXIT
X$ say "...'Pruning' the list of folder NEWMAIL contents"
X$ DEFINE/USER_MODE SYS$OUTPUT NL:
V$ EDIT /TPU /NoSECTION /NoDISPLAY /COMMAND=SYS$INPUT /OUTPUT='scratchfile';2 's
Xcratchfile';1
V!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
X!
Xfil:=GET_INFO(COMMAND_LINE,"FILE_NAME");buf:=CREATE_BUFFER("",fil);
Xout:=GET_INFO(COMMAND_LINE,"OUTPUT_FILE");SET(OUTPUT_FILE,buf,out);
XPOSITION(BEGINNING_OF(buf));x:="%MAIL-I-SELECTED, 0 messages selected";
Xn:=SEARCH(x,FORWARD,EXACT);IF (n<>0) THEN QUIT; ENDIF;
XPOSITION(BEGINNING_OF(buf));
Vx:="%MAIL-E-NOTEXIST, folder NEWMAIL does not exist";n:=SEARCH(x,FORWARD,EXACT)
X;
XIF (n<>0) THEN QUIT;ENDIF;POSITION(BEGINNING_OF(buf));
XLOOP IF`009(LENGTH(CURRENT_LINE)<35) OR (SUBSTR(CURRENT_LINE,30,1)<>"-") OR
X(SUBSTR(CURRENT_LINE,34,3)<>"-19") THEN`009ERASE_LINE;ELSE MOVE_VERTICAL(1);
XENDIF;EXITIF MARK(NONE)=END_OF(buf);ENDLOOP;POSITION(BEGINNING_OF(buf));
XCHANGE_CASE(buf,UPPER);EXIT;
V!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
X!
X$ IF f$SEARCH("''scratchfile';-1").EQS."" THEN GOTO NO_NEW_MAIL
X$ PURGE/NoLOG 'scratchfile'
V$ say "... Sorting  the list of folder NEWMAIL contents in ", sequence, " Seque
Xnce"
X$ SORT 'scratchfile';2 'scratchfile';3 'sortkey'
X$ PURGE 'scratchfile' /NoLOG
V$ say "... Generating a command file to extract NEWMAIL contents in ", sequence
X, " Sequence"
X$ DEFINE/USER_MODE SYS$OUTPUT NL:
V$ EDIT /TPU /NoSECTION /NoDISPLAY /COMMAND=SYS$INPUT /OUTPUT='scratchfile';4 's
Xcratchfile';3
V!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
X!
Xfil:=GET_INFO(COMMAND_LINE,"FILE_NAME");buf:=CREATE_BUFFER("",fil);
Xout:=GET_INFO(COMMAND_LINE,"OUTPUT_FILE");SET(OUTPUT_FILE,buf,out);
XPOSITION(BEGINNING_OF(buf));COPY_TEXT("$MAIL");SPLIT_LINE;
XCOPY_TEXT("SELECT NEWMAIL");SPLIT_LINE;LOOP nnn:=SUBSTR(CURRENT_LINE,1,5);
XCOPY_TEXT("READ"+nnn);SPLIT_LINE;COPY_TEXT("EXTRACT/APPEND extract_file");
XSPLIT_LINE;COPY_TEXT("DELETE"+nnn);SPLIT_LINE;ERASE_LINE;
XEXITIF MARK(NONE)=END_OF(buf);ENDLOOP;EXIT;
V!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
X!
X$ IF f$SEARCH("''scratchfile';-1").EQS."" THEN GOTO NO_NEW_MAIL
V$ say "... Running  the command file to extract NEWMAIL contents in ", sequence
X, " Sequence"
X$ DEFINE/USER extract_file 'scratchfile';5
X$ @'scratchfile' /OUT=NLA0:
X$ PURGE 'scratchfile' /NoLOG
X$ say "... 'Re-DateStamping' the extract file entries with current date+time"
X$ DEFINE/USER_MODE SYS$OUTPUT NL:
V$ EDIT /TPU /NoSECTION /NoDISPLAY /COMMAND=SYS$INPUT /OUTPUT='scratchfile';6 's
Xcratchfile';5
V!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
X!
Xfil:=GET_INFO(COMMAND_LINE,"FILE_NAME");buf:=CREATE_BUFFER("",fil);
Xout:=GET_INFO(COMMAND_LINE,"OUTPUT_FILE");SET(OUTPUT_FILE,buf,out);
Xff:=ASCII(12);count:=0;POSITION(BEGINNING_OF(buf));
XLOOP EXITIF MARK(NONE)=END_OF(buf);x:=SEARCH(ff,FORWARD,EXACT);EXITIF (x=0);
XPOSITION(x);cl:=CURRENT_LINE;IF (LENGTH(cl)=1) THEN MOVE_VERTICAL(1);
XEXITIF MARK(NONE)=END_OF(buf);cl:=CURRENT_LINE;x:=SUBSTR(cl,1,5);
XIF (x="From:") THEN eol:=LINE_END;y:=SEARCH(eol,FORWARD);POSITION(y);
XERASE_CHARACTER(-17);COPY_TEXT(" ");COPY_TEXT(FAO("!%D",0));count:=count+1;
XENDIF;ENDIF;MOVE_VERTICAL(1);EXITIF MARK(NONE)=END_OF(buf);ENDLOOP;
XIF (count=0) THEN QUIT;ELSE EXIT;ENDIF;
V!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
X!
X$ IF f$SEARCH("''scratchfile';-1").EQS."" THEN GOTO SOMETHING_AMISS
X$ PURGE 'scratchfile' /NoLOG
X$ say "... Moving the modified extract file to folder NEWMAIL_SORTED"
X$ DEFINE/USER_MODE SYS$OUTPUT NL:
X$ DEFINE/USER_MODE new_extract_file 'scratchfile'
X$ DEFINE/USER_MODE mailfile 'mailfile'
X$ MAIL
XSET FILE  new_extract_file
XCOPY/ALL/NOCONFIRM NEWMAIL_SORTED mailfile
XEXIT
X$ DELETE 'scratchfile';* /NoLOG
X$ say ">>> Job Completed -"
V$ say "    Contents of folder NEWMAIL moved to NEWMAIL_SORTED in", sequence, "
XSequence."
X$ say " "
X$FIN:
X$ EXIT 1.OR.'f$VERIFY(v)'
X$NO_NEW_MAIL:
X$ say " "
X$ say "MAILSORTER-I-NONEW% - No entries in NEWMAIL folder."
X$ say " "
X$ IF f$SEARCH(scratchfile).NES."" THEN DELETE/NoLOG 'scratchfile';*
X$ GOTO FIN
X$NO_MAIL_FILE:
X$ say " "
X$ say "MAILSORTER-I-NOMAILFILE% - You don't seem to own a MAIL.MAI file."
X$ say " "
X$ GOTO FIN
X$BAD_PAR:
X$ say " "
X$ say "??? Param ''P1' invalid."
X$ say "    Specify FROM: or SUBJECT:"
X$ say " "
X$ GOTO FIN
X$SOMETHING_FISHY:
X$ say " "
V$ say "??? Modified new version of mail extract file ", scratchfile, " not crea
Xted -"
V$ say "    check file current version ", scratchfile, " for possible problems.
X  "
X$ say " "
X$ GOTO FIN
X$HELP: TYPE /PAGE SYS$INPUT
X
XMAILSORTER
X**********
X
XRoutine to sort the entries in the NEWMAIL folder into either
X   Subject: sequence (regardless of origin)
Xor Subject-within-From: sequence.
X
X
XHave you ever had  lots of NEWMAIL entries  and been a bit cheesed off
Xhaving to skip around and about the MAIL Menu  to entries with related
XSubject: headers ???    Yeah, its a pain AND a distraction, isn't it !.
X
XWell, this routine should make things easier -
X albeit in a   S L O W   and rather sledgehammer fashion.
X  (C'mon DEC, when can we have DIR/SEQ=xxx as a MAIL sub-command ???).
X
XThis routine moves entries in the NEWMAIL folder to folder NEWMAIL_SORTED.
XBecause of  the  snails-pace "speed"  of the current version, it probably
Xisn't worth bothering with  unless you have 30+ or so  mail items waiting
Xfor you.  It is VERY useful when dealing with items received from Mailing
XLists on BITNET etc.
X
X
X
XTo use
X`009@LIB:MAILSORTER seq
X`009`009`009`009where  seq is either SUBJECT: or FROM:
X`009`009`009`009(default = FROM: - ie subject-within-From:)
X`009`009`009`009Abbreviation is permitted - ie S or SU etc.
X then
X`009MAIL
X`009 SELECT NEWMAIL_SORTED
X`009 etc.
X
XDon't forget that NEWMAIL_SORTED entries are NOT automatically moved
Xto the MAIL folder when you read them...
XALSO - the original date&time at the top of each mail item is changed
Xto the current date&time so as to force MAIL to display things in the
Xrequired sequence (kludgy, huh !).
X
XShould you change your mind and decide you want to have mail items in
Xthe alternative sequence the you can RE-sort everything as follows:
X
X`009MAIL
X`009 SELECT NEWMAIL_SORTED
X`009 MOVE/ALL NEWMAIL
X`009 EXIT
X`009@LIB:MAILSORTER othersequencecode
X`009 etc
X
X
XTo make life easier, put the following line in your LOGIN.COM -
X`009DEFINE  mail$init SYS$LOGIN:MAILKEYS.INI
X
XThen create file SYS$LOGIN:MAILKEYS.INI containing the following
X(unless you habitually use PF2, 3, 4 for something specific).
X`009DEFINE/KEY /ECHO/NOLOG             PF2 "DELETE "
X`009DEFINE/KEY /ECHO/NOLOG             PF3 "FILE "
X`009DEFINE/KEY /TERMINATE/ECHO/NOLOG   PF4 "FILE MAIL"
X
XThus, to move an item in folder NEWMAIL_SORTED to folder MAIL,
Xyou merely press PF4.
X
X$ GOTO FIN
$ GoSub Convert_File
$ Exit