I had serious issues using Win32::OLE to access Outlook. Memory usage was
outrageous. I found the CDO library to be much easier to use and much lighter
on the resources. It's been a while since I've dug into it, but I believe it
has the ability to access any folder within Outlook, either based on an already
existing Outlook instance, or by creating it's own. You have to change the
threading model in the registry (under MAPI.Session) to be "Apartment" I
believe, otherwise the CDO library doesn't work correctly (although this may
have been specific to the version I was using).
The code below is snippets from my script, it won't work as is.
Jeremy Blonde
Win32::OLE->Initialize(Win32::OLE::COINIT_OLEINITIALIZE);
#$Win32::OLE::Warn = 0;
my($SESSION) = Win32::OLE->new('MAPI.Session'); # Session Object
my($profile) = "$server\n"."$MAILBOX";
my($session, $profile) = @_;
# Logon using the specified $profile
print "Logging on...";
${$session}->Logon("","",0,1,0,0,${$profile});
my $infostore = ${$session}->GetInfoStore();
if (!$infostore) {
print "unsuccessful!\n";
Logoff(\${$session});
return;
}
print " Scanning $infostore->{Name}\n";
# Get the RootFolder
${$rootfolder} = $infostore->RootFolder();
# Get the folders collection
my($folders) = ${$parent}->Folders();
# Get the first folder in the collection
my($folder) = $folders->GetFirst();
while ($folder) {
# Skip the Journal since it doesn't hold attachments
if ($folder->{Name} eq "Journal") {
$folder = $folders->GetNext();
next;
}
my($folderName) = $folder->{Name};
# Recurse through any sub-folders
if ($folder->Folders->Count()) {
Scan_Folder(\$folder);
}
# Scan through the e-mail messages in the folder
if ($folder->Messages->Count()) {
print " Scanning: $folderName...\n";
Scan_Messages(\$folder);
}
Thanks,
Jeremy Blonde
Network Technician
Davis Joint Unified School District
530.757.5300 ext. 117
-----Original Message-----
From: Ounsted, Toby [mailto:[EMAIL PROTECTED]
Sent: Friday, October 17, 2003 7:19 AM
To: '[EMAIL PROTECTED]'
Cc: Perl-Win32-Gui-Users (E-mail)
Subject: RE: [perl-win32-gui-users] Outlook - list all folders
Adapted from a similar script by Rob Hanson on perl-win32-users - hope this
helps.
use strict;
use Win32::OLE;
# use existing instance if Outlook is already running, or launch a new one
my $ol;
eval {$ol = Win32::OLE->GetActiveObject('Outlook.Application')};
die "Outlook not installed" if $@;
unless (defined $ol) {
$ol = Win32::OLE->new('Outlook.Application', sub {$_[0]->Quit;})
or die "Oops, cannot start Outlook";
}
my $mailbox = seekFolder($ol->Session, 'Mailbox - Doe, John');
listFolders($mailbox);
sub seekFolder {
my $obj = shift;
my $target = shift;
for (my $i = 1; $i <= $obj->Folders->Count; $i++) {
if ( $obj->Folders->Item($i)->Name eq $target ) {
return $obj->Folders->Item($i);
}
}
}
sub listFolders {
my $parent = shift;
for (my $t = 1; $t <=$parent->Folders->Count;$t++){
print $t . ": " . $parent->Folders->Item($t)->Name . "\n";
}
}
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
Sent: 17 October 2003 13:37
To: [email protected]
Subject: [perl-win32-gui-users] Outlook - list all folders
Does anyone have any examples of how to list all the folder names for a
particular Outlook profile?
I'm looking at using Win32::OLE but can't figure out how to list ALL folder
names.
Any help would be appreciated.
Thanks!
------------------------------------------------------------
This e-mail may be privileged and/or confidential, and the sender does not
waive any related rights and obligations. Any distribution, use or copying of
this e-mail or the information it contains by other than an intended recipient
is unauthorized. If you received this e-mail in error, please advise me (by
return e-mail or otherwise) immediately.
Ce courrier électronique est confidentiel et protégé. L'expéditeur ne renonce
pas aux droits et obligations qui s'y rapportent. Toute diffusion, utilisation
ou copie de ce message ou des renseignements qu'il contient par une personne
autre que le (les) destinataire(s) désigné(s) est interdite. Si vous recevez ce
courrier électronique par erreur, veuillez m'en aviser immédiatement, par
retour de courrier électronique ou par un autre moyen.
============================================================