页面访问时的电子邮件通知 - SilverStripe

Email notification on page visit - SilverStripe

我正在使用 SilverStripe 构建网站。

如何让 SilverStripe 在有人访问页面时发送电子邮件通知?我希望在电子邮件中说明用户的 IP 地址。

我建议使用 Google Analytics 之类的工具,而不是发送电子邮件通知来跟踪有人何时访问您的页面。尽管 Google Analytics 不会跟踪用户的 IP 地址,但它会跟踪许多其他有用的信息,例如访问过的页面、用户来自哪里、用户的位置等等。

也就是说,这是每次访问页面时发送电子邮件的方法。以下代码适用于 SilverStripe 3.1 / 3.2。

以下是在访问任何页面时发送电子邮件的方法:

class Page_Controller extends ContentController {

    public function init() {
        parent::init();

        $to = 'to@example.com';
        $from = 'from@example.com'; 
        $subject = $this->Title . ' - page visit';
        $content = $_SERVER['REMOTE_ADDR'];

        $email = Email::create($from, $to, $subject, $content);
        $email->send();
    }

}

我们可以通过在页面中添加字段来控制要跟踪的页面以及向谁发送电子邮件来改进这一点。这将向每个页面的设置选项卡添加一个 SendTrackingEmail 复选框。启用跟踪后,它还会在内容选项卡中添加往返电子邮件地址文本字段。

class Page extends SiteTree {

    private static $db = array(
        'TrackingEmailTo' => 'Varchar(255)',
        'TrackingEmailFrom' => 'Varchar(255)',
        'SendTrackingEmail' => 'Boolean'
    );

    public function getSettingsFields() {
        $fields = parent::getSettingsFields();

        $fields->addFieldToTab('Root', CheckboxField::create('SendTrackingEmail', 'Send tracking email?'), 'ShowInMenus');

        return $fields;
    }

    public function getCMSFields() {
        $fields = parent::getCMSFields();

        if ($this->SendTrackingEmail) {
            $fields->addFieldToTab('Root.Tracking', TextField::create('TrackingEmailTo', 'Send tracking email to'));
            $fields->addFieldToTab('Root.Tracking', TextField::create('TrackingEmailFrom', 'Send tracking email from'));
        }

        return $fields;
    }

}

然后我们调整电子邮件代码以检查是否启用跟踪并使用设置的电子邮件地址。

class Page_Controller extends ContentController {

    public function init() {
        parent::init();

        if ($this->SendTrackingEmail) {

            $config = SiteConfig::current_site_config();

            $ipAddress = '';
            if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
                $ipAddress = $_SERVER['HTTP_CLIENT_IP'];
            } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
                $ipAddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
            } else {
                $ipAddress = $_SERVER['REMOTE_ADDR'];
            }

            $subject = $config->Title . ' - ' . $this->Title . ' - page visit';
            $content = '<p>Page visited: ' . $this->Title . '</p>';
            $content .= '<p>IP Address: ' . $ipAddress . '</p>';

            $email = Email::create($this->TrackingEmailFrom, $this->TrackingEmailTo, $subject, $content);
            $email->send();
        }
    }

}

这也是使用获取用户 ip 地址的方法,如以下问题中所建议: How to get the client IP address in PHP?

我们可以做的另一项改进是在站点配置设置中存储进出电子邮件地址的跟踪,因此它们只存储在一个地方并在整个站点中使用。

我们也可以将这些数据保存到数据库中,而不是通过电子邮件发送。