配置:web.php
\'mailer\' => [ \'class\' => \'yii\swiftmailer\Mailer\', // 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 app\modules\models; use Yii; use yii\db\ActiveRecord; 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).\base64_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 app\modules\controllers; use Yii; use yii\web\Controller; use app\modules\models\Admin; 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(); ?>