Spam Auto learn scripts not deleting messages

Best practice information from Scalix users relating to integration of Scalix with other products.

Moderator: ScalixSupport

Mysterious
Posts: 41
Joined: Tue May 08, 2007 6:05 am

Spam Auto learn scripts not deleting messages

Postby Mysterious » Wed Dec 12, 2007 10:29 am

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;
                        }
                }

        }

}


kcsc
Posts: 62
Joined: Thu Oct 04, 2007 11:35 am
Location: US

Postby kcsc » Thu Dec 13, 2007 11:13 am

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;

Mysterious
Posts: 41
Joined: Tue May 08, 2007 6:05 am

Postby Mysterious » Fri Dec 14, 2007 7:41 am

Okay...my fault. That was the missing line :-) Thanks.

Mysterious
Posts: 41
Joined: Tue May 08, 2007 6:05 am

Postby Mysterious » Sun Jan 27, 2008 9:20 am

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

kcsc
Posts: 62
Joined: Thu Oct 04, 2007 11:35 am
Location: US

Postby kcsc » Mon Jan 28, 2008 9:57 am

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.

Mysterious
Posts: 41
Joined: Tue May 08, 2007 6:05 am

Postby Mysterious » Mon Feb 04, 2008 8:31 am

Thanks, that was the missing line.

stephan.klein
Posts: 68
Joined: Thu Feb 22, 2007 1:10 pm
Location: Germany

Postby stephan.klein » Fri Feb 29, 2008 12:20 pm

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


Return to “Third Party Integration”



Who is online

Users browsing this forum: No registered users and 0 guests