首页 文章

注册cakephp后,电子邮件中的帐户激活链接

提问于
浏览
0

我正在使用cakephp 2.6 . 我需要在成功注册后在电子邮件中发送帐户激活链接,如果用户点击激活链接,那么我的数据库的状态字段将更新为1 .

我的电子邮件是正确的,但我不知道如何通过将lastinsertid作为电子邮件中的唯一标识符来发送电子邮件中的链接,并在点击后更新帐户 .

请帮我解决这个问题 .

function add() {       
        $this->layout = "layout_login";      
            $this->pageTitle = "Add Admin";
            $this->set("pageTitle", "Add Admin");      
        if (!empty($this->request->data)) {           
            $this->User->set($this->data['User']);
            $isValidated = $this->User->validates();
            if ($isValidated) {   
               // Generating UUID
                $this->data['User']['activation_key'] = $activation_key = String::uuid();
                $this->User->save($this->data, array('validate' => false)); 
                $this->Session->setFlash(__('Please check your email for account verification.')); 
                    $subject = "Account Activation link By Kaya Dispatch";                  

                    $to = trim($this->request->data['User']['email']);
                    $this->Email->sendAs = 'html';
                    $this->Email->from = 'luckybajpai87@gmail.com';
                    $this->Email->to = $to;
                    $this->Email->subject = $subject;   
                    $activationUrl = Router::url(['controller' => 'users', 'action' => 'activate/' . $activation_key ]);
                    $message = "Dear <span style='color:#666666'>" . $name . "</span>,

"; $message .= "Your account has been created successfully by Administrator.
"; $message .= "Please find the below details of your account:

"; $message .= "<b>Activate your account by clicking on the below url:</b>
"; $message .= "<a href='$activationUrl'>$activationUrl</a>

"; $message .= "
Thanks,
Support Team"; $this->Email->send($message); } } }

以下是我的帐户激活码

function activate($activation_key) {
        $userData = $this->User->find('first', array(
        'conditions' => array(
                'User.activation_key' => $activation_key,
                'User.status' => 0
        )
    ));
    if( !empty($userData)){
           if ($userData['User']['status'] == 0)
            {
                $activeStatus = 1;
            } 
    $status = $this->User->updateAll(array('User.status' => $activeStatus), array('User.id' => $id));
    if ($status)
            {   $this->Session->setFlash(__('Status updated successfully'));

            } else
            {   $this->Session->setFlash(__('Something went wrong, please try again.'));

            }
             $this->redirect(array('controller' => 'Users', 'action' => 'index'));

    }
}

1 回答

  • 1

    嗯,这是合乎逻辑的,我的意思是这完全取决于你想要怎么做 . 我正在写我的方式:)

    users 表中创建新列,即 activation_key ,并在将其插入表格之前进行设置 . 像这样:

    if ($isValidated) {
    
        $password = $this->data['User']['password'];
        $this->data['User']['password'] = md5($this->data['User']['password']);
    
        // Generating UUID
        $this->data['User']['activation_key'] = $activation_key = String::uuid();
    
    
        $this->User->save($this->data, array('validate' => false));               
        $this->Session->setFlash("<div class='success-message flash notice'>Admin has been created successfully.</div>");
        $subject = "Account Activation link send on your email";
        $name = $this->request->data['User']['fname'] . " " . $this->request->data['User']['lname'];
        $to = trim($this->request->data['User']['email']);
        $this->Email->sendAs = 'html';
        $this->Email->from = 'luckybajpai87@gmail.com';
        $this->Email->to = $to;
        $this->Email->subject = $subject;
    
        $activationUrl = Router::url(['controller' => 'users', 'action' => 'activate/' . $activation_key ]);
    
        // Always try to write clean code, so that you can read it :) :
    
        $message = "Dear <span style='color:#666666'>" . $name . "</span>,

    "; $message .= "Your account has been created successfully by Administrator.
    "; $message .= "Please find the below details of your account:

    "; $message .= "<b>First Name:</b> " . $this->data['User']['fname'] . "
    "; $message .= "<b>Last Name:</b> " . $this->data['User']['lname'] . ((!empty($this->data['User']['phone'])) ? "
    "; $message .= "<b>Phone:</b> " . $this->data['User']['phone'] : "") . "
    "; $message .= "<b>Address:</b> " . $this->data['User']['address1'] . " " . $this->data['User']['address2'] . "
    "; $message .= "<b>Email:</b> " . $this->data['User']['email'] . "
    "; $message .= "<b>Username:</b> " . $this->data['User']['username'] . "
    "; $message .= "<b>Password:</b> " . $password . "
    "; $message .= "<b>Activate your account by clicking on the below url:</b>
    "; $message .= "<a href='$activationUrl'>$activationUrl</a>

    "; $message .= "
    Thanks,
    Support Team"; $this->Email->send($message); }

    然后在你的 function activate($activation_key='') 中接收该激活密钥作为参数,并从这样的用户中找到:

    // Finding user data from users table on behalf of activation key
    // and Status should be 0 (deactivate). So that, a URL can be use only ONCE.
    $userData = $this->User->find('first', array(
            'conditions' => array(
                    'User.activation_key' => $activation_key,
                    'User.status' => 0
            )
        ));
    
    if( !empty($userData) ){
        // $userData as you have User's data update the status as 1 and set activation_key as empty "";
    }else{
        // So, you don't find any user, it is an invalid request.
    }
    

    有时,发生Cakephp不允许你更新$ this-> data,因为在这个例子中我们试图改变$ this-> data ['User'] ['password']和$ this-> data ['用户'] ['activation_key']值,因此您只需存储$ postData = $ this-> data,然后使用$ postData进行插入和进一步操作 . 更新:请确认/调试String :: uuid()是否正常工作,如果它不起作用,请尝试使用以下行来实现此目的:

    // Generating activation_key
    $this->data['User']['activation_key'] = $activation_key = time();
    

    谢谢!

相关问题