使用nette/mail 封装一个发送邮件类 (通用)

使用到的包

composer require nette/mail

封装Mail体

/**

* Created by PhpStorm.

* User: 邓尘锋

* Date: 19-7-5

* Time: 上午11:57

* surest.cn

*/

namespace app\common\server;

use Nette\InvalidArgumentException;

use Nette\Mail\Message;

class Mail extends Message

{

public $config;

// [String] e-mail

protected $from;

// [Array] e-mail list

protected $to;

protected $title;

protected $body;

public function __construct($to)

{

$host = config('email.username');

$this->setFrom("{$host}", "D88科技")

->setHeader("name", $host);

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;

}

}

封装Mailer发送类

/**

* Created by PhpStorm.

* User: chenf

* Date: 19-7-16

* Time: 下午3:35

*/

namespace app\common\server;

use Nette\Mail\Message;

use Nette\Mail\SmtpMailer;

/**

*

* 使用:

* $mail = Mail::to($emails)->title("错误预警")->content($html);

* Mailer::setMailer()->send($mail);

*

* Class Mailer

* @package app\common\server

*/

class Mailer

{

/**

* 实例化一个Mailer类

* @return SmtpMailer

*/

public static function setMailer()

{

# 这里的配置读取的是config配置

$mailer = new SmtpMailer([

'host' => config('email.host'),

'username' => config('email.username'),

'password' => config('email.password'),

'secure' => config('email.secure')

]);

return $mailer;

}

/**

* 发送

* @param Message $mail

*/

public function send(Message $mail)

{

$this->send($mail);

}

}

配置

'host' => 'smtp.exmail.qq.com', // 用的是qq的smtp服务器

'username' => 'username',

'password' => 'password',

'secure' => 'ssl' // ssl 是 445 端口, 如不设置, 默认端口是 22 , 可参见源码

使用

// $emails 是一个数组

// Mail Message 体

$mail = Mail::to($emails)->title("错误预警")->content($html);

// 发送

Mailer::setMailer()->send($mail);

告知

如果直接使用如上方法, 采用的是同步发送的机制, 如果需要采用异步队列进行发送邮件, 我提供如下解决思路

使用redis

数据+key 写入 hash

key 写入 list

创建一个定时任务, 去除list key, 再去除hash数据, 进行发送

了解一下 , 生产者消费者模式

php发送邮件封装类,使用nette/mail 封装一个发送邮件类 (通用)相关推荐

  1. 1.使用C++封装一个链表类LinkList

     使用C++封装一个链表类LinkList.写出相应一个测试用例 链表需要提供 添加 修改删除 除重 合并 排序创建 销毁等接口. 不能调用库函数或者使用STL等类库 题目延伸********** ...

  2. 封装一个学生类Student(使用类与对象的方法)

    5.封装一个学生类Student,(自行分辨定义为类属性还是实例属性,方法定义为实例方法) - 属性:身份(学生),姓名,年龄,性别,英语成绩,数学成绩,语文成绩, - 方法一:计算总分,方法二:计算 ...

  3. 日历---C++封装一个Date类,Calendar类,实现简单的日历+日期计算器程序

    C++封装一个Date类,实现简单的日历程序 程序代码如下: Date.h #include<iostream> using namespace std;class Date {publi ...

  4. 封装一个新闻类News,包含新闻标题,新闻作者,新闻内容,新闻类型三个属性,提供必要的访问器和修改器方法重写toString方法,要求打印对象时输出格式为“标题;

    封装一个新闻类News,包含新闻标题,新闻作者,新闻内容, 新闻类型三个属性,提供必要的访问器和修改器方法,重写toString方法, 要求打印对象时输出格式为"标题:类型:作者" ...

  5. 装饰器/使用类和对象封装一个工具类

    # coding:utf-8 # 装饰器是以@开头,@结构称为语法糖,装饰器的作用主要是给现有的函数增加一些额外的功能. # @classmethod # @staticmethod # @prope ...

  6. 用python封装一个学生类

    #  封装一个学生类,(自行分辨定义为类属性还是实例属性) #  属性:身份(学生),姓名,年龄,性别,英语成绩,数学成绩,语文成绩, 职责. # 如果是类属性请提前定义, # 如果是实例属性请初始化 ...

  7. 封装一个自己的通用Ajax

    一个简单的Ajax请求 首先在封装一个自己的ajax函数之前,我们需要先知道怎么实现一个简单的ajax请求. 这里我建了两个文件,ajax01.html和ajax01.php ajax01.html代 ...

  8. php封装一个用户类,PHP封装的一个单例模式Mysql操作类

    掌握满足单例模式的必要条件----三私一公. ①私有的构造方法-为了防止在类外使用new关键字实例化对象. ②私有的成员属性-为了防止在类外引入这个存放对象的属性. ③私有的克隆方法-为了防止在类外通 ...

  9. 如何在typescript中使用axios来封装一个HttpClient类

    我们通常开始直接在代码中使用像axios这样的第三方库.这没有错.但是,在不断变化的库,软件包,版本等世界中,直接使用这些库API可能会导致代码不一致. 一个好的做法是创建自己的抽象并将对库API的调 ...

最新文章

  1. Linux中/proc目录下文件详解
  2. mysql服务器性能剖析,高性能MySQL–服务器性能剖析
  3. Android_动态壁纸介绍
  4. ar ebs 销售订单关闭_有关销售订单的工作流(workflow)定义和处理方式
  5. eclipse怎样改编码格式_Eclipse中各种编码格式及设置
  6. 设置ORACLE_HOME环境变量
  7. 架构师这5条禁忌,你犯了么?
  8. 苹果CMSv10自适应高权重模板源码
  9. vue_devtools的安装及资源(chrome and edge上的安装)
  10. VS2010 书签 工具的使用方法
  11. 3. 安装 phpmyadmin
  12. 显卡 内存分配 linux,玩转笔记本显卡共享显存设置
  13. 【matlab图像处理】图像处理工具箱(2)
  14. 如何修改BOOT.INI启动项,添加一个D盘的启动系统上去?
  15. 数理统计——AQI分析
  16. 摔鸡蛋,摔手机问题。
  17. 降低指定进程的CPU占用率(适合游戏多开)
  18. Day 29 - AWS Lambda 接收参数查询 Dynamodb
  19. Linux 内核likely与unlikey
  20. SpringCloud-07-新一代路由网关Spring Cloud Gateway

热门文章

  1. Android在CMD中输入adb命令,提示“'adb' 不是内部或外部命令,也不是可运行的程序”的解决方法
  2. 在Ubuntu中出现权限不够和找不到文件的解决方法
  3. 广义表,长度是( ),深度是( )
  4. 让逆向工程师们头疼的代码混淆,就像永远也走不出的“浪浪山”
  5. C语言 strcpy 和 strcpy_s 函数区别 - C语言零基础入门教程
  6. 栈内存 堆内存 (数据类型间的存储区别)
  7. Helocobic-energy 小电视
  8. 虚拟化技术发展与虚拟化体系结构
  9. SOA详解微服务与SOA的关系
  10. 每日C语言代码(The fifth day)——求素数