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

时间:2015-10-22 20:28:02

标签: php silverstripe

我正在使用SilverStripe构建网站。

每次访问某个网页时,如何让SilverStripe发送电子邮件通知?在电子邮件中,我想说出用户的IP地址是什么。

1 个答案:

答案 0 :(得分:3)

我建议使用类似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?

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

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