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