乐趣区

使用nettemail-封装一个发送邮件类-通用

使用 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 数据, 进行发送

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

退出移动版