Kyle,

That is neat. The only suggestion that I have, and I have not
thought much about how to implement it, is to allow the user to
free, delete, or retrain items in the quarantine based on this
mail. One idea, is that since DSPAM processes incoming E-mail
anyway, have it perform quarantine updates based on the contents
of the E-mail. This would be very useful for PDA user's without
web access to the quarantine.

Cheers,
Ken

On Sat, Dec 15, 2007 at 12:17:50PM -0500, Kyle Johnson wrote:
> Hello everyone,
>
> Jeff Harris (Led-Hed in #dspam) and I (fiXXXerMet in #dspam) have been 
> working on the dspam_notify script for the past few days, and it looks like 
> we have something that works.
>
> Basically, this is a perl script that you'll setup as a cronjob.  It will 
> grep through each valid user's .mbox (quarantine) file, and send them an 
> email with their total and new, number of quarantine items.  I say valid 
> because we are checking the output of dspam_stats - if the user either 
> doesn't exist (was deleted from the database, but not the file system), or 
> has 0 items in their quarantine, then they are skipped.
>
> We have also added a new user preference, dailyQuarantineSummary.  This 
> will allow either the user, through the Preferences tab in the WebUI, or 
> the administrator, through either dspam_admin or the WebUI, to enable or 
> disable dailyQuarantineSummary either for them self, or globally.
>
> You will need to configure a few things:
>
>   1. $dspamconf
>         1. The path to dspam.conf
>   2. $from
>         1. Who you want the emails to be sent from.
>   3. $subject
>         1. What you want the subject of the notifications to be.
>   4. $server
>         1. The address of your SMTP server.
>   5. dspam.conf
>         1. You must add AllowOverride dailyQuarantineSummary in order
>            for the user preference option to work.
>   6. $dspam_url
>         1. The location of your dspam WebUI
>   7. $pref_check
>         1. You can enable or disable checking of user preferences.          
>   This can be kind of CPU intensive on large system, so we've
>            given you the option to just skip checking and send anyway.
>
> So, <constructive criticism>
>
>
>
>
> --Kyle Johnson
>

> #!/usr/bin/perl
> 
> use Net::SMTP;
> 
> # Enter the location of you dspam.conf file.
> $DSPAMCONF = "/etc/dspam.conf";
> 
> # Who will the notifications be sent from?
> $FROM = '[EMAIL PROTECTED]';
>   
> # What will the notification subject be?
> $SUBJECT = 'Daily Spam Quarantine Summary';
> 
> # Quarantine URL
> $DSPAM_URL = 'https://dspam.domain.tld';
> 
> # Address of your SMTP server?  localhost should be fine.
> $SERVER = 'localhost';
> 
> # Enable User Preference Checking (Very CPU Intensive!!!) Not Recommended for 
> more than 500 email accounts.
> $PREF_CHECK = 0;
> 
> ######################################
> # No need to config below this point.#
> ######################################
> 
> 
> #Build the Quarantine URL
> $QUARANTINE_URL = $DSPAM_URL . '/dspam.cgi?template=quarantine';
> 
> # Autodetect Scale
> my $X = `dspam --version`;
> if ($X =~ /--enable-domain-scale/) {
>   $DOMAIN_SCALE = 1;
>   $LARGE_SCALE = 0;
> }
> if ($X =~ /--enable-large-scale/) {
>   $LARGE_SCALE = 1;
>   $DOMAIN_SCALE = 0;
> }
> 
> 
> # Date Formatting
> my ($SEC,$MIN,$HOUR,$MDAY,$MON,$YEAR,$WDAY,$YDAY,$ISDST) = localtime(time);
>   
> # Array containing Days of the week abreviations
> @WEEKDAYS = ('Sun','Mon','Tue','Wed','Thur','Fri','Sat');
>     
> # Array containing Month abreviations
> @MONTHS = 
> ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
>     
> $D = (localtime)[6];
> $M = (localtime)[4];
> 
> $DAY_ABR = $WEEKDAYS[$D];
> $MONTH_ABR = $MONTHS[$M];
> $DAY_NUM = $MDAY; 
> $YEAR += 1900;
> 
> $TODAY = $DAY_ABR . " " . $MONTH_ABR . " " . $DAY_NUM;
>     
> # Get the location of dspamhome
> chomp($DSPAMHOME = `awk '/Home / {print \$2}' $DSPAMCONF`);
> 
> 
> # Create a Recipient List
> chomp(@DSPAM_STATS = `dspam_stats | awk '{print \$1 " " \$3}'`);              
> # Get A list of users from dspam_stats
> 
> foreach $LINE (@DSPAM_STATS) { 
>   @SPLIT= split(/ /, $LINE);
>   if (@SPLIT[1] != 0) {                                                       
> # If dspam user has TP's then
>     push(@RECIPIENT_LIST, @SPLIT[0]);                                         
> # add to Recipient List
>   } 
>   @SPLIT = ();                                                                
> # Destroy Array for next split
> }
> @DSPAM_STATS = ();                                                            
> # Destroy Array, no further use
> 
> # Check for AllowOverride
> if ($PREF_CHECK == 1) {
>   chomp($ALLOW_OVERRIDE = `dspam_admin agg pref 'default' 2>&1 | grep -i -c 
> "Ignoring disallowed preference 'dailyQuarantineSummary'"`);
>   if ($ALLOW_OVERRIDE == 1) {
>     $ALLOW_OVERRIDE = "off";
>     }
>   if ($ALLOW_OVERRIDE == 0) {
>     $ALLOW_OVERRIDE = "on";
>   }
>   # Get the default user preference
>   chomp($DEFAULT_PREF = `dspam_admin li pref 'default' | grep -i 
> 'dailyQuarantineSummary' | cut -d= -f2`);
> } else {                                                                      
> # Preference Checking disabled,
>   $ALLOW_OVERRIDE = "off";                                                    
> # Set some default values
>   $DEFAULT_PREF = "on";                                                       
>         #
> }
> 
> # Gather Recipient Quarantine Info
> foreach $RECIPIENT (@RECIPIENT_LIST) {
> 
>   # Get User Preference from dspam_admin
>   if ($ALLOW_OVERRIDE eq "on") {                                              
> # Check for Allow Overides
>     chomp($USER_PREF = `dspam_admin li pref '$RECIPIENT' | grep -i 
> 'dailyQuarantineSummary' | cut -d= -f2`);
>     if ($USER_PREF ne 'on' && $USER_PREF ne 'off') {
>       $USER_PREF = $DEFAULT_PREF;                                             
> # User Preference in valid, use default preference
>     }
>   } else {
>     $USER_PREF = $DEFAULT_PREF;                                               
>         # Overrides off, use default preference
>   }
>   
>   # Build path to Quarantine .mbox
>   if ($DOMAIN_SCALE == 1) {                                                   
> # Format Quarantine path for Domain Scale
>     @USER_DOMAIN = split(/@/, $RECIPIENT);
>     $u = @USER_DOMAIN[0];
>     $D = @USER_DOMAIN[1];
>     $MBOX = $DSPAMHOME . "/data/" . $D . "/" . $u . "/" . $u . ".mbox";
>   }
>     
>   if ($LARGE_SCALE == 1) {                                                    
> # Format Quarantine path for Large Scale
>     $u = substr($RECIPIENT, 0, 1);
>     $s = substr($RECIPIENT, 1, 1);
>     $MBOX = $DSPAMHOME . "/data/" . $u . "/" . $s . "/" . $RECIPIENT . 
> ".mbox";
>   }
>     
>   if ($DOMAIN_SCALE == 0 && $LARGE_SCALE == 0) {                              
> # Format Quarantine path for Normal Scale
>     $MBOX = $DSPAMHOME . "/data/" . $RECIPIENT . "/" . $RECIPIENT . ".mbox";
>   }
>   
>   # Tally Quarantine messages
>   if ($USER_PREF ne "off" && -e $MBOX) {                                      
> # Check if .mbox file exists and user pref
>     chomp($NEW = `grep 'From QUARANTINE $TODAY' $MBOX| wc -l`);               
>         # Count New messages in Quarantine
>     push(@Q_NEW_ITEMS, $NEW);                                                 
> # Send Count to Array for later use
>     chomp($TOTAL = `grep 'From QUARANTINE' $MBOX | wc -l`);                   
> # Count Total messages in Quarantine
>     push(@Q_TOTAL_ITEMS, $TOTAL);                                             
> # Send Count to Array for later use
>   } else {                                                                    
> # .mbox doesn't exist
>     push(@Q_NEW_ITEMS, 0);                                                    
> # insert 0's
>     push(@Q_TOTAL_ITEMS, 0);                                                  
> # keeps indexes in sync
>   }
>   @USER_DOMAIN = ();                                                          
> # Destroy Array, no further use
> }
> 
> 
> # Send some emails
> $SMTP = Net::SMTP->new($SERVER);                                              
> # Establish SMTP Connection
> $I = 0;
> for ($I = 0; $I <= $#RECIPIENT_LIST; $I++) {                                  
> # Loop through Recipients List and send the message
>   if (@Q_TOTAL_ITEMS[$I] != 0) {                                              
> # Don't send reminders to users with empty quarantines
>     
>     $SMTP->mail($FROM);
>     $SMTP->to($RECIPIENT_LIST[$I]);
>     $SMTP->data();
>     $SMTP->datasend("To: $RECIPIENT_LIST[$I]\n");
>     $SMTP->datasend("Subject: $SUBJECT\n");
>     $SMTP->datasend("Mime-Version: 1.0\n");
>     $SMTP->datasend("Content-Type: text/html; charset=UTF-8\n");
>     $SMTP->datasend("Quarantine Summary for: $RECIPIENT_LIST[$I]<br>");
>     $SMTP->datasend("Date: $TODAY, $YEAR<br>");
>     $SMTP->datasend("<br>");
>     $SMTP->datasend("New Messages: @Q_NEW_ITEMS[$I]<br>");
>     $SMTP->datasend("Total Messages: @Q_TOTAL_ITEMS[$I]<br>");
>     $SMTP->datasend("<br>");
>     $SMTP->datasend("<br>");
>     $SMTP->datasend("Please remember to check <a href='$QUARANTINE_URL'>Your 
> Quarantine</a> regularly.");
>     $SMTP->dataend();
>   }
> }
> $SMTP->quit;                                                                  
> # Close SMTP Connection

Reply via email to