I like to know when important dates (like my family's birthdays, important anniversaries, etc.) are coming up, but I don't actively look at a calendar every day. I do read my email everyday, however, so I wrote this little script to send me email reminders of these important days. I'd suggest setting it on cron so it runs everyday.

So here's the code.

#!/usr/bin/perl use strict; use DBI; use Net::SMTP_auth; use XML::Simple; my $config_file = $ARGV[0] || "/etc/importantdates.xml"; my $xml = XMLin( $config_file, 'ForceArray' => ['days'] ) or die "what +?"; my $dbh = initialize_database( $xml ); my @days_warning = @{ $xml->{'config'}->{'reminders'}->{'days'} }; my $sel_str = q( SELECT d_desc, d_date, MOD( DAYOFYEAR( CONCAT( YEAR( CURDATE() ), DATE_FORMAT +( d_date, '-%m-%d' ) ) ) - DAYOFYEAR( CURDATE() ) + 365, 365 ) AS diff FROM dates HAVING diff <= ? ORDER BY diff ); my $sth = $dbh->prepare( $sel_str ); $sth->execute( max ( @days_warning ) ); while( my ( $d_desc, $d_date, $diff ) = $sth->fetchrow_array() ) { my $str = $d_desc; foreach ( @days_warning ) { if ( $diff == $_ ) { $str .= " in $diff day(s)."; send_email( $str, $xml ); last; } } } $sth->finish(); $dbh->disconnect(); ###### SUBS ###### sub max { my $max = $_[0]; foreach ( @_ ) { $max = $_ if ( $_ > $max ); } $max; } sub initialize_database { my $xml = shift; my $username = $xml->{'config'}->{'db'}->{'username'}; my $password = $xml->{'config'}->{'db'}->{'password'}; my $database = $xml->{'config'}->{'db'}->{'database'}; my $hostname = $xml->{'config'}->{'db'}->{'hostname'}; my $dsn = "DBI:mysql:$database:$hostname"; my $dbh = DBI->connect( $dsn, $username, $password ) or die "C +ould not create MySQL connection"; my $drh = DBI->install_driver("mysql"); $dbh } sub send_email { my $content = shift; my $xml = shift; my $hostname = $xml->{'config'}->{'smtp'}->{'hostname'}; my $username = $xml->{'config'}->{'smtp'}->{'username'}; my $password = $xml->{'config'}->{'smtp'}->{'password'}; my $to = $xml->{'config'}->{'smtp'}->{'to'}; my $from = $xml->{'config'}->{'smtp'}->{'from'}; my $subject = $xml->{'config'}->{'smtp'}->{'subject'}; my $smtp = Net::SMTP_auth->new( $hostname ) or die "Could not +create SMTP connection"; $smtp->auth( 'LOGIN', $username, $password ); $smtp->mail( $from ); $smtp->to( $to ); $smtp->data(); $smtp->datasend("To: $to\n"); $smtp->datasend("From: $from\n"); $smtp->datasend("Subject: $subject\n"); $smtp->datasend("\n"); $smtp->datasend( $content . "\n" ); $smtp->dataend(); $smtp->quit(); }

And here is my XML config file.

<?xml version="1.0"?> <importantdates> <config> <db> <username>your_db_username</username> <password>your_db_hostname</password> <hostname>yourdb.yourdomain.com</hostname> <database>databasename</database> </db> <smtp> <hostname>smtp.yourdomain.com</hostname> <username>your_smtp_username</username> <password>your_smtp_password</password> <to>whoisitto@somedomain.com</to> <from>thisisyou@yourdomain.com</from> <subject>Important Date Reminder</subject> </smtp> <reminders> <!--How often you want reminders. I want emai +l reminders 7 days before the event, the day before the event, and th +e day of the event--> <days>0</days> <days>1</days> <days>7</days> </reminders> </config> </importantdates>

My database looks like this:

d_id d_date d_desc
1 1978-03-05 Anne's Birthday
2 1975-05-06 Mom and Dad's Anniversary



Replies are listed 'Best First'.
Re: Important Date Email Reminder
by cog (Parson) on May 25, 2005 at 15:10 UTC
    See also Quiz of the Week #22 - displaying upcoming events.

    The challenge was to process plain text files and reporting the ones coming up in the next N days (and then there were some cool functionalities).

    Some of the answers submitted allowed for things like "every first Sunday of each month", which was great.

      Interesting. I was planning to dump all of the data into the XML file eventually, so I'll see if I can pull that off too!


Re: Important Date Email Reminder
by BioGeek (Hermit) on May 25, 2005 at 17:03 UTC
    There is also Remind, a sophisticated open source calendar and alarm program. It includes the following features:
    • A sophisticated scripting language and intelligent handling of exceptions and holidays.
    • Plain-text, PostScript and HTML output.
    • Timed reminders and pop-up alarms.
    • A friendly graphical front-end for people who don't want to learn the scripting language.
    • Facilities for both the Gregorian and Hebrew calendars.
    • Support for 12 different languages.

    I (try to) use it for implementing the the Getting Things Done philosophy into my life.