$!----------------------------------------------------------------------------+ $! MAILMAINT.COM - Mail maintenance program | $!----------------------------------------------------------------------------+ $! Author: Harry Flowers $! $! This procedure should be used periodicly (weekly is reasonable) to file $! old mail (3 mo. old) into seperate files in subdirectories with the $! original folder name. This keeps the mail directory down to something $! more reasonable, and speeds it up considerably. An attempt has been $! made to make this procedure as generic as possible; your mileage may $! vary. For example, the mail file and folders at the left will create $! the directories, mail files, and folders to the right, assuming old $! mail exists in the folders: $! $! (parent)--[.MAIL]-------------------+--[.INFOVAX] $! MAIL.MAI & MAIL$*.MAI | INFOVAX.MAI & MAIL$*.MAI $! Folders: INFOVAX | Folder: INFOVAX $! MAIL +--[.SECURITY] $! SECURITY SECURITY.MAI & MAIL$*.MAI $! Folder: SECURITY $! $! To read old mail, just SET FILE to the correct folder.MAI file. $! $ SET NOON ! Don't bomb out $ MYPID = F$GETJPI(0,"PID") $ TMPFIL = "SYS$SCRATCH:TMPMAILMAINT" + MYPID + ".TMP" $ CMDFIL = "SYS$SCRATCH:CMDMAILMAINT" + MYPID + ".TMP" $ CLOSE/NOLOG TMPFIL ! Just in case $ IF F$SEARCH(TMPFIL) .NES. "" THEN DELETE/NOLOG/NOCONFIRM 'TMPFIL';* $! $ DEFINE/USER_MODE SYS$OUTPUT 'TMPFIL' $ MAIL ! Now, get the folder names DIRECTORY/FOLDER EXIT $ OPEN/READ TMPFIL 'TMPFIL' $ DIRLOOP: $ READ/END=GOT_FOLDERS TMPFIL MDIR $ IF F$ELEMENT(0," ",MDIR) .NES. "Listing" THEN GOTO DIRLOOP $! $ MDIR = F$ELEMENT(4," ",MDIR) $ MDIR = F$PARSE(MDIR,,,"DEVICE") + F$PARSE(MDIR,,,"DIRECTORY") $! $ WRITE SYS$OUTPUT "Index cleanup of ''MDIR'MAIL.MAI beginning..." $! This does basically what the COMPRESS option does without actually $! compressing the file. Assuming the flow of mail is similar from $! week to week, this will keep the mail file from a shrink-expand $! cycle. If you get an unusual amount of mail, you might wish to $! use the COMPRESS command from inside MAIL. $ SET PROT=O:RWED 'MDIR'MAIL.MAI $ WRITE SYS$OUTPUT "[If you get mail now, check MAIL.OLD!]" $ WRITE SYS$OUTPUT "" $ COPY/LOG/NOCONFIRM 'MDIR'MAIL.MAI 'MDIR'MAIL_'MYPID'_CVT.TMP $ CONVERT/NOSORT/STAT 'MDIR'MAIL_'MYPID'_CVT.TMP 'MDIR'MAIL_'MYPID'_CVT.TMP $ RENAME/LOG/NOCONFIRM 'MDIR'MAIL.MAI 'MDIR'MAIL.OLD $ RENAME/LOG/NOCONFIRM 'MDIR'MAIL_'MYPID'_CVT.TMP 'MDIR'MAIL.MAI $ SET PROT=O:RW 'MDIR'MAIL.MAI $ WRITE SYS$OUTPUT "" $ WRITE SYS$OUTPUT "Index cleanup complete. [Okay to receive new mail.]" $ WRITE SYS$OUTPUT "" $ PURGE/LOG/NOCONFIRM 'MDIR'MAIL.OLD $ DELETE/NOLOG/NOCONFIRM 'MDIR'MAIL_'MYPID'_CVT.TMP;* $ MPRE = MDIR - "]" + "." $ READ/END=GOT_FOLDERS TMPFIL ALINE $ FOLDERS: $ READ/END=GOT_FOLDERS TMPFIL ALINE $ ALINE = F$EDIT(ALINE,"COMPRESS,TRIM") $ FOLDER = F$ELEMENT(0," ",ALINE) $ GOSUB FILER $ FOLDER = F$ELEMENT(1," ",ALINE) $ IF FOLDER .NES. " " THEN GOSUB FILER $ GOTO FOLDERS $ GOT_FOLDERS: $ CLOSE/NOLOG TMPFIL $ DELETE/NOLOG 'TMPFIL';* $ EXIT $ FILER: ! File mail messages; skip MAIL and NEWMAIL folders $ IF (FOLDER .EQS. "MAIL") .OR. (FOLDER .EQS. "NEWMAIL") THEN RETURN $ QTRAGO = F$CVTIME("-90-","ABSOLUTE","DATE") $ OUTDIR = MPRE + FOLDER + "]" $ WRITE SYS$OUTPUT "" $ WRITE SYS$OUTPUT "Filing mail in folder ''FOLDER' before ''QTRAGO'..." $ IF F$SEARCH("''MDIR'''FOLDER'.DIR;1") .EQS. "" $ THEN CREATE/DIR 'OUTDIR' ! Create directory if needed $ WRITE SYS$OUTPUT "[directory ''OUTDIR' created]" $ ENDIF $ OUTFIL = OUTDIR + FOLDER + ".MAI" $ OUTOLD = OUTDIR + FOLDER + ".OLD" $ OPEN/WRITE CMDFIL 'CMDFIL' $ WRITE CMDFIL "$ MAIL" $ WRITE CMDFIL "SELECT/BEFORE=''QTRAGO' ''FOLDER'" $ WRITE CMDFIL "FILE/ALL/NOCONFIRM ''FOLDER' ''OUTFIL'" $ IF F$SEARCH(OUTFIL) .NES. "" ! Compress if needed $ THEN CDT = F$FILE_ATTRIBUTES(OUTFIL,"CDT") $ CMPCDT = F$CVTIME("''CDT'+00:05:00") ! 5 min after creation $ RDT = F$FILE_ATTRIBUTES(OUTFIL,"RDT") $ CMPRDT = F$CVTIME("''RDT'") ! revision $ IF CMPCDT .LTS. CMPRDT $ THEN WRITE CMDFIL "SET FILE ''OUTFIL'" $ WRITE CMDFIL "COMPRESS" $ WRITE CMDFIL "EXIT" $ WRITE CMDFIL "$ PURGE/NOLOG/NOCONFIRM ''OUTOLD'" $ ELSE WRITE CMDFIL "EXIT" $ ENDIF $ ENDIF $ CLOSE/NOLOG CMDFIL $ @'CMDFIL' $ DELETE/NOLOG 'CMDFIL';* $ RETURN