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

Php 页面访问的电子邮件通知-SilverStripe,php,silverstripe,Php,Silverstripe,我正在使用SilverStripe构建一个网站 如何使SilverStripe在每次有人访问页面时发送电子邮件通知?在电子邮件中,我希望它说明用户的IP地址。我建议使用谷歌分析之类的工具,而不是发送电子邮件通知来跟踪有人访问您的页面。虽然Google Analytics不会跟踪用户的IP地址,但它会跟踪许多其他有用的信息,如访问的页面、用户来自何处、用户的位置等等 也就是说,下面是如何在每次访问页面时发送电子邮件。以下代码适用于SilverStripe 3.1/3.2 以下是如何在访问任何页面时

我正在使用SilverStripe构建一个网站


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

我建议使用谷歌分析之类的工具,而不是发送电子邮件通知来跟踪有人访问您的页面。虽然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();
        }
    }

}
类页面\u控制器扩展ContentController{
公共函数init(){
父::init();
如果($this->SendTrackingEmail){
$config=SiteConfig::current_site_config();
$ipAddress='';
如果(!空($\u服务器['HTTP\u客户端\u IP'])){
$ipAddress=$\服务器['HTTP\客户端\ IP'];
}elseif(!empty($_服务器['HTTP\u X\u FORWARDED\u FOR'])){
$ipAddress=$\服务器['HTTP\u X\u FORWARDED\u FOR'];
}否则{
$ipAddress=$\u服务器['REMOTE\u ADDR'];
}
$subject=$config->Title.'-'.$this->Title.'-页面访问';
$content='已访问页面:'.$this->Title'

; $content.='IP地址:'.$ipAddress.

'; $email=email::create($this->TrackingEmailFrom,$this->TrackingEmailTo,$subject,$content); $email->send(); } } }
这也是使用以下问题中建议的获取用户ip地址的方法:

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


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

Hi Maciej。您是否有任何代码可以共享以显示您迄今为止所尝试的内容?你有没有被困在什么地方?如果实施的话,会有很多潜在的问题。如果有很多人访问该网站,许多电子邮件将被发送到电子邮件服务器可能被列入黑名单,因为它表面上发送的可能是垃圾邮件。我建议如果你确定你想要访问你网站上任何页面的每个人的IP地址,你可以用日期/时间和URL登录数据库,每天给自己发送一封摘要电子邮件。谢谢你的帮助-我今天将尝试使用代码,并将结果发布在这里。为了解释我需要它的某些网页,因为我想有一种网络演示平台,向客户展示网站的外观(设计)。因此,它不会被成千上万的人看到,只是要知道客户是否看到了设计。(还有多少人看过这个项目)3dgoo你的解决方案是开箱即用的——这就是我想要的。非常感谢你。