%PDF- %PDF-
| Direktori : /www/varak.net/mail2.varak.net_old/crons/ |
| Current File : /www/varak.net/mail2.varak.net_old/crons/reminders.php |
<?php
/*
* Copyright 2004-2014, AfterLogic Corp.
* Licensed under AGPLv3 license or AfterLogic license
* if commercial version of the product was purchased.
* See the LICENSE file for a full license statement.
*/
defined('P7_ROOTPATH') || define('P7_ROOTPATH', (dirname(__FILE__).'/../'));
include_once P7_ROOTPATH.'libraries/afterlogic/api.php';
class CReminder
{
/**
* @var CApiUsersManager
*/
private $oApiUsersManager;
/**
* @var CApiCalendarManager
*/
private $oApiCalendarManager;
/**
* @var CApiMailManager
*/
private $oApiMailManager;
/**
* @var array
*/
private $aAccounts;
/**
* @var array
*/
private $aCalendars;
/**
* @var string
*/
private $sCurRunFilePath;
/**
* @var string
*/
private $sLang;
public function __construct()
{
$oSettings =& CApi::GetSettings();
$this->aAccounts = array();
$this->aCalendars = array();
$this->sCurRunFilePath = CApi::DataPath().'/reminder-run';
$this->sLang = $oSettings->GetConf('Common/DefaultLanguage');
$this->oApiUsersManager = CApi::Manager('users');
$this->oApiCalendarManager = CApi::Manager('calendar');
$this->oApiMailManager = CApi::Manager('mail');
}
public static function NewInstance()
{
return new self();
}
/**
* @param string $sKey
* @param CAccount $oAccount = null
* @param array $aParams = null
*
* @return string
*/
private function i18n($sKey, $oAccount = null, $aParams = null, $iMinutes = null)
{
return CApi::ClientI18N($sKey, $oAccount, $aParams, $iMinutes);
}
/**
* @param string $sLogin
*
* @return CAccount
*/
private function &getAccount($sLogin)
{
$mResult = null;
if (!isset($this->aAccounts[$sLogin]))
{
$this->aAccounts[$sLogin] = $this->oApiUsersManager->GetAccountOnLogin($sLogin);
}
$mResult =& $this->aAccounts[$sLogin];
if (30 < count($this->aAccounts[$sLogin]))
{
$this->aAccounts = array_slice($this->aAccounts, -30);
}
return $mResult;
}
/**
* @param CAccount $oAccount
* @param string $sUri
*
* @return CalendarInfo|null
*/
private function &getCalendar($oAccount, $sUri)
{
$mResult = null;
if ($this->oApiCalendarManager)
{
if (!isset($this->aCalendars[$sUri]))
{
$this->aCalendars[$sUri] = $this->oApiCalendarManager->GetCalendar($oAccount, $sUri);
}
if (isset($this->aCalendars[$sUri]))
{
$mResult =& $this->aCalendars[$sUri];
}
}
return $mResult;
}
/**
* @param CAccount $oAccount
* @param string $sEventName
* @param string $sDateStr
* @param string $sCalendarName
* @param string $sEventText
* @param string $sCalendarColor
*
* @return string
*/
private function createBodyHtml($oAccount, $sEventName, $sDateStr, $sCalendarName, $sEventText, $sCalendarColor)
{
$sEventText = nl2br($sEventText);
return sprintf('
<div style="padding: 10px; font-size: 12px; text-align: center; word-wrap: break-word;">
<div style="border: 4px solid %s; padding: 15px; width: 370px;">
<h2 style="margin: 5px; font-size: 18px; line-height: 1.4;">%s</h2>
<span>%s%s</span><br/>
<span>%s: %s</span><br/><br/>
<span>%s</span><br/>
</div>
<p style="color:#667766; width: 400px; font-size: 10px;">%s</p>
</div>',
$sCalendarColor,
$sEventName,
ucfirst($this->i18n('REMINDERS/EVENT_BEGIN', $oAccount)),
$sDateStr,
$this->i18n('REMINDERS/CALENDAR', $oAccount),
$sCalendarName,
$sEventText,
$this->i18n('REMINDERS/EMAIL_EXPLANATION', $oAccount, array(
'EMAIL' => '<a href="mailto:'.$oAccount->Email.'">'.$oAccount->Email.'</a>',
'CALENDAR_NAME' => $sCalendarName
))
);
}
/**
* @param CAccount $oAccount
* @param string $sEventName
* @param string $sDateStr
* @param string $sCalendarName
* @param string $sEventText
*
* @return string
*/
private function createBodyText($oAccount, $sEventName, $sDateStr, $sCalendarName, $sEventText)
{
return sprintf("%s\r\n\r\n%s%s\r\n\r\n%s: %s %s\r\n\r\n%s",
$sEventName,
ucfirst($this->i18n('REMINDERS/EVENT_BEGIN', $oAccount)),
$sDateStr,
$this->i18n('REMINDERS/CALENDAR', $oAccount),
$sCalendarName,
$sEventText,
$this->i18n('REMINDERS/EMAIL_EXPLANATION', $oAccount, array(
'EMAIL' => '<a href="mailto:'.$oAccount->Email.'">'.$oAccount->Email.'</a>',
'CALENDAR_NAME' => $sCalendarName
))
);
}
/**
* @param CAccount $oAccount
* @param string $sSubject
* @param string $mHtml = null
* @param string $mText = null
*
* @return \MailSo\Mime\Message
*/
private function createMessage($oAccount, $sSubject, $mHtml = null, $mText = null)
{
$oMessage = \MailSo\Mime\Message::NewInstance();
$oMessage->RegenerateMessageId();
$sXMailer = CApi::GetConf('webmail.xmailer-value', '');
if (0 < strlen($sXMailer))
{
$oMessage->SetXMailer($sXMailer);
}
$oMessage
->SetFrom(\MailSo\Mime\Email::NewInstance($oAccount->Email))
->SetSubject($sSubject)
;
$oToEmails = \MailSo\Mime\EmailCollection::NewInstance($oAccount->Email);
if ($oToEmails && $oToEmails->Count())
{
$oMessage->SetTo($oToEmails);
}
if ($mHtml !== null)
{
$oMessage->AddText($mHtml, true);
}
if ($mText !== null)
{
$oMessage->AddText($mText, false);
}
return $oMessage;
}
/**
*
* @param CAccount $oAccount
* @param string $sSubject
* @param string $sEventName
* @param string $sDate
* @param string $sCalendarName
* @param string $sEventText
* @param string $sCalendarColor
*
* @return bool
*/
private function sendMessage($oAccount, $sSubject, $sEventName, $sDate, $sCalendarName, $sEventText, $sCalendarColor)
{
$oMessage = $this->createMessage($oAccount, $sSubject,
$this->createBodyHtml($oAccount, $sEventName, $sDate, $sCalendarName, $sEventText, $sCalendarColor),
$this->createBodyText($oAccount, $sEventName, $sDate, $sCalendarName, $sEventText));
try
{
return $this->oApiMailManager->MessageSend($oAccount, $oMessage);
}
catch (Exception $oException)
{
CApi::Log('MessageSend Exception', ELogLevel::Error, 'cron-');
CApi::LogException($oException, ELogLevel::Error, 'cron-');
}
return false;
}
private function getSubject($oAccount, $sEventStart, $iEventStartTS, $sEventName, $sDate, $iNowTS, $bAllDay = false)
{
$sSubject = '';
if ($bAllDay)
{
$oEventStart = new \DateTime("@$iEventStartTS", new \DateTimeZone('UTC'));
$oEventStart->setTimezone(new \DateTimeZone($oAccount->GetDefaultStrTimeZone()));
$iEventStartTS = $oEventStart->getTimestamp() - $oEventStart->getOffset();
}
$iMinutes = round(($iEventStartTS - $iNowTS) / 60);
if ($iMinutes > 0 && $iMinutes < 60)
{
$sSubject = $this->i18n('REMINDERS/SUBJECT_MINUTES_PLURAL', $oAccount, array(
'EVENT_NAME' => $sEventName,
'DATE' => date('G:i', strtotime($sEventStart)),
'COUNT' => $iMinutes
), $iMinutes);
}
else if ($iMinutes >= 60 && $iMinutes < 1440)
{
$sSubject = $this->i18n('REMINDERS/SUBJECT_HOURS_PLURAL', $oAccount, array(
'EVENT_NAME' => $sEventName,
'DATE' => date('G:i', strtotime($sEventStart)),
'COUNT' => round($iMinutes / 60)
), round($iMinutes / 60));
}
else if ($iMinutes >= 1440 && $iMinutes < 10080)
{
$sSubject = $this->i18n('REMINDERS/SUBJECT_DAYS_PLURAL', $oAccount, array(
'EVENT_NAME' => $sEventName,
'DATE' => $sDate,
'COUNT' => round($iMinutes / 1440)
), round($iMinutes / 1440));
}
else if ($iMinutes >= 10080)
{
$sSubject = $this->i18n('REMINDERS/SUBJECT_WEEKS_PLURAL', $oAccount, array(
'EVENT_NAME' => $sEventName,
'DATE' => $sDate,
'COUNT' => round($iMinutes / 10080)
), round($iMinutes / 10080));
}
else
{
$sSubject = $this->i18n('REMINDERS/SUBJECT', $oAccount, array(
'EVENT_NAME' => $sEventName,
'DATE' => $sDate
));
}
return $sSubject;
}
private function getDateTimeFormat($oAccount)
{
$sDateFormat = 'm/d/Y';
$sTimeFormat = 'h:i A';
if ($oAccount->User->DefaultDateFormat === EDateFormat::DDMMYYYY)
{
$sDateFormat = 'd/m/Y';
}
else if ($oAccount->User->DefaultDateFormat === EDateFormat::DD_MONTH_YYYY)
{
$sDateFormat = 'd m Y';
}
if ($oAccount->User->DefaultTimeFormat == ETimeFormat::F24)
{
$sTimeFormat = 'H:i';
}
return $sDateFormat.' '.$sTimeFormat;
}
public function GetReminders($iStart, $iEnd)
{
$aReminders = $this->oApiCalendarManager->GetReminders($iStart, $iEnd);
$aEvents = array();
if ($aReminders && is_array($aReminders) && count($aReminders) > 0)
{
$aCacheEvents = array();
foreach($aReminders as $aReminder)
{
$oAccount = $this->getAccount($aReminder['user']);
$sCalendarUri = $aReminder['calendaruri'];
$sEventId = $aReminder['eventid'];
$iStartTime = $aReminder['starttime'];
if (!isset($aCacheEvents[$sEventId]) && isset($oAccount))
{
$aCacheEvents[$sEventId]['data'] = $this->oApiCalendarManager->GetEvent($oAccount, $sCalendarUri, $sEventId);
$dt = new \DateTime();
$dt->setTimestamp($iStartTime);
$sDefaultTimeZone = new \DateTimeZone($oAccount->GetDefaultStrTimeZone());
$dt->setTimezone($sDefaultTimeZone);
$aCacheEvents[$sEventId]['time'] = $dt->format($this->getDateTimeFormat($oAccount));
}
if (isset($aCacheEvents[$sEventId]))
{
$aEvents[$aReminder['user']][$sCalendarUri][$sEventId] = $aCacheEvents[$sEventId];
}
}
}
return $aEvents;
}
public function Execute()
{
CApi::Log('---------- Start cron script', ELogLevel::Full, 'cron-');
$oTimeZoneUTC = new \DateTimeZone('UTC');
$oNowDT_UTC = new \DateTime('now', $oTimeZoneUTC);
$iNowTS_UTC = $oNowDT_UTC->getTimestamp();
$oStartDT_UTC = clone $oNowDT_UTC;
$oStartDT_UTC->sub(new DateInterval('PT30M'));
if (file_exists($this->sCurRunFilePath))
{
$handle = fopen($this->sCurRunFilePath, 'r');
$sCurRunFileTS = fread($handle, 10);
if (!empty($sCurRunFileTS) && is_numeric($sCurRunFileTS))
{
$oStartDT_UTC = new \DateTime("@$sCurRunFileTS");
}
}
$iStartTS_UTC = $oStartDT_UTC->getTimestamp();
if ($iNowTS_UTC >= $iStartTS_UTC)
{
CApi::Log('Start time: '.$oStartDT_UTC->format('r'), ELogLevel::Full, 'cron-');
CApi::Log('End time: '.$oNowDT_UTC->format('r'), ELogLevel::Full, 'cron-');
$aEvents = $this->GetReminders($iStartTS_UTC, $iNowTS_UTC);
foreach ($aEvents as $sEmail => $aUserCalendars)
{
foreach ($aUserCalendars as $sCalendarUri => $aUserEvents)
{
foreach ($aUserEvents as $aUserEvent)
{
$aSubEvents = $aUserEvent['data'];
if (isset($aSubEvents, $aSubEvents['vcal']))
{
$vCal = $aSubEvents['vcal'];
foreach ($aSubEvents as $mKey => $aEvent)
{
if ($mKey !== 'vcal')
{
$oAccount = $this->getAccount($sEmail);
$oCalendar = $this->getCalendar($oAccount, $sCalendarUri);
if ($oCalendar)
{
$sEventId = $aEvent['uid'];
$sEventStart = $aEvent['start'];
$iEventStartTS = $aEvent['startTS'];
$sEventName = $aEvent['subject'];
$sEventText = $aEvent['description'];
$bAllDay = $aEvent['allDay'];
$sDate = $aUserEvent['time'];
$sSubject = $this->getSubject($oAccount, $sEventStart, $iEventStartTS, $sEventName, $sDate, $iNowTS_UTC, $bAllDay);
$aAccounts = array();
$aAccounts[] = $oAccount;
$aCalendarUsers = $this->oApiCalendarManager->GetCalendarUsers($oAccount, $oCalendar);
if (0 < count($aCalendarUsers))
{
foreach ($aCalendarUsers as $aCalendarUser)
{
$oCalendarAccount = $this->getAccount($aCalendarUser['email']);
if ($oCalendarAccount)
{
$aAccounts[] = $oCalendarAccount;
}
}
}
foreach ($aAccounts as $oAccountItem)
{
$bIsMessageSent = $this->sendMessage($oAccountItem, $sSubject, $sEventName, $sDate, $oCalendar->DisplayName, $sEventText, $oCalendar->Color);
if ($bIsMessageSent)
{
$this->oApiCalendarManager->UpdateReminder($oAccountItem->Email, $sCalendarUri, $sEventId, $vCal->serialize());
CApi::Log('Send reminder for event: \''.$sEventName.'\' started on \''.$sDate.'\' to \''.$oAccountItem->Email.'\'', \ELogLevel::Full, 'cron-');
}
else
{
CApi::Log('Send reminder for event: FAILED!', ELogLevel::Full, 'cron-');
}
}
}
else
{
CApi::Log('Calendar '.$sCalendarUri.' not found!', ELogLevel::Full, 'cron-');
}
}
}
}
}
}
}
file_put_contents($this->sCurRunFilePath, $iNowTS_UTC);
}
CApi::Log('---------- End cron script', ELogLevel::Full, 'cron-');
}
}
$iTimer = microtime(true);
\CReminder::NewInstance()->Execute();
CApi::Log('Cron execution time: '.(microtime(true) - $iTimer).' sec.', ELogLevel::Full, 'cron-');