Skip to content

Commit

Permalink
增加smtp设置,以及找回密码功能。
Browse files Browse the repository at this point in the history
  • Loading branch information
startbbs committed Apr 26, 2018
1 parent 83ed8ad commit 668e107
Show file tree
Hide file tree
Showing 10 changed files with 318 additions and 7 deletions.
20 changes: 20 additions & 0 deletions app/common.php
Original file line number Diff line number Diff line change
Expand Up @@ -365,4 +365,24 @@ function get_group_name($id)
$result[$val['id']] = $val['title'];
}
return $result[$id];
}

function send_mail($email, $title, $content)
{
//$issmtp=config('mail.smtp_is');
$email_set = array(
'host' => config('mail.smtp_host'),
'port' => config('mail.smtp_port'),
'user' => config('mail.smtp_user'),
'pswd' => config('mail.smtp_pswd'),
);
$mail = array(
'from' => config('mail.smtp_user'),
'to' => $email,
'title' => $title,
'content' => $content,
);
$res = new \mail\Smtp($email_set);
$result= $res->sendmail($mail);
return $result;
}
74 changes: 74 additions & 0 deletions app/index/controller/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -219,4 +219,78 @@ public function update($id)
}
}

/**
* 忘记密码
* @param string $
* @return
*/
public function forget()
{
is_login() && $this->error('已经登录', '/');
if ($this->request->isPost()) {
$data = $this->request->only(['email']);
$validate_result = $this->validate($data, 'User.forget');
if ($validate_result !== true) {
$this->error($validate_result);
}
$user = $this->user_model->where('email',$data['email'])->field('id,password')->find();

if(!$user){
$this->error('用户不存在!');
}
$title = '找回密码提示';
$key = base64_encode($user['id'].'.'.md5($user['password']));
$content = '尊敬的用户您好:<br />您在'.date("Y-m-d h:i:sa").'使用了找回密码功能,请点击下面的链接完成密码找回流程,如果无法正确打开页面,请将完整地址复制到浏览器地址栏。<br /><br />http://'.$_SERVER['HTTP_HOST'].'/user/resetpwd?key='.$key;
$result= send_mail($data['email'], $title, $content);
if($result){
$this->success('发送邮件成功');
} else {
$this->error('发送失败!');
}
}else {
$this->assign('title', '找回密码');
return $this->fetch();
}

}

/**
* 重置密码
* @param string $
* @return
*/
public function resetpwd()
{
is_login() && $this->error('已经登录', '/');
if(input('?get.key')){
$key = base64_decode($this->request->get('key'));
$key_arr = explode('.',$key);
$password = $this->user_model->where('id',$key_arr[0])->value('password');
if(md5($password)==$key_arr[1]){
Session::set('verify',$key_arr[0]);
}else{
$this->error('重置验证码不正确!','user/forget');
}
}
if(!Session::has('verify')){
$this->error('重置验证码不存在','user/forget');
}
if($this->request->isPost()){
$data = $this->request->only(['password','confirm_password']);
$validate_result = $this->validate($data, 'User.resetpwd');
if ($validate_result !== true) {
$this->error($validate_result);
} else {
$data['password'] = password_hash($data['password'], PASSWORD_DEFAULT);
if($this->user_model->allowField(true)->save($data,['id' => Session::get('verify')])){
$this->success('密码重置成功','user/login');
} else {
$this->error('重置失败');
}
}
}
$this->assign('title', '密码重置');
return $this->fetch();
}

}
9 changes: 9 additions & 0 deletions app/index/validate/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,15 @@ public function sceneSet_pass()
{
return $this->only(['old_password','password','confirm_password']);
}
public function sceneForget()
{
return $this->only(['email'])
->remove('email', 'unique');
}
public function sceneResetpwd()
{
return $this->only(['password','confirm_password']);
}

protected function check_password($value, $rule){
$user_id=Session::get('user_id');
Expand Down
1 change: 1 addition & 0 deletions config/system.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
//'upload' =>'上传',
//'develop' =>'开发',
//'databases' =>'数据库',
'mail' =>'邮件',
],
'group_type' => ['input','textarea','array','switch','select','radio','checkbox','image','file'],
];
141 changes: 141 additions & 0 deletions extend/mail/Smtp.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
<?php
/*
* @smtp.php
* Copyright (c)2013-2018 StartBBS.com
*/
namespace Mail;
class Smtp
{
private $fp;
public $error;
public $host;
public $port = 25;
public $user;
public $pswd;
public $cmd;

public function __construct($setting = array())
{
$this->set($setting);
}

public function set($setting)
{
$setting['host'] && $this->host = $setting['host'];
$setting['port'] && $this->port = $setting['port'];
$setting['user'] && $this->user = $setting['user'];
$setting['pswd'] && $this->pswd = $setting['pswd'];
return $this;
}

public function check($mail)
{
if(!$this->host || !$this->port || !$this->user || !$this->pswd){
$this->error = 'unsetting';
return -1;
}
if(!$mail['from'] || !$mail['to'] || !$mail['title'] || !$mail['content']){
$this->error = 'unconfig';
return 0;
}
return 1;
}

public function sendmail(array $mail)
{
!$mail['from'] && $mail['from'] = $this->user;
$status = $this->check($mail);
if($status != 1){
return false;
}
//connect
if($this->connect() != 220){
return false;
}
if($this->cmd('EHLO '.$this->host) != 250){
return false;
}
//auth
if($this->cmd('AUTH LOGIN') != 334){
return false;
}
if($this->cmd(base64_encode($this->user)) != 334){
return false;
}
if($this->cmd(base64_encode($this->pswd)) != 235){
return false;
}
//ready
if($this->cmd('MAIL FROM: <'.$mail['from'].'>') != 250){
return false;
}

$to = is_array($mail['to']) ? $mail['to'] : array($mail['to']);
foreach($to as $email){
$status = $this->cmd('RCPT TO: <'.$email.'>');
if(!in_array($status, array(250, 251))){
return false;
}
}

if($this->cmd('DATA') != 354){
return false;
}
//send
$title = str_replace("\r\n.\r\n", ".", $mail['title']);
$content = str_replace("\r\n.\r\n", ".", $mail['content']);
$body = "Date: ".date('r')."\r\n";
$body .= "Return-Path: ".$mail['from']."\r\n";
$body .= "From: ".$this->user."<".$mail['from'].">\r\n";
$body .= "Reply-to: ".$this->user."<".$mail['from'].">\r\n";
foreach($to as $email){
$body .= "To: <".$email.">\r\n";
}
$body .= "Subject: =?UTF-8?B?".base64_encode($title)."?=\r\n";
$body .= "Message-ID: <".base64_encode($this->user)."@".$this->host.">\r\n";
$body .= "X-Priority: 3\r\n";
$body .= "X-Has-Attach: no\r\n";
$body .= "X-Mailer: PHP\r\n";
$body .= "Mime-Version: 1.0\r\n";
$body .= "Content-Type: text/html; charset=utf-8;\r\n";
$body .= "\r\n";
$body .= "$content";
$body .= "\r\n.";
if($this->cmd($body) != 250){
return false;
}
$this->cmd('QUIT');
$this->close();
return true;
}

private function connect()
{
$this->fp = fsockopen($this->host, $this->port, $errno, $errstr, 10);
if(!$this->fp){
$this->error = $errno;
return false;
}
stream_set_timeout($this->fp, 30);
return $this->getstatus();
}

private function close()
{
@fclose($this->fp);
}

private function cmd($cmd)
{
$this->cmd .= "$cmd\r\n";
fwrite($this->fp, "$cmd\r\n");
return $this->getstatus();
}

private function getstatus()
{
$res = fread($this->fp, 1024);
$this->error = $res;
return intval(substr($res, 0, 3));
}
}
1 change: 1 addition & 0 deletions public/static/common/js/editor/css/simditor.css
Original file line number Diff line number Diff line change
Expand Up @@ -588,6 +588,7 @@
color: #333;
outline: none;
word-wrap: break-word;
min-height:200px;
}
.simditor .simditor-body > :first-child, .editor-style > :first-child {
margin-top: 0 !important;
Expand Down
10 changes: 5 additions & 5 deletions themes/default/topic/detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,9 @@ <h1>{$topic['title']}</h1>
<div class="detail-body jieda-body photos">
{$vo.content|raw}
</div>
<div class="jieda-reply">
{if condition="has_permission($vo.uid,1)"}
<div class="layui-row">
<div class="layui-col-md1 layui-col-md-offset11">
<!--<span class="jieda-zan zanok" type="zan">
<i class="iconfont icon-zan"></i>
<em>66</em>
Expand All @@ -108,14 +110,12 @@ <h1>{$topic['title']}</h1>
<i class="iconfont icon-svgmoban53"></i>
回复
</span>-->
{if condition="has_permission($vo.uid,1)"}
<div class="jieda-admin">
<span type="edit"><a href="{:url('post/edit',['id'=>$vo['id']])}">编辑</a></span>
<span type="del"><a href="{:url('post/delete',['id'=>$vo['id']])}" class="ajax-delete">删除</a></span>
<!-- <span class="jieda-accept" type="accept">采纳</span> -->
</div>
</div>
</div>
{/if}
</div>
</li>
{/volist}
<!-- 无数据时 -->
Expand Down
29 changes: 29 additions & 0 deletions themes/default/user/forget.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{extend name="common:base" /}
{block name="body"}
<div class="layui-container fly-marginTop">
<div class="fly-panel fly-panel-user" pad20>
<div class="layui-tab layui-tab-brief">
<ul class="layui-tab-title">
<li class="layui-this">找回密码</li>
</ul>
<div class="layui-form layui-tab-content" style="padding: 20px 0;">
<div class="layui-tab-item layui-show">
<div class="layui-form layui-form-pane">
<form class="layui-form login-form" action="{:url('user/forget')}" method="post">
<div class="layui-form-item">
<label class="layui-form-label">邮箱</label>
<div class="layui-input-inline">
<input type="text" name="email" required lay-verify="required|email" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>发送</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
{/block}
4 changes: 2 additions & 2 deletions themes/default/user/login.html
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@
</div>
<div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>登 录</button>
<!--<span style="padding-left:20px;">
<span style="padding-left:20px;">
<a href="{:url('User/forget')}">忘记密码?</a>
</span>-->
</span>
</div>
<!--<div class="layui-form-item fly-form-app">
<span>或者使用社交账号登入</span>
Expand Down
36 changes: 36 additions & 0 deletions themes/default/user/resetpwd.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{extend name="common:base" /}
{block name="body"}
<div class="layui-container fly-marginTop">
<div class="fly-panel fly-panel-user" pad20>
<div class="layui-tab layui-tab-brief">
<ul class="layui-tab-title">
<li class="layui-this">重置密码</li>
</ul>
<div class="layui-form layui-tab-content" style="padding: 20px 0;">
<div class="layui-tab-item layui-show">
<div class="layui-form layui-form-pane">
<form class="layui-form login-form" action="{:url('user/resetpwd')}" method="post">
<div class="layui-form-item">
<label class="layui-form-label">新密码</label>
<div class="layui-input-inline">
<input type="password" name="password" required lay-verify="required" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux">6到16个字符</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">确认密码</label>
<div class="layui-input-inline">
<input type="password" name="confirm_password" required lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>发送</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
{/block}

0 comments on commit 668e107

Please sign in to comment.