<?php
/**
 * *
 *  * ============================================================================
 *  * Created by PhpStorm.
 *  * User: Ice
 *  * 邮箱: ice@sbing.vip
 *  * 网址: https://sbing.vip
 *  * Date: 2019/9/19 下午3:33
 *  * ============================================================================.
 */

namespace app\common\library;

use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\PHPMailer;
use think\facade\Config;

class Email
{
    /**
     * 单例对象
     */
    protected static $instance;

    /**
     * @var PHPMailer phpmailer对象
     */
    protected $mail;

    /**
     * 错误内容.
     */
    protected $_error = '';

    /**
     * 默认配置.
     */
    public $options = [
        'charset' => 'utf-8', //编码格式
        'debug'   => 0, //调式模式
    ];

    /**
     * 初始化.
     *
     * @param  array  $options  参数
     *
     * @return Email
     */
    public static function instance($options = [])
    {
        if (is_null(self::$instance)) {
            self::$instance = new static($options);
        }

        return self::$instance;
    }

    /**
     * 构造函数.
     *
     * @param  array  $options
     */
    public function __construct($options = [])
    {
        if ($config = Config::get('site')) {
            $this->options = array_merge($this->options, $config);
        }
        $this->options = array_merge($this->options, $options);

        $securArr      = [1 => 'tls', 2 => 'ssl'];

        $this->mail            = new PHPMailer(true);
        $this->mail->CharSet   = $this->options['charset'];
        $this->mail->SMTPDebug = $this->options['debug'];
        $this->mail->isSMTP();
        $this->mail->SMTPAuth   = true;
        $this->mail->Host       = $this->options['mail_smtp_host'];
        $this->mail->Username   = $this->options['mail_from'];
        $this->mail->Password   = $this->options['mail_smtp_pass'];
        $this->mail->SMTPSecure = isset($securArr[$this->options['mail_verify_type']]) ? $securArr[$this->options['mail_verify_type']] : '';
        $this->mail->Port       = $this->options['mail_smtp_port'];

        //设置发件人
        $this->from($this->options['mail_from'], $this->options['mail_smtp_user']);
    }

    /**
     * 设置邮件主题.
     *
     * @param  string  $subject
     *
     * @return $this
     */
    public function subject($subject)
    {
        $this->options['subject'] = $subject;

        return $this;
    }

    /**
     * 设置发件人.
     *
     * @param  string  $email
     * @param  string  $name
     *
     * @return $this
     */
    public function from($email, $name = '')
    {
        $this->options['from']      = $email;
        $this->options['from_name'] = $name;

        return $this;
    }

    /**
     * 设置收件人.
     *
     * @param  string  $email
     * @param  string  $name
     *
     * @return $this
     */
    public function to($email, $name = '')
    {
        $this->options['to']      = $email;
        $this->options['to_name'] = $name;

        return $this;
    }

    /**
     * 设置邮件正文.
     *
     * @param  string  $body
     * @param  bool    $ishtml
     *
     * @return $this
     */
    public function message($body, $ishtml = true)
    {
        $this->options['body']   = $body;
        $this->options['ishtml'] = $ishtml;

        return $this;
    }

    /**
     * 获取最后产生的错误.
     *
     * @return string
     */
    public function getError()
    {
        return $this->_error;
    }

    /**
     * 设置错误.
     *
     * @param  string  $error  信息信息
     */
    protected function setError($error)
    {
        $this->_error = $error;
    }

    /**
     * 发送邮件.
     *
     * @return bool
     */
    public function send()
    {
        $result = false;
        switch ($this->options['mail_type']) {
            case 1:
                //使用phpmailer发送
                $this->mail->setFrom($this->options['from'], $this->options['from_name']);
                $this->mail->addAddress($this->options['to'], $this->options['to_name']);
                $this->mail->Subject = $this->options['subject'];
                if ($this->options['ishtml']) {
                    $this->mail->msgHTML($this->options['body']);
                } else {
                    $this->mail->Body = $this->options['body'];
                }
                try {
                    $result = $this->mail->send();
                } catch (Exception $e) {
                    $this->setError($e->getMessage());
                }

                $this->setError($result ? '' : $this->mail->ErrorInfo);
                break;
            case 2:
                //使用mail方法发送邮件
                $headers = 'MIME-Version: 1.0'."\r\n";
                $headers .= 'Content-type: text/html; charset='.$this->options['charset']."\r\n";
                $headers .= "To: {$this->options['to_name']} <{$this->options['to']}>\r\n"; //收件人
                $headers .= "From: {$this->options['from_name']} <{$this->options['from']}>\r\n"; //发件人
                $result  = mail($this->options['to'], $this->options['subject'], $this->options['body'], $headers);
                $this->setError($result ? '' : error_get_last()['message']);
                break;
            default:
                //邮件功能已关闭
                $this->setError(__('Mail already closed'));
                break;
        }

        return $result;
    }
}
