yii2邮箱修改密码

配置:web.php

'mailer' => [
            'class' => 'yiiswiftmailerMailer',
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => false,
            'transport' => [
                'class' => 'Swift_SmtpTransport',
                'host' => 'smtp.qq.com',
                'username' => 'maoriaty@foxmail.com',
                'password' => '*********', //授权码
                'port' => '465',
                'encryption' => 'ssl',
            ],
        ],

忘记密码:publicController.php

// 忘记密码
    public function actionSeekpassword()
    {
        $this->layout = false;
        $model = new Admin;
        if (Yii::$app->request->isPost) {
            $post = Yii::$app->request->post();
            if ($model->seekPass($post)) {
                Yii::$app->session->setFlash('info', '电子邮箱已经发送成功,请查收');
            }
        }
        return $this->render('seekpassword', ['model' => $model]);
    }

找回密码:admin.php

<?php
namespace appmodulesmodels;

use Yii;
use yiidbActiveRecord;

class Admin extends ActiveRecord
{
    public $rememberMe = true;
    public $repass;

    public static function tableName()
    {
        return "{{%admin}}";
    }

    public function rules()
    {
        return [
            ['adminuser', 'required', 'message' => '管理员账号不能为空', 'on' => ['login', 'seekpass', 'changepass']],
            ['adminpass', 'required', 'message' => '管理员密码不能为空', 'on' => ['login', 'changepass']],
            ['rememberMe', 'boolean', 'on' => 'login'],
            ['adminpass', 'validatePass', 'on' => 'login'],
            ['adminemail', 'required', 'message' => '电子邮箱不能为空', 'on' => 'seekpass'],
            ['adminemail', 'email', 'message' => '电子邮箱格式不正确', 'on' => 'seekpass'],
            ['adminemail', 'validateEmail', 'on' => 'seekpass'],
            ['repass', 'required', 'message' => '确认密码不能为空', 'on' => 'changepass'],
            ['repass', 'compare', 'compareAttribute' => 'adminpass', 'message' => '两次密码输入不一致', 'on' => 'changepass']
        ];
    }

    public function validatePass()
    {
        if (!$this->hasErrors()) {
            $res = self::find()->where('adminuser = :user and adminpass = :pass', [':user' => $this->adminuser, ':pass' => md5($this->adminpass)])->one();
            if (is_null($res)) {
                $this->addError('adminpass', '用户名或密码错误');
            }
        }
    }

    public function validateEmail()
    {
        if (!$this->hasErrors()) {
            $res = self::find()->where('adminuser = :user and adminemail = :email', [':user' => $this->adminuser, ':email' => $this->adminemail])->one();
            if (is_null($res)) {
                $this->addError('adminemail', '管理员电子邮箱不匹配');
            }
        }
    }

    // 登陆
    public function login($data)
    {
        $this->scenario = 'login';
        if ($this->load($data) && $this->validate()) {
            // 存入session
            $lifetime = $this->rememberMe ? 24*3600 : 0; // 过期时间
            $session = Yii::$app->session;
            session_set_cookie_params($lifetime);
            $session['admin'] = [
                'adminuser' => $this->adminuser,
                'isLogin' => 1
            ];
            $this->updateAll(['logintime' => time(), 'loginip' => ip2long(Yii::$app->request->userIP)], 'adminuser = :user', [':user' => $this->adminuser]);
            return (bool)$session['admin']['isLogin'];
        }
        return false;
    }

    // 找回密码
    public function seekPass($data)
    {
        $this->scenario = 'seekpass';
        if ($this->load($data) && $this->validate()) {
            // 发送电子邮箱
            $time = time();
            $token = $this->createToken($data['Admin']['adminuser'], $time);
            $mailer = Yii::$app->mailer->compose('seekpass', ['adminuser' => $data['Admin']['adminuser'], 'time' => $time, 'token' => $token]);
            $mailer->setFrom("maoriaty@foxmail.com");
            $mailer->setTo($data['Admin']['adminemail']);
            $mailer->setSubject("测试商城-找回密码");
            if ($mailer->send()) {
                return true;
            }
        }
        return false;
    }

    // 生成token
    public function createToken($adminuser, $time)
    {
        return md5(md5($adminuser).ase64_encode(Yii::$app->request->userIP).md5($time));
    }

    // 修改密码
    public function changePass($data)
    {
        $this->scenario = 'changepass';
        if ($this->load($data) && $this->validate()) {
            return (bool)$this->updateAll(['adminpass' => md5($this->adminpass)], 'adminuser = :user', [':user' => $this->adminuser]);
        }
        return false;
    }
}

发送内容:mail/seekpass.php

<p>尊敬的<?=$adminuser ?>, 您好:</p>

<p>您的找回密码链接如下:</p>

<?php $url = Yii::$app->urlManager->createAbsoluteUrl(['admin/manage/mailchangepass', 'timestamp' => $time, 'adminuser' => $adminuser, 'token' => $token]);  ?>
<p><a href="<?=$url?>"><?=$url?></a></p>

<p>该链接5分钟内有效,请勿传递给别人!</p>

<p>该邮件为系统自动发送,请勿回复!</p>

修改密码:

<?php
namespace appmodulescontrollers;

use Yii;
use yiiwebController;
use appmodulesmodelsAdmin;

class ManageController extends Controller
{
    public function actionMailchangepass()
    {
        $this->layout = false;
        $time = Yii::$app->request->get('timestamp');
        $adminuser = Yii::$app->request->get('adminuser');
        $token = Yii::$app->request->get('token');
        $model = new Admin;
        $myToken = $model->createToken($adminuser, $time);
        if ($token != $myToken) {
            $this->redirect(['public/login']);
            Yii::$app->end();
        }
        if (time()-$time > 300) {
            $this->redirect(['public/login']);
            Yii::$app->end();
        }
        if (Yii::$app->request->isPost) {
            $post = Yii::$app->request->post();
            if ($model->changePass($post)) {
                Yii::$app->session->setFlash('info', '密码修改成功');
            }
        }
        $model->adminuser = $adminuser;
        return $this->render('mailchangepass', ['model' => $model]);
    }
}

视图:mailchangepass.php

<?php $form = ActiveForm::begin([
                'fieldConfig' => [
                    'template' => '{input}{error}'
                ]
            ]); ?>
                <div class="span4 box">
                    <div class="content-wrap">
                        <h6>商城 - 修改密码</h6>
                        <?php 
                            if (Yii::$app->session->hasFlash('info')) {
                                echo Yii::$app->session->getFlash('info');
                            }
                        ?>
                        <?=$form->field($model, 'adminuser')->hiddenInput();?>
                        <?=$form->field($model, 'adminpass')->passwordInput(['class' => 'span12', 'placeholder' => '新密码'])?>
                        <?=$form->field($model, 'repass')->passwordInput(['class' => 'span12', 'placeholder' => '确认密码'])?>
                        <a href="<?=Url::to(['public/login']);?>" class="forgot">返回登陆</a>

                        <?=Html::submitButton('修改', ['class' => 'btn-glow primary login']);?>
                </div>
            <?php ActiveForm::end(); ?>
原文地址:https://www.cnblogs.com/maoriaty/p/9288863.html