配置: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(); ?>