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 |
etc.
-Bryan
In reply to Important Date Email Reminder by mrborisguy
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |