#!/usr/bin/php -q True, 'noapi' => True, 'nonavbar' => True, 'currentapp' => 'login' ); include('/var/www/html/phpgroupware/header.inc.php'); include(PHPGW_API_INC.'/functions.inc.php'); include(PHPGW_INCLUDE_ROOT.'/calendar/inc/class.socalendar__.inc.php'); // initialize $debug = 0; $wdb = array( 0 => MCAL_M_SUNDAY, 1 => MCAL_M_MONDAY, 2 => MCAL_M_TUESDAY, 3 => MCAL_M_WEDNESDAY, 4 => MCAL_M_THURSDAY, 5 => MCAL_M_FRIDAY, 6 => MCAL_M_SATURDAY ); $pref = new preferences(); $db = new db(); $db->Database = $GLOBALS['phpgw_domain']['default']['db_name']; $db->Host = $GLOBALS['phpgw_domain']['default']['db_host']; $db->User = $GLOBALS['phpgw_domain']['default']['db_user']; $db->Password = $GLOBALS['phpgw_domain']['default']['db_pass']; $now = time(); if ($debug) { echo 'current timestamp is '.$now.' = '.date("r", $now)."\n"; } // get each alarm that needs email notification $db->lock(array('phpgw_cal_alarm'), 'read'); $db->query('SELECT * FROM phpgw_cal_alarm where alarm_enabled=1 and cal_time <= unix_timestamp()', __LINE__,__FILE__); if ($db->num_rows() < 1) { $db->unlock(); exit; } while ($db->next_record()) { $Alarm[$db->f('alarm_id')] = Array( 'cal_id' => $db->f('cal_id'), 'cal_owner' => $db->f('cal_owner'), 'cal_time' => $db->f('cal_time'), 'cal_text' => $db->f('cal_text'), 'alarm_enabled' => $db->f('enabled') ); } $db->unlock(); // get email addresses while (list($key, $alarm) = @each($Alarm)) { $owner = $alarm['cal_owner']; if ($Email[$owner] == '') { $emailpref = $pref->create_email_preferences($owner); $Email[$owner] = $emailpref['email']['address']; $GLOBALS['phpgw']->accounts->get_account_name($owner,$lid,$fname,$lname); $Name[$owner] = "$fname $lname"; } if ($debug) { echo 'Alarm '.$key.' event '.$Alarm[$key]['cal_id'].' owner ' .$Alarm[$key]['cal_owner'].' '.$Name[$owner].' '.$Email[$owner] .' time '.$Alarm[$key]['cal_time'].' = ' .date("r", $Alarm[$key]['cal_time'])."\n"; } } // the date & time functions below should be converted to use // the users time format // loop through each alarm that went off and get information for the email // and if it is a recurring event reset the alarm for the next occurance @reset($Alarm); $db->lock(array('phpgw_cal','phpgw_cal_alarm','phpgw_cal_repeats')); while (list($key, $alarm) = @each($Alarm)) { $owner = $alarm['cal_owner']; $body = 'This is an automatically generated reminder about the following appointment:'."\n\n"; $db->query('SELECT * FROM phpgw_cal WHERE cal_id=' .$alarm['cal_id'],__LINE__,__FILE__); $db->next_record(); $subject = 'Appointment Reminder Re: '.$db->f('title',1); $body .= 'Regarding: '.$db->f('title',1)."\n"; $body .= 'Location: '.$db->f('location')."\n"; $datetime = $db->f('datetime'); $edatetime = $db->f('edatetime'); $description = $db->f('description',1); if ($debug) { echo 'Alarm '.$key.' start datetime '.$datetime.' = '.date("r", $datetime)."\n"; echo 'Alarm '.$key.' end datetime '.$edatetime.' = '.date("r", $edatetime)."\n"; } $db->query('SELECT * FROM phpgw_cal_repeats where cal_id=' .$alarm['cal_id'],__LINE__,__FILE__); if ($db->next_record()) { $type = $db->f('recur_type'); } else { $type = MCAL_RECUR_NONE; } // this section will reset recurring events alarms to go off the same amount of time // prior to the next event switch ($type) { case MCAL_RECUR_NONE: if ($debug) { echo 'Alarm '.$key.' RECUR_NONE '."\n"; } $neweventtime = $datetime; $db->query('UPDATE phpgw_cal_alarm set alarm_enabled=0 where alarm_id='.$key, __LINE__,__FILE__); $date = date("l, F j, Y", $datetime); $from = date("g:i a", $datetime); $to = date("g:i a", $edatetime); break; case MCAL_RECUR_DAILY: if (($interval = $db->f('recur_interval')) == 0) { $interval = 1; } if ($debug) { echo 'Alarm '.$key.' RECUR_DAILY interval '.$interval."\n"; } $next = 24 * 3600 * $interval; // the new alarm time to set must be some time in the future $newalmtime = $alarm['cal_time']; // initialize while ($newalmtime < $now) { $newalmtime += $next; } // the date & time of the meeting this email is for (for email) // must be the first recurring event after this alarm $neweventtime = $datetime; $newedatetime = $edatetime; while ($neweventtime < $alarm['cal_time']) { $neweventtime += $next; $newedatetime += $next; } $date = date("l, F j, Y", $neweventtime); $from = date("g:i a", $neweventtime); $to = date("g:i a", $newedatetime); // the new alarm time cannot be past the enddate $enddate = $db->f('recur_enddate'); if ($enddate && $enddate < $neweventtime) { $db->query('UPDATE phpgw_cal_alarm set alarm_enabled=0 where alarm_id=' .$key,__LINE__,__FILE__); } else { $db->query('UPDATE phpgw_cal_alarm set cal_time='.$newalmtime .' where alarm_id='.$key,__LINE__,__FILE__); } break; case MCAL_RECUR_WEEKLY: if (($interval = $db->f('recur_interval')) == 0) { $interval = 1; } $interval--; if ($debug) { echo 'Alarm '.$key.' RECUR_WEEKLY interval '.$interval."\n"; } // RECUR_WEEKLY is dependent upon recur_data which is the // days of the week of the event not the days of the week // of the alarm so we need to get the amount of time prior // to the event that the alarm should go off and subtract // that from the date/time of the next recurring event // calculated using recur_data $recurdow = $db->f('recur_data'); if ($debug) { echo 'Alarm '.$key.' recur_data '.$recurdow."\n"; } // find the first event after the alarm that just went off // to get the date & time of the event for email // and to calculate how much time before the event the // alarm was set for to be used when resetting the alarm // for the next event $neweventtime = $datetime; $newedatetime = $edatetime; if ($debug) { echo 'Alarm '.$key.' initial event time = '.$neweventtime.' = ' .date("r", $neweventtime)."\n"; } while ($neweventtime < $alarm['cal_time']) { $dow = date("w", $neweventtime); $j = $dow + 1; $days_to_next = 1; if ($debug) { echo 'Alarm '.$key.' Next event time = '.$neweventtime.' = ' .date("r", $neweventtime)."\n"; } // find the next day of week that is selected $newweek = 0; while ($j != $dow) { if ($j > 6) { $newweek = 1; $j = 0; } if ($wdb[$j] & $recurdow) { break; } $j++; // fail safe // should never happen if ($days_to_next++ > 7) { break; } } if ($debug) { echo 'Alarm '.$key.' days to next event = '.$days_to_next."\n"; } $neweventtime += (24 * 3600 * $days_to_next); $newedatetime += (24 * 3600 * $days_to_next); if ($newweek && $interval > 0) { if ($debug) { echo 'Alarm '.$key.' skipping '.$interval.' weeks ' ."\n"; } $neweventtime += ($interval * 7 * 24 * 3600); $newedatetime += ($interval * 7 * 24 * 3600); } } if ($debug) { echo 'Alarm '.$key.' next event time after alarm = '.$neweventtime .' = '.date("r", $neweventtime)."\n"; } $date = date("l, F j, Y", $neweventtime); $from = date("g:i a", $neweventtime); $to = date("g:i a", $newedatetime); $savneweventtime = $neweventtime; $diff = $neweventtime - $alarm['cal_time']; if ($debug) { echo 'Alarm '.$key.' amount of time before event to send email ' .$diff."\n"; } // the new event time must be some time in the future $newalmtime = $alarm['cal_time']; // intialize // compare the alarm time not the event time just in case the // alarm was set such that it should have already gone off // even though the event is still in the future // this loop just used to get newalmtime by following each // next event while ($newalmtime < $now) { $dow = date("w", $neweventtime); $j = $dow + 1; $days_to_next = 1; if ($debug) { echo 'Alarm '.$key.' Next event time = '.$neweventtime .' = '.date("r", $neweventtime)."\n"; } // find the next day of week that is selected $newweek = 0; while ($j != $dow) { if ($j > 6) { $newweek = 1; $j = 0; } if ($wdb[$j] & $recurdow) { break; } $j++; // fail safe // should never happen if ($days_to_next++ > 7) { break; } } if ($debug) { echo 'Alarm '.$key.' days to next event = '.$days_to_next."\n"; } $neweventtime += (24 * 3600 * $days_to_next); if ($newweek && $interval > 0) { if ($debug) { echo 'Alarm '.$key.' skipping '.$interval .' weeks '."\n"; } $neweventtime += ($interval * 7 * 24 * 3600); } $newalmtime = $neweventtime - $diff; } // reset neweventtime to event that alarm is about $neweventtime = $savneweventtime; if ($debug) { echo 'Alarm '.$key.' Next event time = '.$neweventtime.' = ' .date("r", $neweventtime)."\n"; echo 'Alarm '.$key.' Next alarm time after now = '.$newalmtime.' = ' .date("r", $newalmtime)."\n"; } // the new alarm time cannot be past the enddate $enddate = $db->f('recur_enddate'); if ($enddate && $enddate < $neweventtime) { $db->query('UPDATE phpgw_cal_alarm set alarm_enabled=0 where alarm_id=' .$key,__LINE__,__FILE__); } else { $db->query('UPDATE phpgw_cal_alarm set cal_time='.$newalmtime .' where alarm_id='.$key,__LINE__,__FILE__); } break; case MCAL_RECUR_MONTHLY_MDAY: if (($interval = $db->f('recur_interval')) == 0) { $interval = 1; } if ($debug) { echo 'Alarm '.$key.' RECUR_MONTHLY_MDAY interval '.$interval."\n"; } $newalmtime = $alarm['cal_time']; // initialize while ($newalmtime < $now) { $tm = localtime($newalmtime,true); $mon = $tm[tm_mon]+1+$interval; $year = $tm[tm_year]; if ($mon > 12) { $mon -= 12; $year++; } $newalmtime = mktime($tm[tm_hour], $tm[tm_min], $tm[tm_sec],$mon,$tm[tm_mday],$year); if ($debug) { echo 'Alarm '.$key.' Next alarm time = '.$newalmtime.' = ' .date("r", $newalmtime)."\n"; } } // the date & time of the meeting (for email) // must be the first recurring event after this alarm $neweventtime = $datetime; $newedatetime = $edatetime; while ($neweventtime < $alarm['cal_time']) { $tm = localtime($neweventtime,true); $mon = $tm[tm_mon]+1+$interval; $year = $tm[tm_year]; if ($mon > 12) { $mon -= 12; $year++; } $neweventtime = mktime($tm[tm_hour], $tm[tm_min],$tm[tm_sec],$mon, $tm[tm_mday],$year); $tm = localtime($newedatetime,true); $mon = $tm[tm_mon]+1+$interval; $year = $tm[tm_year]; if ($mon > 12) { $mon -= 12; $year++; } $newedatetime = mktime($tm[tm_hour], $tm[tm_min],$tm[tm_sec],$mon, $tm[tm_mday],$year); } $date = date("l, F j, Y", $neweventtime); $from = date("g:i a", $neweventtime); $to = date("g:i a", $newedatetime); // the new alarm time cannot be past the enddate $enddate = $db->f('recur_enddate'); if ($enddate && $enddate < $neweventtime) { $db->query('UPDATE phpgw_cal_alarm set alarm_enabled=0 where alarm_id=' .$key,__LINE__,__FILE__); } else { $db->query('UPDATE phpgw_cal_alarm set cal_time='.$newalmtime .' where alarm_id='.$key,__LINE__,__FILE__); } break; case MCAL_RECUR_MONTHLY_WDAY: if (($interval = $db->f('recur_interval')) == 0) { $interval = 1; } if ($debug) { echo 'Alarm '.$key.' RECUR_MONTHLY_WDAY interval '.$interval."\n"; } // RECUR_MONTHLY_WDAY is dependent upon the // day of the week of the event not the day of the week // of the alarm so we need to get the amount of time prior // to the event that the alarm should go off and subtract // that from the date/time of the next recurring event // the date & time of the meeting (for email) // must be the first recurring event after this alarm $neweventtime = $datetime; $newedatetime = $edatetime; while ($neweventtime < $alarm['cal_time']) { if ($debug) { echo 'Alarm '.$key.' Next event time = '.$neweventtime.' = ' .date("r", $neweventtime)."\n"; } $tm = localtime($neweventtime,true); $mon = $tm[tm_mon]+1+$interval; $year = $tm[tm_year]; if ($mon > 12) { $mon -= 12; $year++; } $bom = mktime($tm[tm_hour],$tm[tm_min],$tm[tm_sec],$mon,1,$year); $bomtm = localtime($bom,true); if ($tm[tm_wday] > $bomtm[tm_wday]) { $adddays = $tm[tm_wday] - $bomtm[tm_wday]; } else { $adddays = 7 - $bomtm[tm_wday] + $tm[tm_wday]; } $neweventtime = $bom + ((ceil($tm[tm_mday]/7)-1)*7*3600*24) + ($adddays*3600*24); $tm = localtime($newedatetime,true); $mon = $tm[tm_mon]+1+$interval; $year = $tm[tm_year]; if ($mon > 12) { $mon -= 12; $year++; } $bom = mktime($tm[tm_hour],$tm[tm_min],$tm[tm_sec],$mon,1,$year); $bomtm = localtime($bom,true); if ($tm[tm_wday] > $bomtm[tm_wday]) { $adddays = $tm[tm_wday] - $bomtm[tm_wday]; } else { $adddays = 7 - $bomtm[tm_wday] + $tm[tm_wday]; } $newedatetime = $bom + ((ceil($tm[tm_mday]/7)-1)*7*3600*24) + ($adddays*3600*24); } if ($debug) { echo 'Alarm '.$key.' next event time after alarm = '.$neweventtime .' = '.date("r", $neweventtime)."\n"; } $date = date("l, F j, Y", $neweventtime); $from = date("g:i a", $neweventtime); $to = date("g:i a", $newedatetime); $savneweventtime = $neweventtime; $diff = $neweventtime - $alarm['cal_time']; if ($debug) { echo 'Alarm '.$key.' amount of time before event to send email ' .$diff."\n"; } $newalmtime = $alarm['cal_time']; // initialize while ($newalmtime < $now) { if ($debug) { echo 'Alarm '.$key.' Next event time = '.$neweventtime.' = ' .date("r", $neweventtime)."\n"; } $tm = localtime($neweventtime,true); $mon = $tm[tm_mon]+1+$interval; $year = $tm[tm_year]; if ($mon > 12) { $mon -= 12; $year++; } $bom = mktime($tm[tm_hour],$tm[tm_min],$tm[tm_sec],$mon,1,$year); $bomtm = localtime($bom,true); if ($tm[tm_wday] > $bomtm[tm_wday]) { $adddays = $tm[tm_wday] - $bomtm[tm_wday]; } else { $adddays = 7 - $bomtm[tm_wday] + $tm[tm_wday]; } $neweventtime = $bom + ((ceil($tm[tm_mday]/7)-1)*7*3600*24) + ($adddays*3600*24); $newalmtime = $neweventtime - $diff; } if ($debug) { echo 'Alarm '.$key.' Last event time = '.$neweventtime.' = ' .date("r", $neweventtime)."\n"; } $neweventtime = $savneweventtime; if ($debug) { echo 'Alarm '.$key.' Reset event time = '.$neweventtime.' = ' .date("r", $neweventtime)."\n"; echo 'Alarm '.$key.' Next alarm time after now = '.$newalmtime.' = ' .date("r", $newalmtime)."\n"; } // the new alarm time cannot be past the enddate $enddate = $db->f('recur_enddate'); if ($enddate && $enddate < $neweventtime) { $db->query('UPDATE phpgw_cal_alarm set alarm_enabled=0 where alarm_id=' .$key,__LINE__,__FILE__); } else { $db->query('UPDATE phpgw_cal_alarm set cal_time='.$newalmtime .' where alarm_id='.$key,__LINE__,__FILE__); } break; case MCAL_RECUR_YEARLY: if (($interval = $db->f('recur_interval')) == 0) { $interval = 1; } if ($debug) { echo 'Alarm '.$key.' RECUR_YEARLY interval '.$interval."\n"; } $newalmtime = $alarm['cal_time']; // initialize while ($newalmtime < $now) { $tm = localtime($newalmtime,true); $newalmtime = mktime($tm[tm_hour], $tm[tm_min], $tm[tm_sec],$tm[tm_mon]+1,$tm[tm_mday], $tm[tm_year]+$interval); } // the date & time of the meeting (for email) // must be the first recurring event after this alarm $neweventtime = $datetime; $newedatetime = $edatetime; while ($neweventtime < $alarm['cal_time']) { $tm = localtime($neweventtime,true); $neweventtime = mktime($tm[tm_hour], $tm[tm_min], $tm[tm_sec],$tm[tm_mon]+1,$tm[tm_mday], $tm[tm_year]+$interval); $tm = localtime($newedatetime,true); $newedatetime = mktime($tm[tm_hour], $tm[tm_min], $tm[tm_sec],$tm[tm_mon]+1,$tm[tm_mday], $tm[tm_year]+$interval); } $date = date("l, F j, Y", $neweventtime); $from = date("g:i a", $neweventtime); $to = date("g:i a", $newedatetime); // the new alarm time cannot be past the enddate $enddate = $db->f('recur_enddate'); if ($enddate && $enddate < $neweventtime) { $db->query('UPDATE phpgw_cal_alarm set alarm_enabled=0 where alarm_id=' .$key,__LINE__,__FILE__); } else { $db->query('UPDATE phpgw_cal_alarm set cal_time='.$newalmtime .' where alarm_id='.$key,__LINE__,__FILE__); } break; } if ($debug) { echo 'Alarm '.$key.' email date '.$date.' from '.$from.' to '.$to."\n"; echo 'Alarm '.$key.' neweventtime '.$neweventtime.' = '.date("r", $neweventtime)."\n"; } if ($neweventtime < $now) { if ($debug) { echo 'Alarm '.$key.' event has already occurred. Not sending email.'."\n"; } continue; } $body .= 'Date: '.$date."\n"; $body .= 'Time: '.$from.' to '.$to."\n"; $body .= 'Description:'."\n\n".$description."\n\n"; // the email is made to be from the user so that reply's // do not go to root/postmaster/etc, You could add some text like: // If you have any question regarding this email, please contact... mail($Name[$owner].' <'.$Email[$owner].'>', $subject, $body, 'From: '.$Name[$owner].' <'.$Email[$owner].'>'."\r\n" .'Reply-To: '.$Name[$owner].' <'.$Email[$owner].'>'."\r\n" ); } $db->unlock(); ?>