#!/usr/bin/perl use Mail::Mbox::MessageParser::Grep; use Date::ICal; my $filename = 'Blockbuster'; my $filehandle = new FileHandle($filename); open (MYCAL,">/home/dav/ryan/blockbuster.ics") || die "could not create calendar file $!\n"; print MYCAL "BEGIN:VCALENDAR\nCALSCALE:GREGORIAN\nPRODID :-//RyanScript//EN\nVERSION:2.0\n"; my $folder_reader = new Mail::Mbox::MessageParser::Grep( { 'file_name' => $filename, 'file_handle' => $filehandle, } ); %month=( Jan => '01', Feb => '02', Mar => '03', Apr => '04', May => '05', Jun => '06', Jul => '07', Aug => '08', Sep => '09', Oct => '10', Nov => '11', Dec => '12', ); die $folder_reader unless ref $folder_reader; # This is the main loop. It's executed once for each email while(!$folder_reader->end_of_file()){ my $email = $folder_reader->read_next_email(); my @mail = split(/\n/,${$email}); my ($startstring,$startdate,$moviename,$arriveorreceive); foreach (@mail){ if ($_=~/^Date:\s\w+,\s(.*$)/){ $startdate=$1; chomp $startdate; $startstring=&makestartstring($startdate); } if ($_=~/^Subject:\sBlockbuster\shas\sreceived\s(.*$)/){ $moviename="Received-- $1"; chomp $moviename; &createevent($startstring,$moviename); next; } if ($_=~/\s+(.*)\sto\syou\.\s+You\scan\sexpect\sto\sreceive\sit\son\sor\saround\s\w+,\s(.*)\./){ # if ($_=~/(.*)You\scan\sexpect\sto\sreceive\sit\son\sor\saround\s\w+,\s(.*)\./){ $startdate=$2; $moviename="Arriving-- $1"; $moviename=~s/\///g; chomp $startdate; $startstring=&makestartstring($startdate); &createevent($startstring,$moviename); } } } ############################ sub createevent{ my ($start,$description)=@_; # my $startstring="$start" . "T0H0M"; my $startstring=$start; my $icalstart=Date::ICal->new(ical=>"$startstring",offset=>""); my $durationstring="P1DT0H0M"; my $icalend=$icalstart + $durationstring; my $icalendhour=$icalend->hour; my $icalendyear=$icalend->year; my $icalendmonth=$icalend->month; my $icalendday=$icalend->day; if (length($icalendmonth)==1){ $icalendmonth="0$icalendmonth"; } my $icalendday=$icalend->day; if (length($icalendday)==1){ $icalendday="0$icalendday"; } # leading zeros are fun if (length($icalendhour)==1){ $icalendhour="0$icalendhour"; } # again, leading zeros are fun my $icalendminute=$icalend->minute; if (length($icalendminute)==1){ $icalendminute="0$icalendminute"; } print MYCAL "BEGIN:VEVENT\nSUMMARY:$description\nDTSTART\;VALUE=DATE:$start"."\nDTEND\;VALUE=DATE:".$icalendyear.$icalendmonth.$icalendday."\nDESCRIPTION:$description\nEND:VEVENT\n"; } sub makestartstring{ my $datestring=@_[0]; my ($m,$d,$y); # get rid of the commas and that pesky timestamp $datestring=~s/,//g; $datestring=~s/\s\d{2,2}:\d{2,2}:\d{2,2}\sGMT//g; # $datestring=~s/Mon//g; # $datestring=~s/Tue//g; # $datestring=~s/Wed//g; # $datestring=~s/Thu//g; # $datestring=~s/Fri//g; # $datestring=~s/Sat//g; # $datestring=~s/Sun//g; if ($datestring=~/(\d+)\s(\w{3,3})\s+(200\d$)/){ $m=$month{$2}; $d=$1; if (length($d)==1){ $d="0$d"; } $y=$3; } elsif ($datestring=~/(\w+)\s(\d+)\s+(200\d$)/){ $m=$month{substr($1,0,3)}; $d=$2; if (length($d)==1){ $d="0$d"; } $y=$3; } return "$y$m$d"; } print MYCAL "END:VCALENDAR\n"; close MYCAL;