New option -p. Using this option causes minc to print the filename
for each message before checking it for spam, which is useful for
debugging the spam filter.
My trick for defining is_spam() was broken and i never noticed because
i wasn't doing use strict in .mincspam; fix it with eval and also add
spam_start_hook and spam_stop_hook.
(kill_spam): Now call spam_start_hook(), save the list it returns, and
pass it to each spam_check() call (formerly known as is_spam()). Also
pass it to spam_stop_hook() after processing all spam. This allows
the spam processor to maintain state, and do other things like talk to
a co-process.
epg [Tue, 11 Mar 2003 01:13:18 +0000 (01:13 +0000)]
(find_mh_folder): DOH! The // match operation must be done
case-insensitive. I think it used to be and i accidentally changed it
when i changed the substitution operation to matching.
epg [Sun, 19 Jan 2003 03:11:14 +0000 (03:11 +0000)]
mdeliver/current/mdeliver.c:
(deliver): In rev 1582 i changed this from using rename(2) to
the recommended link(2) + unlink(2). But in minc i was using
open(2) + rename(2) instead, which is just as safe as link +
unlink but with one advantage. So switch to that model.
minc/current/minc:
(store_message): Document the open + rename procedure and
explain why it is used instead of link + unlink.
epg [Mon, 30 Dec 2002 02:25:03 +0000 (02:25 +0000)]
(logincoming): Move part of log_headers here.
(log_headers): Pass the array of contents for each header to
logincoming rather than indexing here. logincoming now checks for an
empty array (i.e. message missing this header) before trying to index
into it (it used to bomb).
epg [Sat, 28 Dec 2002 22:28:31 +0000 (22:28 +0000)]
Implement Doug's two killer features: 1) store all occurrences of a
header, not just the last, 2) use pure ordered structure for the
filters, allowing inter-mixing of filters (i.e. you can have some
List-Id filters followed by some X-Mailing-List filters followed by
more List-Id filters and they will all be matched in the correct
order).
Earlier i was using Tie::IxHash to make the filters hash ordered, but
i wasn't using it for the internal hashes so it was incomplete. I
didn't need hashes in teh first place; switching to nested arrays for
the filters structure solves this problem as well as Doug's killer
feature and as a bonus removes the Tie::IxHash dependency.
README:
Remove Tie::IxHash from list of non-standard modules.
minc:
Drop Tie::IxHash.
FILTERS and %headers become more complex structures (code and
documentation changes).
For now, use .mincfilter2 instead of .mincfilter (will change
back as soon as the new code has had a good shake-down).
(log_headers): Adapt for new %headers structure and add comment
cross-referencing the get_headers comment explaining the
structure.
(get_headers): Document the %headers structure. Build and return
the new structure, preserving multiple occurrences of the same
header.
(find_mh_folder): Use the new @FILTERS structure.
(MAIN): Use @FILTERS instead of %FILTERS.
In the closing pod section, fix the EXAMPLES section and add a
section documenting @FILTERS.
epg [Sun, 13 Oct 2002 18:58:03 +0000 (18:58 +0000)]
Fix long-standing bug where filters were applied out of order because
hashes are not guaranteed to stay in the order they were defined. Use
Tie::IxHash to make %FILTERS an ordered hash.
README:
Note that Tie::IxHash is now required.
minc:
use Tie::IxHash;
(%FILTERS): Make this an ordered hash with Tie::IxHash.
epg [Sun, 13 Oct 2002 16:32:26 +0000 (16:32 +0000)]
(store_message): Whoops, document that the for loop is a modified
version of the maildir delivery algorithm; now some of these other
comments make more sense.
(get_headers): Don't allow input from the message to break the
regex used to split headers.
Today i encountered a message with the following ilnes:
X-scanner: scanned by Inflex 1.0.12.3 -
(http: //www.gsm.com.my)
What we have is a broken pile of shit from gsm.com (unsurprisingly,
as i visit the URL they provide, i see that one of their frame
components spits out an HTML page with Content-Type: text/plain)
that doesn't know how to fold headers. At some point, some "helpful"
mail software (perhaps even my very own postfix installation; who
knows?) mangled what appeared to it to be an '(http' header; it
added a space after the colon.
Whether the mangling had happened or not, i'm sure minc would have
been confused. Doug Porter provided the fix (using perl's \Q and
\E in the split() regex to disable pattern meta-chars in $fieldname).
I was using EX_TEMPFAIL for nearly every failure case, as if this were
a delivery program. Comb the file for each incidence and use a better
exit code if appropriate.
(store_message): Handle not being able to run the mark command and
being able to run it but having it fail separately.
epg [Sat, 31 Aug 2002 23:58:52 +0000 (23:58 +0000)]
(%FOLDERS): Remove this global. Whether to print the folder's name is
now being subsumed into the marking unseen messages functionality
moving into filter_mail.
(store_message): Don't run mark messages unseen, and start returning
the stored message number for callers to use.
(filter_mail): Keep a hash of folders and message numbers, printing
each folder name only once and running one mark(1) command for each
folder to mark the new messages unseen.
epg [Sat, 31 Aug 2002 18:44:47 +0000 (18:44 +0000)]
use Errno and Fcntl qw(O_WRONLY O_EXCL O_CREAT) .
(get_highest_msgnum): Restructure to step through readdir itself
rather than go through getfiles, since we don't want full path names
like that returns, but only the base filenames readdir returns. Also
fix it to return the highest number in the folder, not that number
plus one, making its name accurate.
(store_message): Adapt to get_highest_msgnum returning only the
highest message number. Use better $! test. Only create the empty
message file with sysopen when not $run. Use the full filename in the
error message when we couldn't find a new filename.
epg [Fri, 30 Aug 2002 07:33:07 +0000 (07:33 +0000)]
(get_new_msgnum): New function, loops across the list returned by
getfiles and returns the number for a new message to go into an mh
folder. This is a replacement for the command 'mhpath new'.
(store_message): Address the XXX comment about using 'mhpath new' by
not using it, instead calling get_new_msgnum. Furthermore, use an
algorithm similar to the maildir delivery algorithm to get the
filename to rename to.
epg [Sun, 25 Aug 2002 22:29:48 +0000 (22:29 +0000)]
(is_spam): Change logic of testing razor-check exit code slightly to
bomb if execution of razor-check failed (as opposed to sucessful
execution with a failure exit code).