喵♂呜 的博客

一个刚毕业就当爹的程序猿 正在迷雾中寻找道路...

ThinkPHP5整合PHPMailer发送邮件

本文讲解如何简单的在 TP5 中使用 PHPMailer 发送邮件 以 企业QQ邮箱为例

使用方式

  • 使用 Composer 安装 PHPMailer
    • 执行命令 composer require phpmailer/phpmailer
  • 把下列代码复制到项目里 新建一个类 Mailer.php
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    <?php
    /**
    * Created by PhpStorm.
    * User: 喵♂呜
    * Date: 2017/8/23
    * Time: 15:30
    */

    namespace app\common;

    use PHPMailer;

    /**
    * Class Mailer
    * @package app\common
    */
    class Mailer {
    /**
    * @var PHPMailer mail
    */
    private static $mail;

    /**
    * @param $to string 收件人
    * @param $name string 收件人名称
    * @param $subject string 邮件主题
    * @param $body string 邮件内容
    * @param null $attachment 附件列表
    * @return bool|string
    */
    public static function send($to, $name, $subject, $body, $attachment = null) {
    if (self::$mail == null) {
    self::$mail = new PHPMailer();
    $config = config('mail');
    self::$mail->CharSet = $config['charset'];
    self::$mail->IsSMTP();
    self::$mail->SMTPDebug = $config['debug'];

    self::$mail->SMTPSecure = $config['secure']; // 使用安全
    self::$mail->Host = $config['host']; //
    self::$mail->Port = $config['port']; // SMTP服务器的端口号

    if ($config['auth']) {
    self::$mail->SMTPAuth = true; // 启用 SMTP 验证功能
    self::$mail->Username = $config['username'];// SMTP服务器用户名
    self::$mail->Password = $config['password'];// SMTP服务器密码
    }

    self::$mail->setFrom($config['from'], $config['fromname']);
    }
    self::$mail->Subject = $subject;
    self::$mail->MsgHTML($body);
    self::$mail->AddAddress($to, empty($name) ? $to : $name);
    if (is_array($attachment)) { // 添加附件
    foreach ($attachment as $file) {
    is_file($file) && self::$mail->AddAttachment($file);
    }
    }
    return self::$mail->Send() ? true : self::$mail->ErrorInfo;
    }
    }
  • application/extra 新建 mail.php 配置文件 或者直接添加到 根配置(自己看文档)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?php
    /**
    * Created by PhpStorm.
    * User: 喵♂呜
    * Date: 2017/8/23
    * Time: 15:32
    */
    return [
    // 设定邮件编码,默认ISO-8859-1,如果发中文此项必须设置,否则乱码
    'charset' => 'UTF-8',
    // SMTP调试功能 0 = 关闭 1 = 错误和消息 2 = 消息
    'debug' => '0',
    // 协议 Options: '', 'ssl' or 'tls'
    'secure' => 'tls',
    // SMTP 服务器
    'host' => 'smtp.exmail.qq.com',
    // SMTP 服务器 端口
    'port' => 587,
    // 是否需要认证
    'auth' => true,
    // 用户名
    'username' => 'root@yumc.pw',
    // 密码
    'password' => 'Email2Send',
    // 来源地址 QQ邮箱必须设置和用户名相同
    'from' => 'root@yumc.pw',
    // 来源名称
    'fromname' => 'YUMC 插件商城'
    ];
  • 在控制器中直接使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
    namespace app\index\controller;

    use app\common\Mailer;

    class Index {
    public function sendmail() {
    $result = Mailer::send('admin@yumc.pw', '管理员', '测试邮件', '<h1>测试邮件</h1>')
    if($result === true){
    return "邮件发送成功!";
    }else{
    return "邮件发送失败 错误: " . $result;
    }
    }
    }

常见问题

  • 提示 SMTP connect() failed; 请先检查下面两项

    • 检查 PHP 的 fsockopen 函数是否开启
    • 如果用到了 tls 或者 ssl 检查 openssl 模块是否开启
  • 如果是 QQ邮箱 之类的企业邮箱 提示 mail from address must be same as authorization user 错误代码是 501

    • 请检查 fromusername 是否相同

欢迎关注我的其它发布渠道