public function email(&$Activity, $NoDelete = false)
{
if (is_numeric($Activity)) {
$ActivityID = $Activity;
$Activity = $this->getID($ActivityID);
} else {
$ActivityID = val('ActivityID', $Activity);
}
if (!$Activity) {
return false;
}
$Activity = (array) $Activity;
$User = Gdn::userModel()->getID($Activity['NotifyUserID'], DATASET_TYPE_ARRAY);
if (!$User) {
return false;
}
// Format the activity headline based on the user being emailed.
if (val('HeadlineFormat', $Activity)) {
$SessionUserID = Gdn::session()->UserID;
Gdn::session()->UserID = $User['UserID'];
$Activity['Headline'] = formatString($Activity['HeadlineFormat'], $Activity);
Gdn::session()->UserID = $SessionUserID;
} else {
if (!isset($Activity['ActivityGender'])) {
$AT = self::getActivityType($Activity['ActivityType']);
$Data = [$Activity];
self::joinUsers($Data);
$Activity = $Data[0];
$Activity['RouteCode'] = val('RouteCode', $AT);
$Activity['FullHeadline'] = val('FullHeadline', $AT);
$Activity['ProfileHeadline'] = val('ProfileHeadline', $AT);
}
$Activity['Headline'] = Gdn_Format::activityHeadline($Activity, '', $User['UserID']);
}
// Build the email to send.
$Email = new Gdn_Email();
$Email->subject(sprintf(t('[%1$s] %2$s'), c('Garden.Title'), Gdn_Format::plainText($Activity['Headline'])));
$Email->to($User);
$url = externalUrl(val('Route', $Activity) == '' ? '/' : val('Route', $Activity));
$emailTemplate = $Email->getEmailTemplate()->setButton($url, val('ActionText', $Activity, t('Check it out')))->setTitle(Gdn_Format::plainText(val('Headline', $Activity)));
if ($message = $this->getEmailMessage($Activity)) {
$emailTemplate->setMessage($message, true);
}
$Email->setEmailTemplate($emailTemplate);
// Fire an event for the notification.
$Notification = ['ActivityID' => $ActivityID, 'User' => $User, 'Email' => $Email, 'Route' => $Activity['Route'], 'Story' => $Activity['Story'], 'Headline' => $Activity['Headline'], 'Activity' => $Activity];
$this->EventArguments = $Notification;
$this->fireEvent('BeforeSendNotification');
// Send the email.
try {
// Only send if the user is not banned
if (!val('Banned', $User)) {
$Email->send();
$Emailed = self::SENT_OK;
} else {
$Emailed = self::SENT_SKIPPED;
}
// Delete the activity now that it has been emailed.
if (!$NoDelete && !$Activity['Notified']) {
if (val('ActivityID', $Activity)) {
$this->delete($Activity['ActivityID']);
} else {
$Activity['_Delete'] = true;
}
}
} catch (phpmailerException $pex) {
if ($pex->getCode() == PHPMailer::STOP_CRITICAL && !$Email->PhpMailer->isServerError($pex)) {
$Emailed = self::SENT_FAIL;
} else {
$Emailed = self::SENT_ERROR;
}
} catch (Exception $ex) {
switch ($ex->getCode()) {
case Gdn_Email::ERR_SKIPPED:
$Emailed = self::SENT_SKIPPED;
break;
default:
$Emailed = self::SENT_FAIL;
// similar to http 5xx
}
}
$Activity['Emailed'] = $Emailed;
if ($ActivityID) {
// Save the emailed flag back to the activity.
$this->SQL->put('Activity', ['Emailed' => $Emailed], ['ActivityID' => $ActivityID]);
}
return true;
}