Johannes Berg пишет:
On Tue, 2006-05-02 at 11:27 +0200, Johannes Berg wrote:
I do that, but it's much more userfriendly than multiple folders:
Actually, I misunderstood what you're doing. But you can change my plugin to do exactly what you were looking for by simply doing some other action than calling dspam when a user moves messages.
johannes
I rebuild dspam for making strlen() of spam and not spam tags equivalen each to other. I use only one spam folder, as you, but without any links or such things. Here is script to understand what I'm doing:
---------- BEGIN
use DBI; use File::Find;
$user = "root"; $database = "mail"; $password = "****";
$spam_subfolder = ".SPAM";
$SENDER = "";
$SPAM_TAG = "SpamXXXX"; $HAM_TAG = "Innocent"; $DSPAM_TAG = "X-DSPAM-Result:";
$curfile = "";
$ST = $IT = $SR = $IR = $AM = $AA = 0;
my $DBH = DBI->connect("DBI:mysql:$database", $user, $password) or die "I can't connect! Error: $DBI::errstr\n";
my $sqlm = "SELECT email, homedir, maildir, uid, gid FROM
postfix_users"; my $sthm = $DBH->prepare($sqlm); $sthm->execute; my ($email, $homedir, $maildir, $uid, $gid); $sthm->bind_columns(undef, \($email, $homedir, $maildir, $uid, $gid));
while($sthm->fetch){
# find files in /.spam subfolder
# and retrain dspam with mistake files
my $spamdir = $homedir . "/" . $maildir . $spam_subfolder ;
my $hamdir = $homedir . "/" . $maildir;
$spamdir_cur = $spamdir . "/cur";
$spamdir_new = $spamdir . "/new";
$spamdir_tmp = $spamdir . "/tmp";
$SENDER = $email;
$ST = $IT = $SR = $IR = 0;
# SPAM
print "Training SPAM for user $email in $spamdir_cur...\n";
find(\&wanted_spam, $spamdir_cur);
find(\&wanted_spam, $spamdir_new);
# HAM
print "Training HAM for user $email in $hamdir\n";
find(\&wanted_ham, $hamdir);
$AM = $ST+$IT;
print "Stats for user $SENDER:\n";
print "Total messages : " . $AM . "\n";
print "Spam total: " . $ST . "\n";
print "Innocent total: " . $IT . "\n";
print "HAM -> SPAM: " . $SR . "\n";
print "SPAM -> HAM: " . $IR . "\n";
$AA += $AM;
}
print "Total messages :" . $AA . "\n";
print `date`;
$sthm->finish(); $DBH->disconnect();
#-----------------------------------------------------
sub wanted_spam {
if ( -f $_) {
$ST += 1;
my $yes = 0;
$curfile = $_;
open("FD", "+<", $_) || die "Can't open file $_\n";
flock FD, LOCK_EX || die "Can't lock file $_\n";
while($str = <FD>){
if($str =~ /$DSPAM_TAG/){
$tag = $';
if($tag =~ /$HAM_TAG/){
print "$HAM_TAG found: Rewriting!\n";
print "File: $curfile\n";
print "Dir: $File::Find::dir\n";
seek(FD, - (length($SPAM_TAG) + 2), 1);
print FD " $SPAM_TAG";
seek(FD, -1, 2);
$yes = 1;
$SR += 1;
}else
{
if($tag =~ /" $SPAM_TAG"/){
print "$SPAM_TAG found: OK!\n";
}
}
}
}
flock FD, LOCK_UN || die "Can't RElock file $_\n";
close(FD);
if($yes == 1){
`cat '$curfile'| /usr/local/bin/dspam --user $SENDER
--class=spam --source=error --deliver=`;
}
}
}
sub wanted_ham {
if("$File::Find::dir" ne "$spamdir_cur" && "$File::Find::dir" ne
"$spamdir_new" && "$File::Find::dir" ne "$spamdir_tmp")
{
if ( -f $_) {
$IT += 1;
my $yes = 0;
$curfile = $_;
open("FD", "+<", $_) || die "Can't open file $_\n";
flock FD, LOCK_EX || die "Can't lock file $_\n";
while($str = <FD>){
if($str =~ /$DSPAM_TAG/){
$tag = $';
if($tag =~ /$SPAM_TAG/){
print "$SPAM_TAG found: Rewriting!\n";
print "File: $curfile\n";
print "Dir: $File::Find::dir\n";
seek(FD, - (length($HAM_TAG) + 2), 1);
print FD " $HAM_TAG";
seek(FD, -1, 2);
$yes = 1;
$IR += 1;
}else
{
if($tag =~ /" $HAM_TAG"/){
print "$HAM_TAG found: OK!\n";
}
}
}
}
flock FD, LOCK_UN || die "Can't RElock file $_\n";
close(FD);
if($yes == 1){
`cat '$curfile' | /usr/local/bin/dspam --user $SENDER
--class=innocent --source=error --deliver=`; } } } }
--------- END
I think, that easiest method to don't scan folders is simple log message moving between folders by IMAP server. What do you think about this?
-- С уважением, Савчук Тарас "ЭЛАНТЕК" +7 (495) 589 68 81 +7 (926) 575 22 11 http://www.elantech.ru