php发送邮件封装类,使用nette/mail 封装一个发送邮件类 (通用)
使用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.使用C++封装一个链表类LinkList
使用C++封装一个链表类LinkList.写出相应一个测试用例 链表需要提供 添加 修改删除 除重 合并 排序创建 销毁等接口. 不能调用库函数或者使用STL等类库 题目延伸********** ...
- 封装一个学生类Student(使用类与对象的方法)
5.封装一个学生类Student,(自行分辨定义为类属性还是实例属性,方法定义为实例方法) - 属性:身份(学生),姓名,年龄,性别,英语成绩,数学成绩,语文成绩, - 方法一:计算总分,方法二:计算 ...
- 日历---C++封装一个Date类,Calendar类,实现简单的日历+日期计算器程序
C++封装一个Date类,实现简单的日历程序 程序代码如下: Date.h #include<iostream> using namespace std;class Date {publi ...
- 封装一个新闻类News,包含新闻标题,新闻作者,新闻内容,新闻类型三个属性,提供必要的访问器和修改器方法重写toString方法,要求打印对象时输出格式为“标题;
封装一个新闻类News,包含新闻标题,新闻作者,新闻内容, 新闻类型三个属性,提供必要的访问器和修改器方法,重写toString方法, 要求打印对象时输出格式为"标题:类型:作者" ...
- 装饰器/使用类和对象封装一个工具类
# coding:utf-8 # 装饰器是以@开头,@结构称为语法糖,装饰器的作用主要是给现有的函数增加一些额外的功能. # @classmethod # @staticmethod # @prope ...
- 用python封装一个学生类
# 封装一个学生类,(自行分辨定义为类属性还是实例属性) # 属性:身份(学生),姓名,年龄,性别,英语成绩,数学成绩,语文成绩, 职责. # 如果是类属性请提前定义, # 如果是实例属性请初始化 ...
- 封装一个自己的通用Ajax
一个简单的Ajax请求 首先在封装一个自己的ajax函数之前,我们需要先知道怎么实现一个简单的ajax请求. 这里我建了两个文件,ajax01.html和ajax01.php ajax01.html代 ...
- php封装一个用户类,PHP封装的一个单例模式Mysql操作类
掌握满足单例模式的必要条件----三私一公. ①私有的构造方法-为了防止在类外使用new关键字实例化对象. ②私有的成员属性-为了防止在类外引入这个存放对象的属性. ③私有的克隆方法-为了防止在类外通 ...
- 如何在typescript中使用axios来封装一个HttpClient类
我们通常开始直接在代码中使用像axios这样的第三方库.这没有错.但是,在不断变化的库,软件包,版本等世界中,直接使用这些库API可能会导致代码不一致. 一个好的做法是创建自己的抽象并将对库API的调 ...
最新文章
- Linux中/proc目录下文件详解
- mysql服务器性能剖析,高性能MySQL–服务器性能剖析
- Android_动态壁纸介绍
- ar ebs 销售订单关闭_有关销售订单的工作流(workflow)定义和处理方式
- eclipse怎样改编码格式_Eclipse中各种编码格式及设置
- 设置ORACLE_HOME环境变量
- 架构师这5条禁忌,你犯了么?
- 苹果CMSv10自适应高权重模板源码
- vue_devtools的安装及资源(chrome and edge上的安装)
- VS2010 书签 工具的使用方法
- 3. 安装 phpmyadmin
- 显卡 内存分配 linux,玩转笔记本显卡共享显存设置
- 【matlab图像处理】图像处理工具箱(2)
- 如何修改BOOT.INI启动项,添加一个D盘的启动系统上去?
- 数理统计——AQI分析
- 摔鸡蛋,摔手机问题。
- 降低指定进程的CPU占用率(适合游戏多开)
- Day 29 - AWS Lambda 接收参数查询 Dynamodb
- Linux 内核likely与unlikey
- SpringCloud-07-新一代路由网关Spring Cloud Gateway
热门文章
- Android在CMD中输入adb命令,提示“'adb' 不是内部或外部命令,也不是可运行的程序”的解决方法
- 在Ubuntu中出现权限不够和找不到文件的解决方法
- 广义表,长度是( ),深度是( )
- 让逆向工程师们头疼的代码混淆,就像永远也走不出的“浪浪山”
- C语言 strcpy 和 strcpy_s 函数区别 - C语言零基础入门教程
- 栈内存 堆内存 (数据类型间的存储区别)
- Helocobic-energy 小电视
- 虚拟化技术发展与虚拟化体系结构
- SOA详解微服务与SOA的关系
- 每日C语言代码(The fifth day)——求素数