使用 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 数据, 进行发送
了解一下 ,
生产者消费者模式