利用 Composer 完善自己的 PHP 框架(二)——发送邮件

本教程示例代码见 https://github.com/johnlui/My-First-Framework-based-on-Composer


回顾

上一篇文章中,我们手工建造了一个简易的视图加载器,顺便引入了错误处理包,让我们的 MFFC 框架在 M、V、C 三个方面都达到了“好用”的水平。View 是一个可插拔组件,在本篇文章中我们要创建另一个可插拔组件——邮件发送模块。

正文

我们采用 ‘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‘ 文件,内容如下:

<?php

use Nette\Mail\Message;

/**

* \Mail

*/

class Mail extends Message

{

  public $config;

  // [String] e-mail

  protected $from;

  // [Array] e-mail list

  protected $to;

  protected $title;

  protected $body;

  function __construct($to)

  {

    $this->config = require BASE_PATH.‘/config/mail.php‘;

    $this->setFrom($this->config[‘username‘]);

    if ( is_array($to) ) {

      foreach ($to as $email) {

        $this->addTo($email);

      }

    } else {

      $this->addTo($to);

    }

  }

  public function from($from=null)

  {

    if ( !$from ) {

      throw new InvalidArgumentException("邮件发送地址不能为空!");

    }

    $this->setFrom($from);

    return $this;

  }

  public static function to($to=null)

  {

    if ( !$to ) {

      throw new InvalidArgumentException("邮件接收地址不能为空!");

    }

    return new Mail($to);

  }

  public function title($title=null)

  {

    if ( !$title ) {

      throw new InvalidArgumentException("邮件标题不能为空!");

    }

    $this->setSubject($title);

    return $this;

  }

  public function content($content=null)

  {

    if ( !$content ) {

      throw new InvalidArgumentException("邮件内容不能为空!");

    }

    $this->setHTMLBody($content);

    return $this;

  }

}

Mail 类和 View 类工作的方式基本一致:

$this->mail = Mail::to([‘[email protected]‘, ‘[email protected]‘])

                    ->from(‘MotherFucker <[email protected]>‘)

                    ->title(‘Fuck Me!‘)

                    ->content(‘<h1>Hello~~</h1>‘);

上面这段代码位于 HomeController 中, ‘View::make()‘ 那行代码的下面。

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

<?php

return [

  ‘host‘ => ‘smtp.163.com‘,

  ‘username‘ => ‘[email protected]‘,

  ‘password‘ => ‘password‘,

  ‘secure‘ => ‘‘

];

Mail 和 View 一样也在 BaseController 的析构函数 __destruct() 函数中处理,现在这个 function 长这样:

public function __destruct()

{

  $view = $this->view;

  if ( $view instanceof View ) {

    extract($view->data);

    require $view->view;

  }

  $mail = $this->mail;

  if ( $mail instanceof Mail ) {

    $mailer = new Nette\Mail\SmtpMailer($mail->config);

    $mailer->send($mail);

  }

}

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

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

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

分析

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

  1. 邮件发送的核心参数是 ‘目标地址‘,即邮件要发送到的 E-mail 地址,所以我们设计 Mail::to(‘[email protected]‘) 作为发送的 ‘触发 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://lvwenhan.com/php/412.html

时间: 2024-10-05 05:08:34

利用 Composer 完善自己的 PHP 框架(二)——发送邮件的相关文章

利用 Composer 完善自己的 PHP 框架(一)——视图装载

本教程示例代码见 https://github.com/johnlui/My-First-Framework-based-on-Composer 回顾 经过了上一个 系列教程  <利用 Composer 一步一步构建自己的 PHP 框架> ,我们组建了一个具有  路由 . MVC 架构  和  ORM  功能的基础框架  MFFC .接下来我们继续完善这个项目. 我们先从目前用着  最不爽  的地方——视图装载下手.我们将封装一个视图装载类,让它来帮我们装载视图,并把变量传递进视图.这个类将只

利用 Composer 完善自己的 PHP 框架(二)

回顾 上一篇文章中,我们手工建造了一个简易的视图加载器,顺便引入了错误处理包,让我们的 MFFC 框架在 M.V.C 三个方面都达到了"好用"的水平.View 是一个可插拔组件,在本篇文章中我们要创建另一个可插拔组件--邮件发送模块. 正文 我们采用 'nette/mail' 包作为我们的邮件发送基础模块,在它的基础上封装一个 'Mail' 类,暴露出简洁的 API 给控制器使用,下面我们正式开始. 引入 'nette/mail' 包,修改 'composer.json': "

【完结】利用 Composer 完善自己的 PHP 框架(三)——Redis 缓存

本教程示例代码见 https://github.com/johnlui/My-First-Framework-based-on-Composer 回顾 上两篇文章中我们完成了 View 视图加载类和 Mail 邮件发送类的设计,完成了两个可插拔组件.本篇文章中我们将构建另一个可插拔组件——'Redis 接口',并使用它构建 'MFFC' 的高速缓存服务. 正文 Redis 简介 'Redis' 是一个高性能的 'key-value' 数据库,其 'value' 支持 'String'.'Map(

利用 Composer 一步一步构建自己的 PHP 框架(一)——基础准备

『Composer 一统天下的时代已经到来!』——白岩松 “一个时代结束了,另一个时代开始了.” Framework Interoperability Group(框架可互用性小组),简称 FIG,成立于 2009 年.FIG 最初由几位知名 PHP 框架开发者发起,在吸纳了许多优秀的大脑和强健的体魄后,提出了 PSR-0 到 PSR-4 五套 PHP 非官方规范: 1. PSR-0 (Autoloading Standard) 自动加载标准 2. PSR-1 (Basic Coding Sta

利用 Composer 一步一步构建自己的 PHP 框架(一)

"一个时代结束了,另一个时代开始了." Framework Interoperability Group(框架可互用性小组),简称 FIG,成立于 2009 年.FIG 最初由几位知名 PHP 框架开发者发起,在吸纳了许多优秀的大脑和强健的体魄后,提出了 PSR-0 到 PSR-4 五套 PHP 非官方规范: 1. PSR-0 (Autoloading Standard) 自动加载标准 2. PSR-1 (Basic Coding Standard) 基础编码标准 3. PSR-2 (

企业级应用框架(二)三层架构之数据访问层的封装与抽象

接上一篇我们来对数据访问层进行封装与抽象.在上一篇我们知道,要解除BLL对DAL的依赖,我们就必须抽象出DAL层的接口,同时基于DAL的数据访问技术很多,如EF,ADO.NET,LINQ TO SQL,因此,我们的数据访问层必须对这些技术提供相应的支持.所以今天我们要做的事情有两件,第一,定义我们的数据访问层接口:第二,屏蔽各类数据库访问技术的差异,提供统一的数据库访问模型.举个例子,我们只需要修改一下我们的配置文件,就能够把ADO.NET的实现方式,改变成EF的实现方式.好下面搭建我们的三层构

百思不得姐框架(二)

一 该部分框架效果图和实现思路 框架二的效果图: 实现思路: -- 1> 先完善tabBar(主要是自定义) -- 2> 再完善导航条 -- 3> 其次完善屏幕侧滑(主要是全屏侧滑功能) 二 抽取分类(设置到插件中) 1 抽取分类的思想: 实现复用 --> 1.1 上部分代码中,我们需要设置tabBar中图片成未被渲染的格式,因此我们抽取了一个分类,用分类里面的方法实现了效果. --> 分类代码: //传入一张图片的名称返回一张未被渲染的图片 + (UIImage *)ori

如何设计一个完善可用的服务框架

上一篇博客整理了一些关于服务框架基础知识的内容,这篇博客,从实际的生产需要出发,谈谈一个完善可用的服务框架,需要包含哪些功能... PS:部分内容参考自<京东基础架构建设之路> 一个完善可用的RPC服务框架,需要包含以下几点: 框架组成 具体功能说明 服务注册中心 服务框架基础知识 管理端 接口管理+配置中心 统一的RPC框架 监控中心+分布式追踪+服务治理+网关 管理端 1.接口管理 提供统一的接口管理和查询入口,比如公共wiki或者类似swagger之类的系统. 功能:定义接口,包括接口描

第三百二十一节,Django框架,发送邮件

第三百二十一节,Django框架,发送邮件 全局配置settings.py EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' #发送邮件引擎 EMAIL_USE_TLS = False #是否以https方式 EMAIL_HOST = 'smtp.163.com' #邮件smtp服务器 EMAIL_PORT = 25 #端口 EMAIL_HOST_USER = '[email protected]' #发件人 EMAIL_