laravel 发送邮件

laravel 发送邮件

 系统目前的通知使用了: 短信通知 微信模板消息通知 一直未使用 『邮件通知』,由于项目需要,得添加上这个功能,下面记录下此次从头开始经历的一些过程: 项目使用的是 laravel 5.2 首先,查看官方文档,官方文档是默认支持了 发送邮件 http://laravelacademy.org/post/3239.html  一定要多读几遍,好好理解它都提供了哪些内容,laravel 中发送邮件很简单: use Mail; Mail::send('emails.welcome', $data, function ($message) { // 'email.welcome' 支持解析了 blade 模板后,作为邮件内容。 '$data' 是 blade 模板分配的数据变量 $message->from('us@example.com', 'Laravel'); // 发件人 $message->to('foo@example.com')->cc('bar@example.com'); // 收件人 & 抄送人  }); Mail::send(['text' => 'view'], $data, $callback); // 支持 '纯文本邮件' Mail::raw('欢迎您!', $callback); // 支持 '原生字符串邮件'  支持 『附件』 支持 『邮件视图中插入附件 - html邮件格式的图片等』 支持 『邮件队列』 等等...,就不一一说明了,查看文档 关于邮件的配置,同一般服务配置一样,涉及: .env config/mail.php 关于 '驱动' laravel 的邮件服务支持多种 driver: "smtp", "mail", "sendmail", "mailgun", "mandrill", "ses", "log" log 是记录到 '日志' 里,供我们本地模拟测试,而不是真实发送邮件 mailgun, mandrill, ses 是一些第三方服务。 smpt, mail, sendmail 是我们自己可以通过配置,发送邮件的 之前自己真没有搞过邮件发送,自己都感觉有点不可思议,经常听说,但是就是没有测试过。正好通过这个机会稍微了解下。 邮件发送,是需要 '邮件服务器' 的。我们自己不搭建的话,只能借助第三方的邮件服务。 1.关注PHP中发送邮件,参考: http://www.php.cn/php-weizijiaocheng-381273.html 2.本地 laravel 使用 smtp 发送邮件,参考: https://www.jianshu.com/p/8ccb2820df23 3.163或126邮箱 开启 SMTP 服务: http://www.yii-china.com/post/detail/10.html 4.邮件服务端口: https://blog.csdn.net/zhangpan19910604/article/details/45065629 5.搭建邮件服务器(没搭建过,百度或google搜索一大堆): https://www.jianshu.com/p/610d9bf0ae8b https://bfchengnuo.com/2017/03/21/%E7%94%A8Centos%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E9%82%AE%E4%BB%B6%E7%B3%BB%E7%BB%9F/ 6.邮件的参数: /* $message->from($address, $name = null); $message->sender($address, $name = null); $message->to($address, $name = null); $message->cc($address, $name = null); $message->bcc($address, $name = null); $message->replyTo($address, $name = null); $message->subject($subject); $message->priority($level); $message->attach($pathToFile, array $options = []); // 从$data字符串追加文件... $message->attachData($data, $name, array $options = []); // 获取底层SwiftMailer消息实例... $message->getSwiftMessage(); */ 发现文档中,邮件的一些参数,完全不明白是啥意思,就想找找邮件参数里的解释,看了点 laravel 源码,了解到使用的是: swiftmailer 查看 swiftmailer 文档,里面有一些见解,当然更多的、具体的内容,我们可以自己展开搜索: https://swiftmailer.symfony.com/docs/messages.html  看过文档之后,简单了解了下 邮件发送 的一些基础知识,我们按照上面的 '2' 参考教程,配置后,可以正常发送邮件了。 但考虑到,是不是通过这种情况(或 免费的服务),不专业啊?会不会效率很慢等等,想到是不是应该使用一个第三方服务。 就直接搜索 "阿里云",果然有 "邮件服务",就开启使用。 阿里云 - 邮件推送文档: https://help.aliyun.com/product/29412.html  这里得吐槽下,开启 "邮件服务" 我是搞了半天,半天不懂一堆域名啥是干嘛的! "设置发信域名",不明白的是,发送邮件为什么还需要域名,域名只有一个,因为怕影响线上的业务,和客服沟通了大半天,才敢尝试。 直接按这个 '域名配置相关问题',一步步执行即可。 https://help.aliyun.com/document_detail/57804.html  又开始看 '阿里云-发送邮件文档',对于一个全新的东西,得好好了解... 阿里云发送邮件,支持3种方式: 1.控制台发送批量邮件。 2.API 发送触发邮件和批量邮件。 3.SMTP 发送触发邮件和批量邮件。 2 和 3,都是程序实现 API 接口 - 目前暂不支持添加附件 SMTP 接口 - 支持附件 我搜索下 laravel 的 阿里云邮件服务的包,使用的是 'API' 接口方式(因为当时还没总结,搜索到的包就是 API 接口方式,当时都还不知道有 SMTP 接口),这里就先总结下这个包的使用: github地址: https://github.com/HyanCat/aliyun-direct-mail  这里提一个参数:region - 区域 hyancat/aliyun-direct-mail/lib/aliyun-php-sdk-core/Regions/EndpointConfig.php 里是所有可以填写的 region(不清楚用处是干嘛的...) 另外,可能是版本的问题,我修改了下源码: hyancat/aliyun-direct-mail/src/DirectMailTransport.php 1.将 'Swift_Mime_SimpleMessage' 类,改为:'Swift_Mime_Message' 2.修改 sendSingle() 方法,适合我们的返回方式: protected function sendSingle(\Swift_Mime_Message $message) { $request = new DM\SingleSendMailRequest(); // 控制台创建的发信地址 $request->setAccountName($this->accountName); // 发信人昵称,长度小于 15 个字符 $request->setFromAlias($this->accountAlias); // 取值范围 0~1: 0 为随机账号;1 为发信地址(参考阿里邮箱文档) $request->setAddressType(1); // 使用管理控制台中配置的回信地址(状态必须是验证通过)(参考阿里邮箱文档) $request->setReplyToAddress('true'); // 目标地址,多个 email 地址可以用逗号分隔,最多100个地址(参考阿里邮箱文档) $request->setToAddress($this->getToAddress($message)); // 邮件主题 $request->setSubject($message->getSubject()); // 邮件HTML正文 $request->setHtmlBody($message->getBody()); try { $response = $this->createClient()->getAcsResponse($request); return error(0, '发送邮件成功!', (Array) $response); } catch (\ClientException $e) { return error(1, $e->getErrorMessage()); } catch (\ServerException $e) { return error(1, $e->getErrorMessage()); } catch (\Exception $e) { return error(1, $e->getMessage()); } catch (\Throwable $e) { return error(1, $e->getMessage()); } } 测试过程中,出现了好多白痴问题: 1.composer require 安装时,composer 一直报错! 可能问题: .env 文件错误 config/services.php 当时语法错误 composer self-update composer自身版本落后 2.配置不生效问题: 可能开启了 config 缓存,当时不小心,执行了下命令 php artisan config:cache 或 php artisan config:clear 3.关于 .env 环境变量配置: # HyanCat 阿里邮箱推送配置 #DIRECT_MAIL_APP_KEY=null #DIRECT_MAIL_APP_SECRET=null #DIRECT_MAIL_REGION=null #DIRECT_MAIL_ACCOUNT_ALIAS=null #DIRECT_MAIL_ACCOUNT_NAME=null  env('配置项', '默认值') 函数,我一直的一个误区!一直以为不写 或者 为null,会使用默认值!发现并不生效! DIRECT_MAIL_APP_KEY= // 不填写值 DIRECT_MAIL_APP_KEY=null // 填写为null  我们来解析下 env() 源码 function env($key, $default = null) { $value = getenv($key); // getenv() 函数,下面详细解释下 if ($value === false) { return value($default); } switch (strtolower($value)) { case 'true': case '(true)': return true; case 'false': case '(false)': return false; case 'empty': case '(empty)': return ''; case 'null': case '(null)': return; } if (strlen($value) > 1 && Str::startsWith($value, '"') && Str::endsWith($value, '"')) { return substr($value, 1, -1); } return $value; } 环境变量的范围,参照:http://www.faqs.org/rfcs/rfc3875.html getenv($key) 返回环境变量 varname 的值, 如果环境变量 varname 不存在则返回 FALSE。 所以: DIRECT_MAIL_APP_KEY= // 不填写值,getenv() 返回的是 '' DIRECT_MAIL_APP_KEY=null // 填写为null,getenv() 返回的是 null # DIRECT_MAIL_APP_KEY= // 只有不存在时,getenv() 返回的才是 false 而我们的 env() 函数,会判断 "$value === false",才会使用 '默认值',所以要保证使用默认值,我们不可以添加该变量变量(或注释掉) 关于 阿里云的 SMPT API,应该是同其他的(163/126/qq邮箱的) SMTP 服务一样,我们已经开启了,laravel 默认也支持,我们直接使用即可! 参考: https://help.aliyun.com/knowledge_detail/51622.html  这里我进行测试了,没有问题! 唯一需要注意的是: 认证用户名是:控制台创建的发信地址(调试邮箱时各种问题,这个也是个坑) 发送邮件,会阻塞程序进行,为了优化,我们应该采用 laravel 邮件服务的 queue 方法,使用队列!(猜测应该是这样)

https://blog.csdn.net/beyond__devil/article/details/80934291

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/113125.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 关于WiFi密码破解的一些心得

    关于加密方式  目前无线网络加密形式常见的有两种:WEP和WPA/WPA2。  WEP破解方法相对简单,这种加密方式由于不安全现在基本上没有使用了。这里对其破解方法不做讨论。  WPA/WPA2破解的主流方法有Pin码破解、抓包破解。Pin码  Pin码破解最简单成功率最高,(需要路由器开启wps才行),使用QSS很快即可破解。  常用的pin码软件有幻影Pin、水…

  • 人工神经网络多层感知器_基于BP网络的多层感知器用来干嘛

    人工神经网络多层感知器_基于BP网络的多层感知器用来干嘛虽然异或问题成为感知器和早期神经网络的阿喀琉斯之踵,但它并非无解的问题。恰恰相反,解决它的思路相当简单,就是将单层感知器变成多层感知器。1,多层感知器(multilayerperceptron)包含一个或多个在输入节点和输出节点之间的隐藏层(hiddenlayer),除了输入节点外,每个节点都是使用非线性激活函数的神经元;2,多层感知器是一类前馈人工神经网络;3,多层感知器的训练包括以下步骤:首先确定给定输入和当前权重下的输出,再将输出和真实值相减得到误差函数,最后根据误差函数更新权重。在训练过程中

    2022年10月21日
  • arm cortex-a57 cpu_处理器a73和a53

    arm cortex-a57 cpu_处理器a73和a53在如今这个电子产品泛滥的年代,仅仅靠品牌或是外观已经不足以辨别产品的优劣,其内置的处理器自然也就成为了分辨产品是否高端的标准之一。那么我们今天就不妨好好了解一下近几年来电子产品中较为主流的RAM处理器。  在这之前让我们先简单认识一下处理器的架构。所谓处理器架构是CPU厂商给属于同一系列的CPU产品定的一个规范,主要目的是为了区分不同类型CPU的重要标示。目前市面上的CPU指令集分类主要分有…

  • 模型运营是做什么的(概念模型数据库)

    编者注:文中超链接如果不能访问可以点击“阅读原文”访问本文原页面;读者可以查看将于2019年9月23至26日在纽约举办的Strata数据大会上的议题——模型开发、管理和运…

  • 联想 p系列服务器,全面解读联想ThinkStation P系列工作站

    联想 p系列服务器,全面解读联想ThinkStation P系列工作站ThinkStationP900&P700【中关村在线报道】10月29日,在以”灵感澎湃创变未来”为主题新品发布会上,全新一代联想ThinkStationP系列工作站家族亮相。新品延续了品质、创新、人本设计三大Think基因,从外部设计到内部平台,进行了全面的优化和升级,整体性能较上代产品提升50%以上,并采用联想独家的Flex模块技术和三通道散热技术,将灵活扩展性、稳定可靠性提升至…

  • js定义点击事件_回字四种写法

    js定义点击事件_回字四种写法嵌入式点击按钮脚本模型btn.onclick=function(){}W3C事件写法添加事件:appEventListener(事件名,事件函数,false)btn.addEventLi

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号