1为什么
return$this->jsonResult(40105);
thrownewArgumentNullException('账号不能为空',40507);
2
if(strcmp($password,$confirm_password)!==0){
return$this->jsonResult(40104);
}
3
if(Member::where('account','=',$member->account)->exists()){
thrownewDataExistException('账号已存在',40513);
}
if(Member::where('email','=',$member->email)->exists()){
thrownewDataExistException('邮箱已存在',40509);
}
4
classDataExceptionextends\Exception 继承的是php的异常类
{
publicfunction__construct($message,$code,\Exception$previous=null)
{
parent::__construct($message,$code,$previous);
}
}
/**
*Constructtheexception.Note:ThemessageisNOTbinarysafe.
*@linkhttp://php.net/manual/en/exception.construct.php
*@paramstring$message[optional]TheExceptionmessagetothrow.
*@paramint$code[optional]TheExceptioncode.
*@paramThrowable$previous[optional]Thepreviousthrowableusedfortheexceptionchaining.
*@since5.1.0
*/
publicfunction__construct($message="",$code=0,Throwable$previous=null){}
*/
publicfunctiongetMessage();
publicfunctiongetCode();
5发送数量限制
$totalCount=Passwords::where('create_time','>=',date('Y-m-dH:i:s',time()-(int)wiki_config('MAIL_TOKEN_TIME',3600)))->count();
6随机生成
$key=md5(uniqid('find_password'));
uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID
prefix | 可选。为 ID 规定前缀。如果两个脚本恰好在相同的微秒生成 ID,该参数很有用。 |
more_entropy | 可选。规定位于返回值末尾的更多的熵。 |
- 如果 prefix 参数为空,则返回的字符串有 13 个字符串长。如果 more_entropy 参数设置为 true,则是 23 个字符串长
7跳转url
$url=route('account.modify_password',['key'=>$key]);
8
注意我们需要调用 use Mail 来引入邮件相关的操作方法。通过上面代码可以看到,我们把之前用户注册成功之后进行的登录操作:
publicfunctionqueue($view,array$data,$callback,$queue=null)
Mail::queue('emails模板.find_password',里面内容['url'=>$url],function($message)use($passwords)
{
//动作
$message->to($passwords->email)->subject('SmartWiki-找回密码!');
$passwords->send_time=date('Y-m-dH:i:s');
$passwords->save();
});
Mail::send($view, $data, function ($message) use ($from, $name, $to, $subject) { $message->from($from, $name)->to($to)->subject($subject); });
- 第一个参数是包含邮件消息的视图名称。
- 第二个参数是要传递给该视图的数据数组。
- 最后是一个用来接收邮件消息实例的闭眼包回调,我们可以在该回调中自定义邮件消息的发送者、接收者、邮件主题等信息。
- $from = 'aufree@yousails.com'; $name = 'Aufree'; $to = $user->email;
- session()->flash('success', '验证邮件已发送到你的注册邮箱上,请注意查收。');
9发送邮箱
MAIL_DRIVER=log测试发送 在stroage/logs/laravel.log
10配置
接下来其他的配置都好理解,host是邮箱所在主机,比如我们使用163邮箱,对应值是smtp.163.com,使用QQ邮箱的话,对应值是smtp.qq.com。
port用于配置邮箱发送服务端口号,比如一般默认值是25,但如果设置SMTP使用SSL加密,该值为465。
from配置项包含address和name,前者表示发送邮箱,后者表示发送邮件使用的用户名。
encryption表示加密类型,可以设置为null表示不使用任何加密,也可以设置为tls/ssl。
username表示邮箱账号,比如yaojinbu@163.com
password表示上述邮箱登录对应登录密码。
sendmail是在设置driver为sendmail时使用,用于指定sendmail命令路径
11细节上各种发送邮件
1更简单的纯文本邮件发送
Mail::raw('这是一封测试邮件', function ($message) {
$to = '1072155122@qq.com';
$message ->to($to)->subject('测试邮件');
});无需创建视图即可完成邮件发送
2发送带附件的邮件(中文乱码解决)
$flag = Mail::send('emails.test',['name'=>$name],function($message){
$to = '1072155122@qq.com';
$message->to($to)->subject('测试邮件');
$attachment = storage_path('app/files/test.doc');
//在邮件中上传附件
$message->attach($attachment,['as'=>'测试文档.doc']);
});
$message实例上的attach方法上传附件,该方法第一个参数是附件地址,第二个参数是一些额外参数,这里我们通过as指定附件在邮件中的显示名称
出现中文乱码,解决办法如下:
$message->attach($attachment,['as'=>"=?UTF-8?B?".base64_encode('测试文档')."?=.doc"])
3
发送带图片的邮件
Laravel为我们提供了便捷方法——在视图中使用$message上的embed方法:
{{$name}},这是一封测试邮件
<br>
<img src="{{$message->embed($imgPath)}}">
741074464@qq.com
$imgPath = 'http://laravelacademy.org/wp-statics/images/carousel/LaravelAcademy.jpg';链接
$flag = Mail::send('emails.test',['name'=>$name,'imgPath'=>$imgPath],function($message){
$to = '1072155122@qq.com';
$message->to($to)->subject('测试邮件');
});
图片发送2
embedData
此外还支持发送原生的图片数据到邮件中,即将本地图片读取到内存然后渲染到邮件视图,这可以通过$message上的embedData实现。
$image = Storage::get('images/test.jpg');不是链接即将本地图片读取到内存然后渲染到邮件视图,
$name = '学院君';,
$image = Storage::get('images/test.jpg');顶部加上use Storage
$flag = Mail::send('emails.test',['name'=>$name,'image'=>$image],function($message){
$to = '1072155122@qq.com';
$message->to($to)->subject('测试邮件');
});
然后修改邮件视图test.blade.php如下:
{{$name}},这是一封测试邮件
<br>
<img src="{{$message->embedData($image,'LaravelAcademy.jpg')}}">
12
/**
*显示处理结果
*@return\Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
publicfunctionprocessResult()
{
$data=session('processs.data');
if(empty($data)||!is_array($data)){
returnredirect(route('home.index'));
}
Session::forget('processs.data');
returnview('account.process_result',$data);
}
}
session(['processs.data'=>[
'message'=>"<p>密码重置链接已经发到您邮箱</p><p><a>{$email}</a></p><p>请登录您的邮箱并点击密码重置链接进行密码更改</p><p><b>还没收到确认邮件?</b>尝试到广告邮件、垃圾邮件目录里找找看</p>",
'title'=>'邮件发送成功'
]]);
这样啊
return$this->jsonResult(0,['url'=>route('account.process_result')]);
session()->flash('success', '验证邮件已发送到你的注册邮箱上,请注意查收。');
12实践
MAIL_DRIVER=smtp 1111
MAIL_HOST=smtp.163.com 222
MAIL_PORT=25 3333
MAIL_USERNAME=18552368312@163.com 44 密码
MAIL_TITLE
MAIL_PASSWORD=gujinrong1234555 密码
MAIL_ENCRYPTION=null666
- port用于配置邮箱发送服务端口号,比如一般默认值是25,但如果设置SMTP使用SSL加密,该值为465。
- MAIL_ENCRYPTION=SSL
- encryption表示加密类型,可以设置为null表示不使用任何加密,也可以设置为tls(端口号为25)或ssl