ActivityModel::email PHP Method

email() public method

public email ( &$Activity, boolean $NoDelete = false ) : boolean
$Activity
$NoDelete boolean
return boolean
    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;
    }