iamcal.com

IMAP Folders

A Cal Henderson Thingy
April 13th, 2010

The problem

I host my email at Tuffmail, who are pretty awesome. Not having to worry about backups and spam and so on is quite lovely. If you use GMail, good for you - I like folders and have a very large mail archive that goes back over 10 years, so GMail is not for me.

One issue is that Tuffmail uses IMAP quotas to limit your inbox size. This is perfectly reasonable, but with many folders, it's hard to know where your quota is being used. So in steps Perl.

My Solution

After installing the excellent Mail::IMAPClient, I whipped up this quick script:

#!/usr/bin/perl

use Mail::IMAPClient;

my $imap = Mail::IMAPClient->new(
	Server   => 'mail.mxes.net',
	User     => '**********',
	Password => '**********',
	Ssl      => 0,
	Uid      => 1,
);

my $folders = $imap->folders or die "Failed to get folders\n";
my $sizes = {};

foreach my $folder (@{$folders}){
	$imap->examine($folder) or next;

	$sizes->{$folder} = 0;

	my $hash = $imap->fetch_hash("RFC822.SIZE");
	foreach my $msg (keys %{$hash}){
		$sizes->{$folder} += $hash->{$msg}->{'RFC822.SIZE'};
	}
}

my @keys = sort { $sizes->{$b} <=> $sizes->{$a} } @{$folders};

print "Only showing folders over 1MB:\n";

for my $folder (@keys){

	my $size = $sizes->{$folder};
	if ($sizes->{$folder} > 1024){ $size = int($sizes->{$folder} / 1024) . "KB"; }
	if ($sizes->{$folder} > 1024 * 1024){
		$size = int($sizes->{$folder} / (1024 * 1024)) . "MB";
	}

	next unless $size =~ /MB/;

	print "$size\t$folder\n";
}

After adding in my own account details, running it gives what I need:

[cal@mt1 ~]# perl imap_folders.pl
Only showing folders over 1MB:
127MB   INBOX
108MB   lists/tinyspeck
71MB    lists/tinyspeck/svn
20MB    lists/tinyspeck/jobs
15MB    lists/colourlovers
11MB    lists/everyone
10MB    lists/jobs
9MB     lists/b4ta
5MB     friends/dnd
5MB     friends
4MB     ecom
4MB     Sent
4MB     lists/software
3MB     ecom/travel
3MB     lists/hackers
2MB     lists/houses-bridgeview
2MB     lists/oembed
1MB     lists/conferences
1MB     lists/tax
1MB     Discard
1MB     Sent Items
1MB     lists/books

There's some cruft in the code, but it's short and simple enough to easily refactor. Hope you find it useful.

Credits

Written by Cal Henderson, inspired by a post in some Java forum somewhere.