#!/usr/bin/perl # vi: sw=4 ts=4 use strict; use warnings; use Getopt::Long; use POSIX; our $VERSION = 0.03; my $server; my $username; my $password; my $imappattern; my $perlpattern; # FIXME server, imappattern, & perlpattern values remain in ARGV GetOptions('help|?' => \&Getopt::Long::HelpMessage, 'server' => \$server, 'username' => \$username, 'password' => \$password, 'imappattern' => \$imappattern, 'perlpattern' => \$perlpattern); $server = $server || shift || 'cgi.sfu.ca'; $imappattern = $imappattern || shift || '*'; $perlpattern = $perlpattern || shift || '^(?!.*\\.Archives\\.)'; # Use IMAP::Admin before Cyrus::IMAP::Admin my $imap; #if (eval { require IMAP::Admin; #}) { $imap = IMAP::Admin->new(Server => $server, Login => $username, Password => $password); if ($imap->{Error}) { die "new: $imap->{Error}"; } #} elsif (eval { # require Cyrus::IMAP::Admin; #}) { # $imap = Cyrus::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 IMAP::Admin|Cyrus::IMAP::Admin Getopt::Long POSIX =head1 SCRIPT CATEGORIES Mail