完整项目地址:https://github.com/Evai/Aier

我们采用 'nette/mail' 包作为我们的邮件发送基础模块,在它的基础上封装一个 'Mail' 类,暴露出简洁的 API 给控制器使用,下面我们正式开始。

引入 'nette/mail' 包,修改 'composer.json':

"require": {"codingbean/macaw": "dev-master","illuminate/database": "*","filp/whoops": "*","nette/mail": "*"}

运行 'composer update',等待安装完成。'nette/mail' 的文档位于:http://doc.nette.org/en/2.2/mailing 让我们阅读它,然后设计 Mail 类:

新建 'services/Mail.php' 文件,内容如下:

<?phpuse Nette\Mail\Message;date_default_timezone_set('PRC');/*** Mail*/class Mail{public $config;// [String] e-mailprotected $from;// [Array] e-mail listprotected $to;protected $title;protected $body;protected $mail;/*** Mail constructor.* @param $to*/function __construct($values){$this->mail = new Message;$this->config = require_once BASE_PATH . '/config/mail.php';$this->mail->setFrom($this->config['username']);if ( !is_array($values) ) {$values = [$values];}foreach ($values as $email) {$this->mail->addTo($email);}}/*** 发件人* @param null $from* @return $this*/public function from($from=null){if ( !$from ) {throw new InvalidArgumentException("邮件发送地址不能为空!");}$this->mail->setFrom($from);return $this;}/*** 收件人* @param null $to* @return Mail*/public static function to($values=null){if ( !$values ) {throw new InvalidArgumentException("邮件接收地址不能为空!");}return new Mail($values);}/*** 邮件标题* @param null $title* @return $this*/public function title($title=null){if ( !$title ) {throw new InvalidArgumentException("邮件标题不能为空!");}$this->mail->setSubject($title);return $this;}/*** 邮件内容* @param null $content* @return $this*/public function content($content=null){if ( !$content ) {throw new InvalidArgumentException("邮件内容不能为空!");}$this->mail->setHTMLBody($content);return $this;}function __destruct(){$mailer = new Nette\Mail\SmtpMailer($this->config);$mailer->send($this->mail);}}

Mail 类和 View 类工作的方式基本一致,在homecontroller.php中添加:

function mail(){Mail::to(['xxxxx@qq.com'])->from('Evai <xxx@163.com>')->title('Hello World')->content('<h1>Hello World !</h1>');echo '发送邮件成功';}

新建 'MFFC/config/mail.php',请自行替换邮件地址和密码:

<?phpreturn ['host' => 'smtp.163.com','username' => 'Evai <xxx@163.com>','password' => 'password','secure' => '','context' =>  ['ssl' => [],],];

routs.php中添加一条路由:
Route::get('mail', 'HomeController@mail');

 

OK,准备的差不多了,运行 'composer dump-autoload' 把 Mail 类加入自动加载,刷新页面!

如果你看到以上页面,恭喜你!邮件发送成功了!

赶快去检查一下收件箱有木有邮件!这次页面加载可能会稍慢,因为邮件是同步发送的。异步的队列系统我们会在以后讲到。

分析

邮件发送的整体流程想必大家已经轻车熟路了,现在主要叙述一下 Mail 类的设计过程:

  1. 邮件发送的核心参数是 '目标地址',即邮件要发送到的 E-mail 地址,所以我们设计 Mail::to('oo@xx.me') 作为发送的 '触发 API'。
  2. 目前我们采用最简单的 'SMTP' 方式发送邮件,文档在 这里。配置文件放置在 'MFFC/config/mail.php' 中,依旧返回一个数组。
  3. Mail 类继承了 'Nette\Mail\Message' 类。'Mail::to()' 的时候创建一个 Mail 类的实例(对象)并返回,这时候其实 'BaseController' 中的析构函数中的代码已经会被触发并处理这个对象了。默认的发送人是从配置文件中读取的 'username'。
  4. 'Mail::to()' 支持 字符串 或者数组作为参数,可以一次发送一封或多封邮件。
  5. 'from()'、'title()' 和 'content()' 方法用于丰富邮件内容。'content()' 方法可以直接传递 HTML 代码。
  6. 'from()' 配置不一定都能够成功,部分邮件服务商不支持修改发送人地址。
  7. 这个变量全部组装完成后,被赋值给控制器的 '$mail' 成员变量,然后被析构函数处理,邮件被发送,成功后页面代码被发送回客户端,流程结束。

转载于:https://www.cnblogs.com/evai/p/6213633.html

构建自己的PHP框架(邮件发送)相关推荐

  1. CI 框架邮件发送功能,以163为例

    1.163邮箱准备 开通邮箱,并进入邮箱点击设置,选中POP3/SMTP/IMAP,点击开启服务,获得授权码,该授权码即为后续CI框架中Mailer类的密码 2.类准备 1.下载文件class.php ...

  2. 利用Spring框架封装的JavaMail现实同步或异步邮件发送

    利用Spring框架封装的JavaMail现实同步或异步邮件发送 作者:张纪豪 J2EE简单地讲是在JDK上扩展了各类应用的标准规范,邮件处理便是其中一个重要的应用.它既然是规范,那么我们就可以通过J ...

  3. 利用Spring框架封装的JavaMail实现同步或异步邮件发送

    J2EE简单地讲是在JDK上扩展了各类应用的标准规范,邮件处理便是其中一个重要的应用.它既然是规范,那么我们就可以通过JDK遵照邮件协议编写一个邮件处理系统,但事实上已经有很多厂商和开源组织这样做了. ...

  4. Jenkins定时构建和邮件发送

    一:Jenkins定时构建 之前我们说的都是手动的构建一个项目,我们是不是可以自动的来构建项目. 那么此时我们需要使用: 构建触发器下的Poll SCM和Build periodically 我们在构 ...

  5. php 邮件类库,[3.3]-扩展类库:基于PHPMailer的邮件发送 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...

    3.3.1 扩展类库:基于PHPMailer的邮件发送 此扩展可用于发送邮件. 3.3.2 安装和配置 从 PhalApi-Library 扩展库中下载获取 PHPMailer 包,如使用: $ gi ...

  6. Spring的任务调度和邮件发送

    感谢网友 网络时空 兄弟对我的提醒,我已经把邮件发送中加上了邮件嵌入图片和增加附件方面的内容.谢谢 8.1.1任务调度简介 Spring包含了对定时调度服务的内置支持类.当前,Spring支持从JDK ...

  7. 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...

    本文你将学到什么? 本文将以原理+实战的方式,首先对"微服务"相关的概念进行知识点扫盲,然后开始手把手教你搭建这一整套的微服务系统. 项目完整源码下载 https://github ...

  8. 监听器和简单邮件发送

    一.监听器 1.监听器(Listener) 是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通 ...

  9. SpringBoot邮件发送-maven项目(禁止水贴001)

    1.maven依赖 <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www. ...

最新文章

  1. 20145234黄斐《Java程序设计》第十周
  2. linux挂载与卸载(转)
  3. 基于aspectj实现AOP操作的两种方式——xml配置
  4. jeesite3环境部署时初始化数据库注意问题
  5. boot spring 怎么执行hql_Intellij如何使用Spring Boot正确配置hql。现在我得到持久性QL查询已进行错误检查...
  6. 朴素贝叶斯(Naive Bayesian)
  7. 部分 I. 教程_第 2 章 SQL语言_2.2. 概念
  8. 安卓应用安全指南 5.6.1 密码学 示例代码
  9. XmlAttribute与实体的转换和匹配方案(附源码)
  10. 在asp.net中怎样将输入的中文符号转换成英文符号
  11. 单调队列(数列中长度不超过k的子序列和的最值)
  12. Netapp存储 硬盘显示bad label的解决办法
  13. CentOS date英文日期、星期简写说明(中文对照)
  14. 计算机能力怎么填制作ppt,电脑怎么制作PPT
  15. 蓝桥杯练习题--Fibonacci数列
  16. 带你Git从入门到精通
  17. c语言游戏经典案例,C语言_编游戏案例精编.doc
  18. android动态壁纸2.2.1,动态壁纸选择器
  19. 如何在统信UOS系统中设置tomcat开机启动
  20. 做程序员的第八个年头——2021年个人工作总结

热门文章

  1. mysql运算中max计算_MySQL 聚合函数、运算符操作、约束
  2. 蓝牙uuid是什么意思_小公主的吐槽非常好|米家蓝牙温湿度计2
  3. centos7 mariadb mysql_【软件安装】CentOS7安装MariaDb(mysql_替代品安装)
  4. HTML标签悬浮到最下方,HTML – 如何在兄弟姐妹的悬停上显示元素?
  5. Python字符串等于
  6. sudoku me_Java Sudoku解算器程序
  7. se 类java_Java SE 9:可选的类改进
  8. scala 提取器模式匹配_Scala提取器应用,取消应用和模式匹配
  9. Java SE 9:使用IntelliJ IDE开发和测试模块之间的隐式可读性(第5部分)
  10. Python unittest –单元测试示例