Troubles with access='rw' and Mail::Box::IMAP4

gabriel rosenkoetter <[email protected]> Thu, 3 Jun 2004 18:07:51 -0400
Newsgroups gmane.comp.lang.perl.modules.mail-box
Message-ID <[email protected]>
I know it's not done and all, but something tells me that this
should be an easy fix:

jedi:~/imaphorf% ./imaphorf.pl                                             [37]
Password for [email protected]: 
Connected
Authenticated
skipping ["Public Folders/"] because of exclude ["Public Folders/"]
Copying [21st]:
PROGRESS: Created folder Maildir /home/auto/gr/Mail/21st.
  opened locally;
  opened remotely;
Method folder() is not defined for a Mail::Box::IMAP4::Head.
        Mail::Reporter::AUTOLOAD('Mail::Box::IMAP4::Head object') called at /u01/app/perl/rip/lib/perl5/site_perl/5.6.1/Mail/Box/IMAP4/Head.pm line 38
        Mail::Box::IMAP4::Head::get('Mail::Box::IMAP4::Head object', 'Message-ID') called at /u01/app/perl/rip/lib/perl5/site_perl/5.6.1/Mail/Message.pm line 251
        Mail::Message::get('Mail::Box::IMAP4::Message=HASH(0x86f4c28)', 'Message-ID') called at /u01/app/perl/rip/lib/perl5/site_perl/5.6.1/Mail/Message.pm line 684
        Mail::Message::takeMessageId('Mail::Box::IMAP4::Message=HASH(0x86f4c28)') called at /u01/app/perl/rip/lib/perl5/site_perl/5.6.1/Mail/Message.pm line 137
        Mail::Message::messageId('Mail::Box::IMAP4::Message=HASH(0x86f4c28)') called at ./imaphorf.pl line 102

This *looks* to me like you've got a Mail::Box::IMAP4::Head where
you really wanted to have a Mail::Box::IMAP4, and I'm sure I can
track down where that's happening, but maybe since it's your code,
you can faster.

Or am *I* doing something wrong here?

(My script's attached.)

-- 
gabriel rosenkoetter
Transcontinental CC3 Unix & Linux sysadmin
[email protected]
imaphorf.pl (application/x-perl, 2.4 KB)
#!/usr/bin/perl -w

use strict;
use Mail::IMAPClient;
use Mail::Box::Manager;
use Mail::Box::IMAP4;
use Term::ReadKey;

my $server = 'localhost';
my $username = $ENV{USER};
my $base = "$ENV{HOME}/Mail";
my $verbose = 1;
my @excludes = (
	'Calendar',
	'Contacts',
	'Deleted Items',
	'Drafts',
	'Inbox',
	'INBOX',
	'Journal',
	'Notes',
	'Outbox',
	'Sent Items',
	'Tasks',
	'Public Folders',
	'"Public Folders/"'
);
my @includes = ();
my ($exclude, $include);

ReadMode('noecho');
print "Password for ${username}\@${server}: ";
chomp(my $password = ReadLine(0));
print "\n";
ReadMode('restore');

my $client = Mail::IMAPClient->new (
	Server => $server,
	User => $username,
	Password => $password,
) or die $@;

print "Connected\n" if $verbose;
print "Authenticated\n" if ($verbose && $client->Authenticated());

my $mgr = new Mail::Box::Manager;
$mgr->defaultTrace('WARNINGS', 'DEBUG');

$mgr->registerType(imap4 => 'Mail::Box::IMAP4');

#my $imap = Mail::Box::IMAP4->new(imap_client => $client);
#my @dirs = $imap->listSubFolders;

my $imap = $mgr->open (
	folder => "/",
	type => 'imap4',
	imap_client => $client,
	access => 'rw',
) or die $@;
my @dirs = $imap->listSubFolders;

my ($local, $remote, @messages, $message);

FOLDER: foreach my $dir (sort @dirs) {
	foreach $exclude (@excludes) {
		if ($dir =~ m/^$exclude/) {
			print "skipping [$dir] because of exclude [$exclude]\n" if $verbose;
			next FOLDER;
		}
	}
	if ($#includes >= 0) {
		my $matched = 0;
		foreach $include (@includes) {
			if ($dir =~ m/$include/) {
				$matched = 1;
				last;
			}
		}
		if ($matched == 0) {
			print "skipping [$dir] because it's not listed in includes\n" if $verbose;
			next FOLDER;
		}
	}
	print "Copying [$dir]:\n" if $verbose;
	$local = $mgr->open (
		create => 1,
		folder => "=$dir",
		folderdir => $base,
		type => 'maildir',
		access => 'rw'
	) or die $@;
	print "  opened locally;\n" if $verbose;
	$remote = $mgr->open (
		folder => "$dir",
		type => 'imap4',
		imap_client => $client,
		access => 'rw',
	) or die $@;
	@messages = $remote->messages;
	print "  opened remotely;\n" if $verbose;
	foreach $message (@messages) {
		print "    moving ", $message->messageId, "... " if $verbose;
		$mgr->moveMessage($local, $message) or die $@;
		print "moved.\n" if $verbose;
	}
	print "  done moving.\n" if $verbose;
	$mgr->close($local);
	$mgr->close($remote);
}

$imap->close;
#$client->disconnect or die $@;
#print "Disconnected\n" if $verbose;