I am sysadmin of a small mail server with around 15 users, about half of
which maintain IMAP mailboxes (vice pop). I am running Red Hat 8 distro,
with the IMAP (which is believe is UW IMAP) right out of the box. My
users are uneducated/uninterested in expunging their email instead of
just deleting it, and a lot of server space is taken up with deleted
email that is never expunged. Quotas are not a good option because my
users receive rather large attachments. Also, they are not computer
literate enough to grasp the concept and need of delete vs.
delete/expunge, despite my best efforts at education. Regrettably, many
of them use Outlook, which does not offer an expunge on exit option.
I would like to execute a script as a cron task to find all IMAP mail
boxes and expunge deleted mail. I have written the two scripts below.
The first is a script to generate the list of mailboxes and then call
the second. The second is a perl script that actually expunges the
boxes. This solution does not work because I cannot log into the IMAP
server as root, and I can't extract each user's password to log on as
each user.
Is there a method for automatically expunging deleted mail from an IMAP
server?
Thanks.
Travis Beal
========================================
SCRIPT 1:
#!/bin/bash
#broadcast stop
echo 'Starting purge of folders.'
date
#stop internet services
/etc/init.d/httpd stop
/etc/init.d/sendmail stop
/etc/init.d/xinetd stop
#generate list of IMAP mailboxes
ls /home/*/.mailboxlist > /root/listofmailboxlists
#Perl purge script
/root/purge_folders_perl
#start services
/etc/init.d/xinetd start
/etc/init.d/sendmail start
/etc/init.d/httpd start
#remove the list
rm -rf /root/listofmailboxlists
#broadcast
echo 'Purge of folders complete.'
date
========================================
SCRIPT 2:
#!/usr/bin/perl
#get the IMAP tools
use Mail::IMAPClient;
print "Entering Perl section.....\n";
#read only open this list of mailbox lists
open (LISTOFMAILBOXLISTS, "<listofmailboxlists");
#go through file
#while(<LISTOFMAILBOXLISTS> ){
#load next line in file
chop;
#parse out next data file
($mailboxlisttoscan) = split (/\n/, $_);
#debug print "Next is $mailboxlisttoscan.\n";
#get absolute address prefix
($file_prefix,$junk) = split (/\/.mailbox/,$mailboxlisttoscan);
#parse out user_name
($trash, $user_name) = split (/ome\//,$file_prefix);
# (returns a new, authenticated Mail::IMAPClient object)
$host = "127.0.0.1";
$id = "$user_name";
$pass = "?????????";
$imap = Mail::IMAPClient->new(
Server => $host,
User => $id,
Password=> $pass,
) or die "Cannot connect to $host as $id: $@";
#read only open this mailbox list
open (MAILBOXLIST, "<$mailboxlisttoscan");
#go through this list
while(<MAILBOXLIST> ){
#load next line in file
chop;
#parse out based on CSV
($mailboxtopurge) = split (/\n/, $_);
#debug print "Purging $mailboxtopurge for user $user_name.\n";
$imap->expunge($file_prefix/$mailboxtopurge) or die "Could not expunge:
[EMAIL PROTECTED]";
} #end of mailboxlists while
close (MAILBOXLIST);
} #end of listofmailboxlists while
close (LISTOFMAILBOXLISTS);
print "Exiting Perl section.\n";
--
------------------------------------------------------------------
For information about this mailing list, and its archives, see:
http://www.washington.edu/imap/c-client-list.html
------------------------------------------------------------------