完整项目地址: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' 文件,内容如下:

<?php

use Nette\Mail\Message;

date_default_timezone_set('PRC');

/**
* Mail
*/ class Mail { public $config; // [String] e-mail protected $from; // [Array] e-mail list protected $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',请自行替换邮件地址和密码:

<?php

return [

    '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' 成员变量,然后被析构函数处理,邮件被发送,成功后页面代码被发送回客户端,流程结束。

构建自己的PHP框架(邮件发送)的更多相关文章

  1. Java+Selenium3框架设计篇5-如何实现邮件发送测试报告

    https://blog.csdn.net/u011541946/article/details/77278837 本篇继续回答网友的问题,这个主题是如何通过邮件发送测试报告.通过邮件发送测试报告,这 ...

  2. 使用Quartz框架定时发送预警邮件

    1.  Quartz定时发送预警邮件 1.1.   需求及实现思路 定时查询库存预警信息,一旦存在库存预警的商品,则发邮件通知相关人员 1.2.   Quartz框架 Quartz是OpenSymph ...

  3. jenkins构建邮件自动发送,测试邮件发送成功,构建项目邮件发送不成功的问题

    提示问题: Connection error sending email,retrying once more in 10 seconds…… Connection error sending ema ...

  4. yii2.0 框架邮件的发送

    第一步: 在main-local.php中的components中配置mailer: $config = [ 'components' => [ 'mailer' => [ 'class' ...

  5. ABP框架系列之二十四:(Email-Sending-EF-电子邮件发送)

    Introduction Email sending is a pretty common task for almost every application. ASP.NET Boilerplate ...

  6. CI(CodeIgniter)框架下使用非自带类库实现邮件发送

    在项目开发过程中,需要到了邮件提醒功能.首先想到的是CI自身带不带邮件发送类,查看帖子,发现CI本身自带,然后试着利用CI自身带的类库来实现,经过搜搜很多帖子,不少开发者反馈CI自身的Email类有问 ...

  7. springboot+kafka+邮件发送(最佳实践)

    导读 集成spring-kafka,生产者生产邮件message,消费者负责发送 引入线程池,多线程发送消息 多邮件服务器配置 定时任务生产消息:计划邮件发送 实现过程 导入依赖 <proper ...

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

    原文:手把手0基础项目实战(一)--教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)... 本文你将学到什么? 本文将以原理+实战的方式,首先对& ...

  9. 循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理

    在系统处理中,有时候需要发送邮件通知用户,如新增用户的邮件确认,密码找回,以及常规订阅消息.通知等内容处理,都可以通过邮件的方式进行处理.本篇随笔介绍结合VUE+Element 前端,实现系统的邮件参 ...

随机推荐

  1. Cannot find module "element-ui/lib/theme-default/index.css"——解决办法

    在vuejs中使用element-ui 1.安装 cnpm install style-loader --save-dev cnpm install css-loader --save-dev cnp ...

  2. HDU 1069 Monkey and Banana DP LIS

    http://acm.hdu.edu.cn/showproblem.php?pid=1069 题目大意 一群研究员在研究猴子的智商(T T禽兽啊,欺负猴子!!!),他们决定在房顶放一串香蕉,并且给猴子 ...

  3. debian安装git管理本地代码

    debian安装git管理本地代码 安装git # aptitude install git-core # aptitude install git-doc git-svn git-email git ...

  4. ios开发网络学习二:URL转码以及字典转模型框架MJExtension的使用

    一:url转码,当url中涉及到中文的时候,要考虑转码,用UTF8对中文的url进行转码 #import "ViewController.h" @interface ViewCon ...

  5. 群晖synology的Video Station无法通过浏览器在线播放视频

    群晖synology的Video Station无法通过浏览器在线播放视频 http://www.hangge.com/blog/cache/detail_419.html

  6. [Javascript] Case insensitive sorting for string arrays

    We look at the default Array.prototype.sort behavior and discuss how you can do case insensitive str ...

  7. Spark源代码阅读笔记之DiskStore

    Spark源代码阅读笔记之DiskStore BlockManager底层通过BlockStore来对数据进行实际的存储.BlockStore是一个抽象类,有三种实现:DiskStore(磁盘级别的持 ...

  8. 在Eclipse上打包并使用Proguard工具混淆jar包

    近期由于工作须要,学习到了Android jar包的打包与混淆. 之前觉得还是非常easy的,可是自己深入研究下,发现还是有一些东西须要注意的,并且自己也踩了一些坑,在这里写下供同僚们借鉴借鉴. 转载 ...

  9. AlphaImageLoader用法

    在 IE6 中,能够非常方便地利用 img 的 src 属性,实现本地图片预览,然而在 IE7 中,这样的办法却行不通.须要用 AlphaImageLoader. AlphaImageLoader 说 ...

  10. 【BZOJ 1008】[HNOI2008]越狱

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1008 [题意] [题解] 相邻就会犯罪的话; 可以考虑它的反面; 即让所有相同信仰的人 ...