当前位置: 首页 > 工具软件 > SmartWiki > 使用案例 >

smartWiki4 邮件发送

贺彬
2023-12-01

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

可选。规定位于返回值末尾的更多的熵。

  1. 如果 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

  1. port用于配置邮箱发送服务端口号,比如一般默认值是25,但如果设置SMTP使用SSL加密,该值为465。 
  2. MAIL_ENCRYPTION=SSL 
  3. encryption表示加密类型,可以设置为null表示不使用任何加密,也可以设置为tls(端口号为25)或ssl

转载于:https://www.cnblogs.com/keiweila/p/7989753.html

 类似资料: