共计 2097 个字符,预计需要花费 6 分钟才能阅读完成。
使用 nette/mail 封装一个发送邮件类 (通用)
使用到的包
composer require nette/mail
封装 Mail
体
<?php | |
/** | |
* 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
发送类
<?php | |
/** | |
* 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 数据, 进行发送
了解一下 ,
生产者消费者模式
正文完