> I need a way to search through old email messages quickly and
efficiently.
> I would use this for listserv archives and, I hope, for personal
email.

Perl is very fast at matching arbitrary expressions.


> For example, if I want to find every message where 
> "jones" (case insensitive) is found in the cc field and "linux" is
found 
> in the message body, will they allow for that?  

Let's assume every message contains the string "Subject:" terminated by
a new line (\n) and, when present, "CC:" also ends with a new line.
Anything following that would be message body until the next message,
starting with the "Date:" string.  Something like

    =~ m/Subject:.*?\n.*?CC:.*?jones.*?\n.*?linux.*?Date:/gis

might work.  Other, more interesting, patterns might be "jones" and
"linux" within 250 characters of each other.

    =~ m/jones.[0,250]linux/gis

Would get half of them - we need another match for linux preceding
jones.


> Suppose you are searching for "Mike Jones" and your message happens to
> look like this:

>     You really ought to talk to Mike
>     Jones about that issue.

> Well, with Mike and Jones on two different lines, it won't match. 
> We need something that allows us to handle the newline appropriately.

I've handled this in perl by reading a multi-line string into a
variable, then using the s option to match as a single line (so .
matches \n) - see http://perldoc.perl.org/perlreref.html 

   =~ m/Mike\s*\n*\s*Jones/gis

Should do the trick.