My mundane mass folder reindexing script
# email me if you have questions gmillerd@qualhost.com
use strict;
use warnings;
use Data::Dumper;
use Getopt::Long;
use DBI;
# http://search.cpan.org/~markov/Mail-IMAPClient/
use Mail::IMAPClient;
my $args = {
'folders' => 'sub', # 'sub' or 'all'
'autounsub' => 1, # unsubscribe to missing folders
'msgcount' => 1, # hit each folder of a message count
'imaphost' => 'localhost',
'imapport' => '143', # point to server, not proxy we will not be returning
'imapauth' => 'CRAM-MD5', # use required method CRAM-MD5
# must change dsn/user/pass to work for your query
'sqldsn' => 'DBI:mysql:database=isp;mysql_socket=/var/run/mysqld/mysqld.sock',
'sqluser' => 'mail',
'sqlpass' => 'mail',
# must return user and pass
#'sqlquery' => 'SELECT email as user, clear as pass FROM isp.v_exim', # this method for know passwords
#'sqlquery' => 'SELECT user, 'secret' AS pass FROM isp.v_exim', #this method for unknown passwords
};
GetOptions(
'folders=s' => \$args->{folders},
'autounsub' => \$args->{autounsub},
'msgcount' => \$args->{msgcount},
'imaphost=s' => \$args->{imaphost},
'imapport=s' => \$args->{imapport},
'imapauth=s' => \$args->{imapauth},
);
my %acct;
## use handle and user/pass
my $dbh = DBI->connect($args->{sqldsn},
$args->{sqluser},
$args->{sqlpass},
{ RaiseError => 1 }) || die($!);
{
my $sth = $dbh->prepare($args->{sqlquery});
$sth->execute();
while (my $h = $sth->fetchrow_hashref())
{
$acct{ $h->{user} } = $h->{pass};
}
}
## cycle through users folders via imap
while (my ($user, $pass) = (each %acct))
{
my $imap = Mail::IMAPClient->new(
Server => $args->{imaphost},
Port => $args->{imapport},
Authmechanism => $args->{imapauth} || 'LOGIN',
User => $user,
Password => $pass,
Uid => 1,
Debug => 0) || die($@);
printf("[%s]\n", $user);
my @folders=();
if($args->{folders} eq 'all') {
@folders = $imap->folders;
}
else {
@folders = $imap->subscribed;
}
for my $folder (@folders)
{
unless($imap->exists($folder))
{
printf("\t%s (NOTEXISTS)\n",
$folder,
);
if($args->{autounsub})
{
# bah, lack of unsubscribe method wtf ... open a ticket
# http://rt.cpan.org/Public/Dist/Display.html?Name=Mail-IMAPClient
}
next;
}
my $msgcount='?';
if(defined $args->{msgcount})
{
$msgcount = $imap->message_count($folder);
}
printf("\t%s (%s)\n",
$folder,
$msgcount,
);
}
}