View Single Post
  #9 (permalink)  
Old 10-01-2007, 11:29 AM
kilrathi kilrathi is offline
Junior Member
 
Posts: 7
Default

We have just migrated from Scalix to Zimbra and so far I'm pretty happy with the results. One piece of the puzzle that seems to be missing is our previous anti-spam functionality. On our old server I had scripts setup to search specified folders in all my users mailboxes, add the mail to our bayes db, then remove that email message from the folder. I used cron jobs to process the users mailboxes and ran the process after hours. I would like to find a way to get the same results with Zimbra.

On our older server I had 3 folders each of my users used for spam training. Spam, Not Spam, and Junk E-mail. The Spam folder was similar to the Junk folder on Zimbra. All of the tagged email spam was automatically moved to that folder via client rules. The 'Not Spam' folder was for messages that were tagged as spam that my users wanted to see in their inbox. The third folder 'Junk E-mail' was the folder where all my users put spam email that showed up in their inbox. The last function of the script was the grab the last 100 messages from the inbox of a select list of users and add it to my bayes db as ham. Originally the script did this for all users. I modified it to only pick from a hand full of people whom i knew kept their inbox clear of spam. The biggest thing I haven't been able to find a way to do with Zimbra is make it remove the message from the users folder once it has been processed.

I accomplished most of this from a perl script the Scalix community posted in their forums. I was able to modify it to fit our needs. I will add my old script below this post for reference, and in hopes that someone with far better perl scripting skills can modify it to fit Zimbra.


I used two different versions of the script. One I ran daily, the other I ran weekly. The daily one processed the Junk E-mail folder. The weekly one processed the Spam folder.

This is the Daily Script
Code:
#!/usr/bin/perl
use strict;
use warnings;
use Mail::IMAPClient;
my $host="<edit>";
my $username="<edit>";
my $password="<edit>";
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.
        if ("$punter" ne "postmaster")
        {
        print "$punter\n";                              # Some output. Feel free to remove.
        #$punter =~s/@/\\@/;
        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 @folders=$imap->folders;                     # list folders.
        foreach my $i ( @folders ) { print $i; }
        foreach  my $folder (@folders)                  # Look through each of them.
        {
                print lc($folder),"\n";
                if (lc($folder) eq "junk e-mail")                                                                    # "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;                                                                #Expunge folder.
                }
                elsif(lc($folder) eq "not 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 already seen.
                                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->delete_message($msg) or next;
                        }
                        $imap->expunge($folder) or next;

                }
        }
        }
}

This is the weekly script
Code:
#!/usr/bin/perl
use strict;
use warnings;
use Mail::IMAPClient;
my $host="<edit>";
my $username="<edit>";
my $password="<edit>";
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.
        if ("$punter" ne "postmaster" )
        {
        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 @folders=$imap->folders;                     # list folders.
        foreach  my $folder (@folders)                  # Look through each of them.
        {
                if (lc($folder) eq "inbox")             # "Inbox" is guaranteed to only have ham in it.
                {
                        if ("$punter" eq "Trusted User 1" ||
                            "$punter" eq "Trusted User 2" ||
                            "$punter" eq "Trusted User 3" ||
                            "$punter" eq "Trusted User 4" ||
                            "$punter" eq "Trusted User 5")
                        {
                                print "Inbox found.\n";         # Some debug output.
                                $imap->select($folder) or next; # Select folder.
                                print "Folder $folder selected.\n";
                                my @list=$imap->seen or next;   # Get only messages which have been read.
                                                                # Saves the possibility of reading in false positives.
                                                                # Also stops us interfering with people's mail.
                                print scalar(@list)." messages in folder.\n";
                                my $counter=0;                  # Initialise counter. - we don't want the entire inbox.
                                foreach my $msg (@list)         # Loop over each message.
                                {
                                        my @email=$imap->fetch($msg,'RFC822');  # Fetch it.
                                        open (SALEARN,"|/usr/bin/spamassassin -d | /usr/bin/sa-learn --ham") or next;                # Feed it to sa-learn.
                                        print SALEARN "$email[1]\n";
                                        close SALEARN;
                                        $counter +=1;           # Increment counter.
                                        last if ($counter>100); # We only want 100 messages.
                                }
                        }
                }
                elsif (lc($folder) eq "spam suspect")                                               # "Possible Spam" folder.
                {
                        print "Found a spam folder: $folder\n";
                       $imap->select($folder) or next;                                              # Select the folder.
                        print "Folder $folder selected.\n";
                  # 1 Week
                  #     my $lastweek=time()-604800;                                                 # Get timestamp for this time last week.
                  # 3 Days
                        my $lastweek=time()-259200;
                        my @list = $imap->before($lastweek) or next;                                # List all messages older than that.
                        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;                                            #Expunge folder.
                }
                elsif (lc($folder) eq "spam")                                                                         # "spam"  folder.
                {
                        print "Found a spam folder: $folder\n";
                       $imap->select($folder) or next;                                                                  # Select the folder.
                        print "Folder $folder selected.\n";
                        my $lastweek=time()-604800;                                                                     # Get timestamp for this time last week.
                        my @list = $imap->before($lastweek) or next;                                                    # List all messages older than that.
                        print scalar(@list)." messages in folder.\n";
                        foreach my $msg (reverse(@list))                                                                # Loop over them all.
                        {
                                my $subject=$imap->subject($msg);                                                       # Fetch subject for message.
                                my @email=$imap->fetch($msg,'RFC822');                                                  # Fetch message.
                                unless ($subject=~m/\[SPAM\]/)
                                {
                                        print "Learning message with subject: $subject\n";
                                        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;                                                                #Expunge folder.
                }

        }
        }
}
Again please note that this script is the work of the people in the Scalix forums. I only modified it to fit my needs. Not taking any credit here just posting for reference and hopefully a solution to add to my new Zimbra server.
Reply With Quote