http://qs321.pair.com?node_id=161051


in reply to Re(3): Creating entries in an Outlook Calendar
in thread Creating entries in an Outlook Calendar

Again, thanks for the reply.
Well I looked at the suggested reference, but only programming in Perl for a couple of weeks now, it just didn't make sense. I've had 18 years of proramming in Cobol on mainframes and converting to Perl is just fantastic. I've stumbled through generating e-mails and SMS messages OK. I've even been able to look up entries in an access datbase, mostly using code which I have cribbed from this website.
I just can't figure out where to start on evaluating the folders collection, so if anyone could point me in the right direction I would be most grateful. If I can get them evaluated, then presumably it might give me a clue as to what my target folder is called. Then I can get on with writing the entries I have already extracted, back into that folder.
  • Comment on Re: Re(3): Creating entries in an Outlook Calendar

Replies are listed 'Best First'.
Re(5): Creating entries in an Outlook Calendar
by dmmiller2k (Chaplain) on Apr 22, 2002 at 14:21 UTC

    If you haven't already, take a look at the article I referenced in my earlier message. You should also view the Win32::OLE docs.

    The short answer is that once you have the 'folders' object (or any collection), you can index it like an array. To wit:

    # from your own example my $outlook = new Win32::OLE('Outlook.Application'); my $ns = $outlook->GetNameSpace("MAPI") or die "can't open MAPI namesp +ace\n"; my $folders = $ns->Folders(); # get the folders collection foreach my $folder (in @$folders) { # here $folder will be set to each folder in turn }

    Hope this helps ..

    dmm

    If you GIVE a man a fish you feed him for a day
    But,
    TEACH him to fish and you feed him for a lifetime
      Thanks guys, and humble apologies for being such a nugget. I had my personal options for set to the default of three levels, so I couldn't see that you had replied. It's sorted now, so am off and running again. duh!

      I had already managed to get a list of the folders at the top level using code similar to what you suggested namely
      my $Folder = $namespace->Folders("Personal Folders"); my $Items = $Folder->Items; my $sheetcnt = $namespace->Folders->Count(); foreach (1..$sheetcnt){ $Folder = $namespace->Folders($_)->{Name}; print "\t" .$Folder ."\n"; # my $subfolder = $namespace->Folders($Folder)->MAPIFolder->Count(); # foreach (1..$subfolder){ # print "\t" .$namespace->Folders($Folder)->MAPIFolder($_)->{Name +}. "\n"; # } }

      The commented out lines are my attempt to get to the next level down, which should be the list of folders, including inbox, outbox, calendar etc. etc. however if the commented out code is reinstated, it fails. with 'Can't call method "Count" on an undefined value at .......' which is the line
      my $subfolder = $namespace->Folders($Folder)->MAPIFolder->Count();
      Having checked the Outlook Object Model from the reference helpfully supplied by this site, MAPIFolder does seem to be the next level down, so I am not sure where I am going wrong.
      Any ideas?
        Progress!!! With a little bit of guess work, and adding the suggestions from this board, I have managed to get a rotine which now happily reads round all the folders and subfolders in my Outlook.

        use strict; use Win32::OLE; use Win32::OLE::Const 'Microsoft Outlook'; use Win32::OLE::Variant; use Time::Local; use POSIX; #open the Outlook program my $outlook; eval { $outlook = Win32::OLE->GetActiveObject('Outlook.Application') }; if ($@ || !defined($outlook)) { $outlook = Win32::OLE->new('Outlook.Application', sub {$_[0]->Quit;} +) or die "oops\n"; } my $namespace = $outlook->GetNameSpace("MAPI") or die "can't open MAPI + namespace\n"; my $Folder; my $subfoldernm = "Calendar"; my $sheetcnt = $namespace->Folders->Count(); foreach (1..$sheetcnt){ $Folder = $namespace->Folders($_)->{Name}; print "\n\t No.". $_ ." Folder Name - >" .$Folder ."<\n"; print "\n\t\tNo.\tItems\tItems"; my $subfldrcnt = $namespace->Folders($Folder)->Folders()->Count or +my $dummy = "true"; foreach (1..$subfldrcnt){ my $subfolder = $namespace->Folders($Folder)->Folders($_)->{Nam +e} or die "cant access folder $Folder"; my $itemcnt = $namespace->Folders($Folder)->Folders($subfolder) +->Items()->Count or my $empty = "true"; print "\n\t\t$_\t$itemcnt\t$subfolder"; } }
        I now need to work out how to store a calendar entry away. I guess this means a two part task. Firstly to "select" the correct calendar folder to store the entry in, secondly to generate the entries to store away.

        From the results of my current routine, I can see that for testing purposes, the folder I need is "Personal Folders" and the subfolder is "Calendar"

        I'm thinking that some code along the lines of :-
        my $cal = new Win32::OLE('Outlook.Application'); $cal->{'Visible'} = 1; my $item = $cal->CreateItem(0); $item->{'Subject'} = "perl test"; $item->{'Location'} = "Test Location"; $item->{'Start'} = "04/30/2002 12:00"; $item->{'End'} = "04/30/2002 12:30"; my $selectfolder = $namespace->Folders($Folder)->Folders($subfo +lder)->Items()->Add($item) or " **** can't add item";


        but I suspect this is only the half of it.

        As before, does anyone have any ideas?

        I did find some code to generate an e-mail entry, and am thinking that the code to generate a calendar entry wouldn't be that dissimilar.
        #my $mail = new Win32::OLE('Outlook.Application'); #$mail->{'Visible'} = 1; #my $item = $mail->CreateItem(0); #$item->{'Subject'} = "This is a test"; #$item->{'To'} = "david.booth\@easynet.co.uk"; #$item->{'Body'} = "Here is the meat of the message"; #$item->Send(); #$mail->Quit();

        As ever any suggestions as to how best doing this will be most gratefully received

        It should be even simpler:

        my @folder_names = (); my %folder_contents = (); my $folders_collection = $namespace->Folders(); foreach my $folder (in( $folders )) { my $folder_name = $folder->{Name}; my $folder_items = $folder->Items(); push @folder_names, $folder_name; $folder_contents{$folder_name} = []; foreach my $item (in( $folder_items )) { push @$folder_contents{$folder_name}, $item->{Name}; } }

        dmm

        If you GIVE a man a fish you feed him for a day
        But,
        TEACH him to fish and you feed him for a lifetime