#! /usr/bin/perl use DBI; use Encode; use Getopt::Long; use Mail::Sendmail; use Date::Calc qw/Day_of_Week/; my $cfg; my $db; sub basepath { my @parts = split('/', $0); pop @parts;pop @parts;pop @parts; return join('/', @parts); } sub config_read { my $info; open my $f, basepath.'/config.php' or return; while (<$f>) { chomp; next if /^#/ || /^\s*$/; next unless /^\s*define\(['"](.*?)["']\s*,\s*['"](.*?)["']\)/; $info->{$1} = $2; } close $f; return $info; } sub dbconnect { my $dsn = 'dbi:' . ($cfg->{DBDRIVER} eq 'pgsql' ? 'Pg:dbname=' : 'mysql:database=') . $cfg->{DBNAME}; $dsn .= ';hostname='.$cfg->{DBHOST} if $cfg->{DBHOST} ne 'localhost'; my $dbh = DBI->connect($dsn, $cfg->{DBUSER}, $cfg->{DBPASS}, {'PrintError' => 1, 'RaiseError' => 0}) or die "Can't connect to database: $DBI::errstr\n"; return $dbh; } sub fetch_dates { my $delta = $cfg->{DATES_DELTA}; $delta = 1 unless defined $delta; my $sql = sprintf("SELECT date_dates.id,date,name FROM date_dates JOIN date_types ON type = date_types.id " . "WHERE notify = 1 AND date = now()::date + interval '%d days' ORDER BY name", $delta); my $sth = $db->prepare($sql); $sth->execute; return $sth->fetchall_hashref('id'); } sub send_reminder { my $dates = shift; my $body; my @datenames; my @wdays = qw/Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag/; foreach my $row (values %$dates) { my ($year,$month,$day) = split(/-/, $row->{date}); my $dow = $wdays[Day_of_Week($year,$month,$day)]; $body .= sprintf("\n%-10s %s %s\n", $dow, $row->{date}, $row->{name}); push @datenames, $row->{name}; } my %mail = ('To' => $cfg->{DATES_REMINDER}, 'From' => sprintf('%s <%s>', $cfg->{TITLE}, $cfg->{MAIL_FROM}), 'Subject' => encode("MIME-Header", decode('UTF-8', join(', ', @datenames))), 'Content-type' => 'text/plain; charset=UTF-8', 'Content-Transfer-Encoding' => '8bit', 'Message' => $body, ); sendmail(%mail) or die $Mail::Sendmail::error; } $cfg = config_read; die "Missing define for DATES_REMINDER" unless $cfg->{DATES_REMINDER}; $db = dbconnect; my $dates = fetch_dates; send_reminder $dates if keys %$dates;