[Dovecot] SpamAssassin and Public Namespace

James james at nttmcl.com
Tue Oct 9 22:50:25 EEST 2007


Hi I know i might get flamed for asking this in the dovecot mailing list 
instead of the spamassassin one but i thought someone might be kind 
enough to help anyway.

TIA

I'm trying to do site-wide spam filtering with a public namespace but 
it's not reading the folder i have in the public namespace

This is the public namespace set in my dovecot.conf

#public spam folder
namespace public {
        separator = /
        prefix = Filter/
        location = maildir:/home/vmail/domains/Spam/Maildir/
        hidden = no
}

There's also a .Spam and .Non-spam folder created in that directory

server:/home/vmail/domains/Spam/Maildir# ls -al
total 32
drwxrwxrwx 7 vmail vmail 4096 2007-10-09 10:35 .
drwxrwxrwx 3 vmail vmail 4096 2007-10-05 13:23 ..
drwx------ 2 vmail vmail 4096 2007-10-09 10:35 cur
drwx------ 2 vmail vmail 4096 2007-10-09 10:35 new
drwxrwxrwx 5 vmail vmail 4096 2007-10-09 11:20 .Non-Spam
drwxrwxrwx 5 vmail vmail 4096 2007-10-09 11:19 .Spam
-rw------- 1 vmail vmail   14 2007-10-08 11:58 subscriptions
drwx------ 2 vmail vmail 4096 2007-10-09 10:35 tmp


I'm trying to use this script to login and get the spam from the public 
spam folders and send it to spamassassin to learn
I've highlighted the important parts
There are 13 messages in Spam
There are 5 messages in Non-Spam

Here's the script:

#########################################################################################

#!/usr/bin/perl
#
# Process mail from imap server shared folder 'spam' & 'not-spam' 
through spamassassin sa-learn
# dmz at dmzs.com - March 19, 2004
# http://www.dmzs.com/tools/files/spam.phtml
# LGPL
#
# Things to try if it doesn't work
# 1) Turn debug onto 1 and see if you connect to imap server ad get 
messages (yes i could have made a command line flag, just didn't see the 
need once I got it working :)
# 2) Check your local.cf for spamassassin (in debian it's 
/etc/spamassassin/local.cf) bayes_path settings.
#
# Also be sure to check that your spamassassin is truely using the bayes 
files (-D manual startup of spamd to debug there)
#

use Mail::IMAPClient;
use IO::Socket::SSL;

my $debug=1;
my $salearn;
my $username = 'user';
my $password = 'password';
my $server = 'server.example.com';

my $ssl=new IO::Socket::SSL("$server:imaps");
die ("Error connecting - $@") unless defined $ssl;
$ssl->autoflush(1);

my $imap = Mail::IMAPClient->new(
                                  #Server=> 'imapmailhost:143',
                                  Socket => $ssl,
                                  User => $username,
                                  Password => $password,
                                  Debug => $debug
                                 );

if (!defined($imap)) { die "IMAP Login Failed"; }

# If debugging, print out the total counts for each mailbox
if ($debug) {

   foreach my $foldername ($imap->folders) {
   my $number_of_messages =
   $imap->message_count( $foldername );
   print $foldername, " is imap folder\n";
   }*
   my $spamcount = $imap->message_count('Filter/Spam');*
   print $spamcount, " Spam to process\n";

 *  my $nonspamcount = $imap->message_count('Filter/Non-Spam');*
   print $nonspamcount, " Notspam to process\n" if $debug;
}

# Process the spam mailbox
*$imap->select('Filter/Spam');*
my @msgs = $imap->search("ALL");
for (my $i=0;$i <= $#msgs; $i++)
{
  # I put it into a file for processing, doing it into a perl var & 
piping through sa-learn just didn't seem to work
  $imap->message_to_file("/tmp/salearn",$msgs[$i]);

  # execute sa-learn w/data
#  if ($debug) { $salearn = `/usr/bin/sa-learn -D --no-sync --showdots 
--spam /tmp/salearn`; }
#  else
{ $salearn = `/usr/bin/sa-learn --no-sync --showdots --spam /tmp/salearn`; }
  print "-------\nSpam: ",$salearn,"\n-------\n" if $debug;

  # delete processed message
  $imap->delete_message($msgs[$i]);
  unlink("/tmp/salearn");
}
$imap->expunge();
$imap->close();

# Process the not-spam mailbox
*$imap->select('Filter/Non-spam');*
my @msgs = $imap->search("ALL");
for (my $i=0;$i <= $#msgs; $i++)
{
  $imap->message_to_file("/tmp/salearn",$msgs[$i]);
  # execute sa-learn w/data
#  if ($debug) { $salearn = `/usr/bin/sa-learn -D --no-sync --showdots 
--ham /tmp/salearn`; }
#  else
 { $salearn = `/usr/bin/sa-learn --no-sync --showdots --ham /tmp/salearn`; }
  print "-------\nNotSpam: ",$salearn,"\n-------\n" if $debug;

  # delete processed message
  $imap->delete_message($msgs[$i]);
  unlink("/tmp/salearn");
}
$imap->expunge();
$imap->close();

$imap->logout();

# integrate learned stuff
my $sarebuild = `/usr/bin/sa-learn --sync`;
print "-------\nRebuild: ",$sarebuild,"\n-------\n" if $debug;

#########################################################################################


Results:
server:/home/james# ./DMZS-sa-learn.pl
Using Mail::IMAPClient version 2.2.9 and perl version 5.8.8 (5.008008)
 Spam to process
 Notspam to process
.
-------
Spam: Learned tokens from 0 message(s) (1 message(s) examined)

-------
Autoloading: UID store  +FLAGS.SILENT (\Deleted)
.
-------
NotSpam: Learned tokens from 1 message(s) (1 message(s) examined)

-------
Autoloading: UID store  +FLAGS.SILENT (\Deleted)
-------
Rebuild: bayes: synced databases from journal in 0 seconds: 4 unique 
entries (4 total entries)

-------







More information about the dovecot mailing list