Laravel5.0+框架邮件发送功能实现方法图文与实例详解


Posted in PHP onApril 23, 2019

本文实例讲述了Laravel5.0+框架邮件发送功能实现方法。分享给大家供大家参考,具体如下:

I. 背景

  • 近期在接触传说中最优雅的 PHP 框架——Laravel,学习了一下邮件发送功能,在此分享一下
  • 测试环境:Laravel 5.2.45,Laravel 5.5
  • 使用协议:SMTP 邮件传输协议
  • 对于 ThinkPHP 框架框架的邮件发送可参考文章 ThinkPHP 框架下邮件发送功能

II. 功能开发过程

  • 此处以 网易(163.com)邮箱为例。

一、前期准备

(1).首先对 SMTP 的知识稍作了解

Laravel5.0+框架邮件发送功能实现方法图文与实例详解

(2).开启邮箱 SMTP 服务

  • 以 163.com 邮箱为例,点击上方导航栏的“设置”,选择“POP3/SMTP/IMAP”进行下面的设置,着重记下服务器地址(SMTP 服务器:smtp.163.com

Laravel5.0+框架邮件发送功能实现方法图文与实例详解

  • 然后点击“客户端授权密码”进行权限设置,一般会进行短信的验证,并记录下自己设定的授权登录密码,后面的代码中需要用到。

Laravel5.0+框架邮件发送功能实现方法图文与实例详解

二、代码实现

(1).修改配置文件 mail.php

  • 文件位置位于 config/mail.php
  • 修改其中的 “from” 信息,以本人为例,address 为发送方邮箱账号,name 为称谓
'from' => ['address' => '1xxxxxxx@163.com', 'name' => '逗比2号'],

(2).修改配置文件 .env

MAIL_DRIVER=smtp
MAIL_HOST=smtp.163.com
MAIL_PORT=25
MAIL_USERNAME=1xxxxxxx@163.com
MAIL_PASSWORD=xxxxx
MAIL_ENCRYPTION=null
  • 注意配置信息的填写:MAIL_USERNAME,MAIL_PASSWORD 为前期准备中记下的163邮箱账号及客户端授权密码(非登录密码)

  • MAIL_PORT 为默认端口号,如果配置 MAIL_ENCRYPTION = ssl 时,端口号需要更改为 465

(3).补充路由信息

Route::any('mail', 'TestController@mail');

(4).控制器代码编写

  • 基本的代码编辑如下
  • 注意,本人发现网上的介绍有出入,有的是使用 Mail 类,推测应该是版本不同的原因,此处针对 5.2.45、5.5 版本进行的测试
  • 附录 TestController.php 源代码以供参考
<?php
namespace App\Http\Controllers;
use Illuminate\Mail\Mailer;

class TestController extends Controller
{
 private $mailer;

 public function __construct(Mailer $mailer)
 {
  $this->mailer = $mailer;
 }
 /**
  * 发送邮件
  */
 public function mail(){
  //测试数据
  $viewData = ['title' => '你若盛开,清风自来','author' => '木心'];
  $emailData = [
   'content' => '从前的日色变得慢 车 马 邮件 都慢',
   'subject' => '这是邮件主题,希望您能支持!',//邮件主题
   'addr' => 'xxxxxxxxx@qq.com',//邮件接收地址
  ];
  $this->sendText($emailData);
  //$this->sendHtml('mail',$viewData,$emailData);
  //TODO $tag 判断发送是否成功,进行后续代码开发
  return view('mail',['title' => '你若盛开,清风自来','author' => '木心']);
 }

 /**
  * 发送纯文本 邮件
  * @param $emailData 邮件数据
  */
 public function sendText($emailData){
  //此处为文本内容
  $tag = $this->mailer
   ->raw($emailData['content'],
    function ($message)use ($emailData){
     $message->subject($emailData['subject']);
     $message->to($emailData['addr']);
    });
  return $tag;
 }
 /**
  * 发送自定义网页
  * @param $emailData 邮件数据
  * @param $viewPage html视图
  * @param $viewData html传输数据
  */
 public function sendHtml($viewPage,$viewData,$emailData){
  $tag = $this->mailer
   ->send($viewPage,$viewData,
    function ($message) use ($emailData){
     $message->subject($emailData['subject']);
     $message->to($emailData['addr']);
    });
  return $tag;
 }
}

三、 代码说明

(1).方法 sendText()

  • 此方法为发送纯文本邮件的功能实现,调用此方法发送的邮件截图如下:

Laravel5.0+框架邮件发送功能实现方法图文与实例详解

Laravel5.0+框架邮件发送功能实现方法图文与实例详解

(2).方法 sendHtml()

  • 此方法为自定义格式邮件发送的功能实现
  • 实现的前提需要有设计界面,代码中举例为我简单设计的 mail.blade.php 参考代码如下:
<html>
<style>
 *{
  font-family: 楷体;
 }
</style>
<h2>{{$title}}</h2>
![]({{asset('uploads/20170902/59aa05723e35d.jpg')}})
<pre>
  从前的日色
  变得慢
  车 马 邮件
   都慢
 一生只够爱一个人
    --{{$author}}
</pre>
</html>
  • 调用此方法发送的邮件截图如下:

Laravel5.0+框架邮件发送功能实现方法图文与实例详解

Laravel5.0+框架邮件发送功能实现方法图文与实例详解

III. 补充

(1).另一种简单写法

  • 其实可提供一种更简单的写法,与上面所处理的 raw(),send() 方法类似,举例:
use Illuminate\Support\Facades\Mail;

$tag = Mail::raw('你好,我们已经准备好了',function ($message){
   $message->to('9xxxxxxxxxx@qq.com');
  });
  • 不过,测试发现会有如下报错:

FatalErrorException in ClassLoader.php line 373:Maximum function nesting level of '100' reached, aborting!

  • 但是前面的第一种代码方案,不会出现此问题,并且邮件发送响应快一些(或许错觉),然而,此代码如果放在队列中执行,测试发现不做任何修改也是可以实现…

  • 原因和解决方案,请参考文章 - PHP中的函数嵌套层数限制

(2).554 邮件发送报错

  • 有时邮件发送时,会有如下报错,例如 554 多表示邮件发送过多被系统禁止了,具体信息可通过提示信息中的网址进行查询.

Laravel5.0+框架邮件发送功能实现方法图文与实例详解

Laravel5.0+框架邮件发送功能实现方法图文与实例详解

  • 具体代码可自行优化,有问题建议多多谷歌,还是能帮到不少忙的.

(3). post 请求500报错

  • 注意一点:laravel框架默认要求表单提交时需要添加
{{ csrf_field() }}

附:PHP中的函数嵌套层数限制

访问PHP网站如下以下错误:

 Fatal error: Maximum function nesting level of '100' reached, aborting!

原因分析:

这个问题是由于你启用了xdebug,而xdebug默认设置了函数最大嵌套数为100

解决办法:

找到php.ini文件,找到xdebug
在最后加上xdebug.max_nesting_level = 500 (这个数最好大于100即可)

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php 执行系统命令的方法
Jul 07 PHP
PHP 各种排序算法实现代码
Aug 20 PHP
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
Jul 31 PHP
php常用的安全过滤函数集锦
Oct 09 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
Apr 07 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
Sep 09 PHP
thinkPHP的表达式查询用法详解
Sep 14 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
Apr 01 PHP
PHP批量删除jQuery操作
Jul 23 PHP
[原创]php token使用与验证示例【测试可用】
Aug 30 PHP
利用php + Laravel如何实现部署自动化详解
Oct 11 PHP
php二维数组按某个键值排序的实例讲解
Feb 15 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
Apr 23 #PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
Apr 23 #PHP
PHP信号处理机制的操作代码讲解
Apr 19 #PHP
CentOS7编译安装php7.1的教程详解
Apr 18 #PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
Apr 17 #PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
Apr 17 #PHP
Laravel5框架自定义错误页面配置操作示例
Apr 17 #PHP
You might like
将兴奋、喜悦和坎加斯带到戴安娜:亚马逊公主
2020/03/03 欧美动漫
德生9700DX电路分析
2021/03/02 无线电
PHP 进程锁定问题分析研究
2009/11/24 PHP
PHP分页效率终结版(推荐)
2013/07/01 PHP
php实现基于openssl的加密解密方法
2016/09/30 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
PHP后门隐藏的一些技巧总结
2020/11/04 PHP
超级兔子让浮动层消失的前因后果
2007/03/09 Javascript
javascript中数组的sort()方法的使用介绍
2013/12/18 Javascript
在Firefox下js select标签点击无法弹出
2014/03/06 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
vue组件的写法汇总
2018/04/12 Javascript
Openlayers实现点闪烁扩散效果
2020/09/24 Javascript
[04:38]完美世界携手游戏风云打造 卡尔工作室饰品系统篇
2013/04/25 DOTA
python的unittest测试类代码实例
2017/12/07 Python
python定向爬取淘宝商品价格
2018/02/27 Python
python+opencv实现霍夫变换检测直线
2020/10/23 Python
用python实现刷点击率的示例代码
2019/02/21 Python
Python 类属性与实例属性,类对象与实例对象用法分析
2019/09/20 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
2020/02/13 Python
html5弹跳球示例代码
2013/07/23 HTML / CSS
eBay荷兰购物网站:eBay.nl
2020/06/26 全球购物
投标诚信承诺书
2014/05/26 职场文书
大学军训自我鉴定大全
2014/09/18 职场文书
个人总结与自我评价2015
2015/03/11 职场文书
2015年汽车销售经理工作总结
2015/04/27 职场文书
初中思想品德教学反思
2016/02/24 职场文书
2016年校园社会综合治理宣传月活动总结
2016/03/16 职场文书
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL