#!/usr/bin/perl # vi: sw=4 ts=4 use strict; use warnings; use Cyrus::IMAP::Admin; use Getopt::Long; use POSIX; our $VERSION = 0.02; my $server; my $imappattern; my $perlpattern; # FIXME server, imappattern, & perlpattern values remain in ARGV GetOptions('help|?' => \&Getopt::Long::HelpMessage, 'server' => \$server, 'imappattern' => \$imappattern, 'perlpattern' => \$perlpattern); $server = $server || shift || 'cgi.sfu.ca'; $imappattern = $imappattern || shift || '*'; $perlpattern = $perlpattern || shift || '^(?!.*\\.Archives\\.)'; my $imap = Cyrus::IMAP::Admin->new($server); # TODO Support IMAP::Admin. It must use Authen::SASL first #if (exists $INC{'IMAP/Admin.pm'}) { # $imap = IMAP::Admin->new($server); #} # Connect to server & authenticate if ($imap->error) { die 'new: ', $imap->error; } $imap->authenticate; if ($imap->error) { die 'authenticate: ', $imap->error; } # Get list of mailboxes for archiving my @mailboxes = $imap->list($imappattern); if ($imap->error) { die 'list: ', $imap->error; } foreach my $reference (@mailboxes) { my ($oldname) = @$reference; if ($oldname =~ $perlpattern) { # TODO Add check for mailbox size # Find a unique new name for mailbox # FIXME The test for a mailbox' existence breaks on nonexistent # mailboxes which nonetheless have sub-mailboxes. How will # SquirrelMail solve this? # http://s3.invisionfree.com/squirrelmail/index.php?s=2b484becef8805be39ce9e3dc27be936&showtopic=30 my $i = 0; my $newname; do { $newname = "$oldname.Archives." . (strftime '%Y%m%d', localtime) . $i++; } while ($imap->list($newname)); # Rename mailbox $imap->rename($oldname, $newname); if ($imap->error) { die 'rename: ', $imap->error; } } } __END__ =head1 NAME Archive IMAP Mailboxes -- periodically rename IMAP mailboxes so they don't grow too large =head1 SYNOPSIS arcimb [--server] server [--imappattern] imappattern [--perlpattern] perlpattern =head1 OPTIONS =over 8 =item B<--server> IMAP server to connect. Default: 'cgi.sfu.ca' =item B<--imappattern> IMAP pattern of mailboxes to archive. Default: '*' =item B<--perlpattern> Perl pattern of mailboxes to archive. Default: '^(?!.*\\.Archives\\.)' =back =head1 PREREQUISITES Cyrus::IMAP::Admin Getopt::Long POSIX =head1 SCRIPT CATEGORIES Mail