Hi
I am trying to capture the contents of the outlook account into a folder which contains all mails and attachments.I a have been ableto do it sucessfully but a security dialog box comes when ever somebody tries to access outlook programatically. Now i want to automate the entriesin this dialog box by using a thread which is called to perform the actions on the dialog box. the code is as follows.
use strict;
use Thread;
use Win32::OLE::Const 'Microsoft Outlook';
use Win32::OLE;
use Win32::OLE qw(in with);
use Win32::GUI;
use Win32::GuiTest;
use IO::File;
use Getopt::Long;
use File::Basename;
use POSIX qw(tmpnam);
#$|++;
## These variable will be used to store the command line argufromnts
my $SAVEDIR = $ARGV[0];
my $ATTACH_PATH = $SAVEDIR."\\attachments\\";
my $ITEMS;
do { mkdir $SAVEDIR or die "Can't mkdir $SAVEDIR $!\n" }
unless -d $SAVEDIR;
do { mkdir $ATTACH_PATH or die "Can't mkdir $ATTACH_PATH $!\n" }
unless -d $ATTACH_PATH;
sub chkOpts
{
if(!$ARGV[0])
{
print "\n",'Please enter the directory path for eg: exportOutl
+ook D:/output so that the output files can be stored in that location
+.',"\n";
exit;
}
}
my $thr1 = Thread->new(\&handleOutlookSecurity);
sub findSecurityWindow
# this method detects whether a security window popped up in Outlook.
+If it is
# the case, it needs to be processed so that the script can be execute
+d.
# Else it'll pend.
{
my $messageClass = "#32770";
my $winName = "Microsoft Outlook";
return Win32::GUI::FindWindow($messageClass,$winName); #c
}
sub clearSecurityWindow
# this method brings the security window on top of all the others, hen
+ce focusing it
# and sends it a series of keystrokes in order to validate it.
{
my $securityHandle = shift;
while ($securityHandle!=Win32::GUI::GetForegroundWindow())#c
{
Win32::GUI::SetForegroundWindow($securityHandle);#c
Win32::GUI::Enable($securityHandle);#c
}
# now send key sequence that will allow maximum time for code to ru
+n
# The sequence is as follows : initially the no button is focused..
+.
# One tab brings us to cancel, another tab to the time tick box
# a spacebar hit will tick the box. Then a tab will select the drop
+-down
# list in order for us to choose the time length. One more tab brin
+gs us to Yes. A keypress on the End key will
# select maximum time. Then a return key will validate our choice
# 2 tabs - spacebar - 2 tab - one end - one return
Win32::GuiTest::SendKeys("{TAB}");
Win32::GuiTest::SendKeys("{TAB}");
Win32::GuiTest::SendKeys("{SPACEBAR}");
Win32::GuiTest::SendKeys("{TAB}");
#Win32::GuiTest::SendKeys("{DOWN}");
#Win32::GuiTest::SendKeys("{DOWN}");
Win32::GuiTest::SendKeys("{TAB}");
Win32::GuiTest::SendKeys("{END}");
Win32::GuiTest::SendKeys("{ENTER}");
}
sub clearSecurityWindow2
# this method does the same as clearSecurityWindow but handles the sec
+ond security window.
{
my $securityHandle = shift;
while ($securityHandle!=Win32::GUI::GetForegroundWindow()) #c
{
Win32::GUI::SetForegroundWindow($securityHandle); #c
Win32::GUI::Enable($securityHandle); #c
}
Win32::GuiTest::SendKeys("{TAB}");
Win32::GuiTest::SendKeys("{TAB}");
Win32::GuiTest::SendKeys("{ENTER}");
}
sub handleOutlookSecurity
{
# We don't need to sleep but just to be safe
sleep 3;
my $securityHandle = 0;
while (not ($securityHandle)) # detects Outlook's popup window tha
+t asks whether access should be granted to
{
$securityHandle = findSecurityWindow(); # wait for security win
+dow to pop-up...
}
# window has been found - clear it
clearSecurityWindow($securityHandle);
# We need the "Yes" button to be active
sleep 10;
$securityHandle = 0;
while (not ($securityHandle))
{
$securityHandle = findSecurityWindow(); # wait for security win
+dow to pop-up...
}
# window has been found - clear it
clearSecurityWindow2($securityHandle);
}
sub main
{
# init OLE, COINIT_OLEINITIALIZE required when using MAPI.Session
+objects
Win32::OLE->Initialize(Win32::OLE::COINIT_OLEINITIALIZE);
#die Win32::OLE->LastError(),"\n" if Win32::OLE->LastError( );
# Create a new MAPI session
my $OUTLOOK = Win32::OLE->new('Outlook.Application')
or die "Could not instatiate Outlook: " . Win32::OLE::LastError();
my $NS = $OUTLOOK->GetNamespace("MAPI")
or die "Could not get namespace: " . Win32::OLE::LastError();
for my $parent ( 1..$NS->Folders->Count )
{
recurse_folders( $NS->Folders($parent), $parent );
}
sub recurse_folders
{
my ($folder, $parent) = @_;
return if $folder->DefaultItemType != olMailItem; # not a ma
+il folder
#my $fh = get_fh("$parent/".$folder->Name);
# if ( ("$parent/".$folder->Name) =~ m/$ROOT_FOLDER/i )
#{
#printf "\n\nFolder: %s\nTotal entries: %s\n",
# "$parent/".$folder->Name, $folder->Items->Count if $DEBUG
+;
for my $i (1..$folder->Items->Count)
{
printf "Processing %d\r", ++$ITEMS;
my $message = $folder->Items->Item($i);
next unless $message->Class == olMail; # mail item
#next if $DEBUG and $DEBUG < 4 ;
#(my $body = $message->Body || '' ) =~ s/\r//g;
(my $body = $message->Body || '' );
my $attach = $message->Attachments;
my $subject = $message->Subject;
my $splitSubject = substr($subject,0,30);
$splitSubject =~ s/\W/ /g;
my $outputFile = $SAVEDIR.'\\'.$splitSubject."_".$ITEMS.".
+txt";
open(MESSAGEFILE, '>',$outputFile) or print $outputFile,"
+$!";
print MESSAGEFILE $body;
close(MESSAGEFILE);
#Store the attachments if any of the current mail item
for my $attach_index (1..$attach->Count)
{
my $attachment = $attach->item($attach_index);
my $filename = $attachment->Filename;
#print "Attachment == ",$filename,"\n";
my $saveas = $ATTACH_PATH.$ITEMS."_".$filename;
#print "saving attachment '$filename' to '$saveas'...\
+n";
$attachment->SaveAsFile($saveas);
warn "error saving attachment $filename to $saveas" if
+ !-e $saveas;
}
}
#}
# recursive tree walk
if ($folder->Folders and $folder->Folders->Count)
{
for my $i (1..$folder->Folders->Count)
{
recurse_folders($folder->Folders($i),"$parent/".$folder->N
+ame);
}
}
}
}
chkOpts();
main();
But iam getting the following error:Thread 1 terminated abnormally: Undefined subroutine &Win32::GUI::FindWindow cal
led at outlook_test.pl line 53. Pls help...
</code>
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.