Page 1 of 1

Spam Auto learn scripts not deleting messages

Posted: Wed Dec 12, 2007 10:29 am
by Mysterious
Hi, i implemented an spam filter system bases on the wiki http://www.scalix.com/wiki/index.php?ti ... amAssassin

Running the script it seems to feed my bayes with objects out of the folder "spam" but after that mails still resists in the spam folder and are not deleted after feeding to the byes.

Heres my script: Someone can give me an hint getting that script deleting the passed messages?

Code: Select all

#!/usr/bin/perl
use strict;
use warnings;
use Mail::IMAPClient;
my $host="10.100.1.20";
my $username="secretuser";
my $password="secret";
my @real_users=`/opt/scalix/bin/omshowu -m all -i`;     # get all real user names.
foreach my $punter (@real_users)                        # Loop over them all.
{
        chomp $punter;                                  # Remove trailing carriage return.
        print "$punter\n";                              # Some output. Feel free to remove.
        my $user="mboxadmin:$username:$punter";         # Set up superuser login.
        my $imap  = new Mail::IMAPClient( 'Server' => $host , 'User' => $user , 'Password' => $password  ) or next;     # connect to server.
#       my $imap = new Mail::IMAPClient( 'Server' => $host , 'User' => $user , 'Password' => $password  ) or die $@;
        my @folders=$imap->folders;                     # list folders.
        foreach  my $folder (@folders)                  # Look through each of them.
        {

         if (lc($folder) eq "spam")                                                                       # "junk email" folder.
                {
                        print "Found a spam folder: $folder\n";
                       $imap->select($folder) or next;                                                                  # Select the folder.
                        print "Folder $folder selected.\n";
                        my @list=$imap->messages or next;                                                              # List all messages in folder.
                        print scalar(@list)." messages in folder.\n";
                        foreach my $msg (reverse(@list))                                                                # Loop over them all.
                        {
                                my @email=$imap->fetch($msg,'RFC822');                                                  # Fetch message.
                                open (SALEARN,"|/usr/bin/spamassassin -d | /usr/bin/sa-learn --spam") or print "$!\n";  # Feed to sa-learn.
                                print SALEARN "$email[1]";
                                close SALEARN;
                                open (REPORT,"|/usr/bin/spamassassin -d | /usr/bin/spamassassin -r") or print "$!\n";   # Report it. (SpamCop and Pyzor).
                                print REPORT "$email[1]";
                                close REPORT;
                                print "$msg";
                                $imap->delete_message($msg) or next;                                                    # Delete it.
                        }


                }


        if(lc($folder) eq "non-spam")
                {
                       $imap->select($folder) or next;                                                                  # Select the folder.
                       print "Folder $folder selected.\n";
                        my @list=$imap->messages or next;                                                              # List all messages in folder.
                        print scalar(@list)." messages in folder.\n";
                       foreach my $msg (reverse(@list))                                                                # Loop over them all.
                        {
                                my @email=$imap->fetch($msg,'RFC822');                                                  # Fetch message.
                                open (SALEARN,"|/usr/bin/spamassassin -d | /usr/bin/sa-learn --forget") or print "$!\n";# Sa-learn forget this message if al$
                                print SALEARN "$email[1]";
                                close SALEARN or print "$!\n";
                                open (SALEARN,"|/usr/bin/spamassassin -d | /usr/bin/sa-learn --ham") or next;          # Feed to sa-learn as ham.
                                print SALEARN "$email[1]";
                                close SALEARN;
                        }
                }

        }

}


Posted: Thu Dec 13, 2007 11:13 am
by kcsc
Try this for the spam folder if

Code: Select all

         if (lc($folder) eq "spam")                                                                       # "junk email" folder.
                {
                        print "Found a spam folder: $folder\n";
                       $imap->select($folder) or next;                                                                  # Select the folder.
                        print "Folder $folder selected.\n";
                        my @list=$imap->messages or next;                                                              # List all messages in folder.
                        print scalar(@list)." messages in folder.\n";
                        foreach my $msg (reverse(@list))                                                                # Loop over them all.
                        {
                                my @email=$imap->fetch($msg,'RFC822');                                                  # Fetch message.
                                open (SALEARN,"|/usr/bin/spamassassin -d | /usr/bin/sa-learn --spam") or print "$!\n";  # Feed to sa-learn.
                                print SALEARN "$email[1]";
                                close SALEARN;
                                open (REPORT,"|/usr/bin/spamassassin -d | /usr/bin/spamassassin -r") or print "$!\n";   # Report it. (SpamCop and Pyzor).
                                print REPORT "$email[1]";
                                close REPORT;
                                print "$msg";
                                $imap->delete_message($msg) or next;                                                    # Delete it.
                        }

                        $imap->expunge($folder) or next;
                }


notice the $imap->expunge($folder) or next;

Posted: Fri Dec 14, 2007 7:41 am
by Mysterious
Okay...my fault. That was the missing line :-) Thanks.

Posted: Sun Jan 27, 2008 9:20 am
by Mysterious
Okay, an new little problem. The above script is working dine. now i added an second script to learn non-spam and spam messages.

The Script is working an learns all described in it,but the non-spam folder isnt expunged after it has been scanned. Someone an idea why it is no deleting all messages after the script has run? Or what i would prefer, coul the script be changed so, that i can dro an messages out of the junk-e-mail folder to the non-spam and after the message was scanned by the non-spam script it is dropped automatically to the inbox?

That would be grat.

THank for your support.

Code: Select all

#!/usr/bin/perl
use strict;
use warnings;
use Mail::IMAPClient;
my $host="10.100.1.20";
my $username="spamadmin";
my $password="password";
my @real_users=`/opt/scalix/bin/omshowu -m all -i`;     # get all real user names.
foreach my $punter (@real_users)                        # Loop over them all.
{
        chomp $punter;                                  # Remove trailing carriage return.
        print "$punter\n";                              # Some output. Feel free to remove.
        my $user="mboxadmin:$username:$punter";         # Set up superuser login.
        my $imap  = new Mail::IMAPClient( 'Server' => $host , 'User' => $user , 'Password' => $password  ) or next;     # connect to server.
#       my $imap = new Mail::IMAPClient( 'Server' => $host , 'User' => $user , 'Password' => $password  ) or die $@;
        my @folders=$imap->folders;                     # list folders.
        foreach  my $folder (@folders)                  # Look through each of them.
        {

         if (lc($folder) eq "spam")                                                                       # "junk email" folder.
                {
                        print "Found a spam folder: $folder\n";
                       $imap->select($folder) or next;                                                                  # Select the folder.
                        print "Folder $folder selected.\n";
                        my @list=$imap->messages or next;                                                              # List all messages in folder.
                        print scalar(@list)." messages in folder.\n";
                        foreach my $msg (reverse(@list))                                                                # Loop over them all.
                        {
                                my @email=$imap->fetch($msg,'RFC822');                                                  # Fetch message.
                                open (SALEARN,"|/usr/bin/spamassassin -d | /usr/bin/sa-learn --spam") or print "$!\n";  # Feed to sa-learn.
                                print SALEARN "$email[1]";
                                close SALEARN;
                                open (REPORT,"|/usr/bin/spamassassin -d | /usr/bin/spamassassin -r") or print "$!\n";   # Report it. (SpamCop and Pyzor).
                                print REPORT "$email[1]";
                                close REPORT;
                                $imap->delete_message($msg) or next;                                                    # Delete it.
                        }

                        $imap->expunge($folder) or next;
                }

        if(lc($folder) eq "non-spam")
                {
                       $imap->select($folder) or next;                                                                  # Select the folder.
                       print "Folder $folder selected.\n";
                        my @list=$imap->messages or next;                                                              # List all messages in folder.
                        print scalar(@list)." messages in folder.\n";
                       foreach my $msg (reverse(@list))                                                                # Loop over them all.
                        {
                                my @email=$imap->fetch($msg,'RFC822');                                                  # Fetch message.
                                open (SALEARN,"|/usr/bin/spamassassin -d | /usr/bin/sa-learn --forget") or print "$!\n";# Sa-learn forget this message if al$
                                print SALEARN "$email[1]";
                                close SALEARN or print "$!\n";
                                open (SALEARN,"|/usr/bin/spamassassin -d | /usr/bin/sa-learn --ham") or next;          # Feed to sa-learn as ham.
                                print SALEARN "$email[1]";
                               close SALEARN;
                        }
                        $imap->expunge($folder) or next;
                }

        }

}



Greetings Mysterious

Posted: Mon Jan 28, 2008 9:57 am
by kcsc
you need to delete the messages first, then expunge them. Add this line at the end of the last "foreach"

Code: Select all

$imap->delete_message($msg) or next;
assuming that you want to delete all the messages that you have learned.

Posted: Mon Feb 04, 2008 8:31 am
by Mysterious
Thanks, that was the missing line.

Posted: Fri Feb 29, 2008 12:20 pm
by stephan.klein
A very interesting script - thank you!

Did you manage to move the ham messages back to inbox after removing the spam-tags? That is the only point i am missing...

Regards
Stephan