ðSyntax10.Scn.Fnt‰þÿÿÐûÐûInfoElemsAllocVSyntax10.Scn.FntÍõÿÿÿð+ÀÔStampElemsAlloc25 Mar 99S!"Title": Filter "Author": Robert Lichtenberger "Abstract": Filtering emails by subject, a very simple kind of filtering emails "Keywords": e-mail filtering spam "Version": 0.01 "From": 27.10.98 "Until":  "Changes": no changes "Hints": Register this module as Receiver in Mail.Profile eSyntax10b.Scn.Fntÿÿÿÿ€8ÀÔFoldElemsNewÿÿÿÿ€8ÀÔÿÿÿÿ€8ÀÔTÿÿÿÿ€8ÀÔÿÿÿÿ€8ÀÔÿÿÿÿ€8ÀÔ1MODULE Filter;  IMPORT PostOffice, Mail, Out, Files, Strings, TextFrames, Texts; CONST Profile = "Filter.Profile"; TYPE String = PostOffice.String; FilterRule* = POINTER TO FilterRuleDesc; FilterRuleDesc* = RECORD field: String; word: String; boxName: String; next: FilterRule END; VAR oldRec: PostOffice.Receiver; rules*: FilterRule; PROCEDURE Filter*(m: PostOffice.Mail; t: Texts.Text); VAR cur: FilterRule; box: PostOffice.Mailbox; fieldBody, empty: String; hdr: PostOffice.Header; BEGIN NEW(empty, 1); COPY("", empty^); cur := rules; hdr := m.header.GetHeaderField(cur.field^); IF hdr # NIL THEN fieldBody := hdr.body ELSE fieldBody := empty END; WHILE (cur # NIL) & ~Strings.Match(fieldBody^, cur.word^) DO cur := cur.next; IF (cur # NIL) THEN hdr := m.header.GetHeaderField(cur.field^); IF hdr # NIL THEN fieldBody := hdr.body ELSE fieldBody := empty END; END; END; IF cur # NIL THEN PostOffice.GetBox(cur.boxName^, box); box.AppendMail(m, t); Out.String("Filter: Mail stored in "); Out.String(cur.boxName^); Out.String(".mbx"); Out.Ln; ELSE oldRec(m, t); END; END Filter; PROCEDURE UpdateProfile*;  VAR f: Files.File; t: Texts.Text; fName: ARRAY 128 OF CHAR; r: FilterRule; s: Texts.Scanner; BEGIN rules := NIL; COPY(PostOffice.mDir, fName); Strings.Append(Profile, fName); f := Files.Old(fName); IF f = NIL THEN Out.String("Filter: Cannot read Filter.Profile. Filter will not work$") ELSE t := TextFrames.Text(fName); Texts.OpenScanner(s, t, 0); Texts.Scan(s); WHILE ~s.eot & ((s.class = Texts.Name) OR (s.class = Texts.String)) DO NEW(r); r.next := rules; rules := r; NEW(r.field, Strings.Length(s.s) + 1); COPY(s.s, r.field^); Strings.Cap(r.field^); Texts.Scan(s); NEW(r.word, Strings.Length(s.s) + 1); COPY(s.s, r.word^); Texts.Scan(s); NEW(r.boxName, Strings.Length(s.s) + 1); COPY(s.s, r.boxName^); Texts.Scan(s) END; END END UpdateProfile;  PROCEDURE Init;  BEGIN oldRec := Mail.receiver; Mail.receiver := Filter; UpdateProfile END Init;  BEGIN Init;  END Filter.UpdateProfile