http://www.perlmonks.org?node_id=660500
Category: Win32 Stuff
Author/Contact Info /msg blahblahblah
Description: Last year I finally had to give up my plain-text mail client and start using outlook, and also lost my linux workstation. Transitioning to outlook wasn't as hard as I'd expected -- it has a lot of keyboard shortcuts -- but I missed the unix calendar program's daily mails. I threw together this quick script to email myself a daily calendar preview, and set it up in my task scheduler to run every morning.
# a script to send me a daily outlook calendar summary
#
# some references:
#  quick calendar example:
#    http://www.perlmonks.org/?node_id=201750
#  handle recurring appts, sorting, etc.:
#    http://msdn2.microsoft.com/en-us/library/aa155752(office.10).aspx
#  create outlook notes:
#    http://www.perlmonks.org/?node_id=240157
#  send outlook mail (trickier than I'd assumed so I used SMTP instead
+):
#    http://www.perlmonks.org/?node_id=185757

use strict;

BEGIN {$main::TZ = 'US/Eastern';};

use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Outlook';
use Win32::OLE::Variant;
use Date::Manip;

my $OL = Win32::OLE->GetActiveObject('Outlook.Application')
    || Win32::OLE->new('Outlook.Application', 'Quit');
my $NameSpace = $OL->GetNameSpace("MAPI");
my $cal = $NameSpace->GetDefaultFolder(olFolderCalendar) or die("error
+ getting cal folder: " . Win32::OLE->LastError());

my $todayDT = ParseDate("today 00:00:00");
my $today = justDate($todayDT);
my $todayRange = qq{[Start] >= '$today' and [Start] < '$today 11:59 pm
+'};
my $tomorrow = justDate(Date_NextWorkDay($todayDT, 1));
my $tomorrowRange = qq{[Start] >= '$tomorrow' and [Start] < '$tomorrow
+ 11:59 pm'};

my $body;
for my $range (['TODAY', $todayRange, $today],
               ['TOMORROW', $tomorrowRange, $tomorrow],
              )
{
    $body .= sprintf("\n%s %s [%s]\n\n", DayOfWeek($range->[2]), $rang
+e->[2], $range->[0]);

    my $appts = $cal->Items() or die("error getting cal appts: " . Win
+32::OLE->LastError());
    $appts->Sort("[Start]");
    $appts->{IncludeRecurrences} = 'True';
    $appts = $appts->Restrict($range->[1]);
    
    for my $appt (in $appts)
    {
        $body .= sprintf("%s   %s\n",
                         justTime($appt->{Start}),
                         $appt->{Subject});
    }
}

my $mail = q{From: "Joe" <joe@example.com>
To: "Joe" <joe@example.com>
Subject: calendar for today
};

$mail .= "\n$body";
print $mail;

print "sending mail...\n";

use Net::SMTP;
my $smtp = Net::SMTP->new('mail.example.com', Debug => 1);
$smtp->mail('joe@example.com');
$smtp->to('joe@example.com');

$smtp->data();
$smtp->datasend($mail);
$smtp->dataend();
$smtp->quit;


# for outlook date format:
sub justTime
{
    my (undef, $time, $ampm) = split(/\s/, $_[0], 3);
    $time = substr($time, 0, -3);  # chop off seconds
    $time =~ s{^ (\d) :}{ $1:}x;

    return join(' ', $time, $ampm);
}

# for datemanip date format:
sub DayOfWeek
{
    my ($y, $m, $d) = splitDate($_[0]);
    return [qw(Sun Mon Tue Wed Thu Fri Sat)]->[Date_DayOfWeek($m, $d, 
+$y)];
}
# for datemanip date format:
sub justDate
{
    join('-', splitDate($_[0]));
}
# for datemanip date format:
sub splitDate
{
    return (substr($_[0], 0, 4),
            substr($_[0], 4, 2),
            substr($_[0], 6, 2));
}