thinkphp 使用phpmailer发送邮件以及使用消息队列异步解耦发送邮件

邮箱注册配置:

  1. 注册163或qq邮箱,开启smtp服务 25端口 ssl则465端口

下载phpmailer

  1. composer 安装phpmailer
composer require phpmailer/phpmailer

设置配置文件

  1. 配置文件
    在这里插入图片描述

书写代码

  1. 代码
<?php
namespace app\job;
use think\facade\Log;
use think\Queue;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

class SendEmail
{
    public function fire($job,$data)
    {

        print ("k开始发邮件 \n");
        // 实例化PHPMailer对象
       // $mail = new PHPMailer(true);
        try {

            $isJob = $this->doHelloJob($data);
            print_r('job->attempts()'.$job->attempts());
            // 发送邮件
            if ($isJob) {
                $job->delete();
                echo "邮件发送成功!\n";
            } else {

                if ($job->attempts() > 3) {
                    //通过这个方法可以检查这个任务已经重试了几次了
                    print_r("<warn>Hello Job has been retried more than 3 times!" . "</warn>\n");
                    $job->delete();
                }
                echo ('邮件发送失败');
                // 如果发送失败,记录错误并释放任务重试


            }
        } catch (Exception $e) {
            // 捕获PHPMailer异常
            echo ('邮件发送失败');
            Log::error("邮件发送异常",$e->getMessage());
            throw new \Exception("邮件发送异常:" . $e->getMessage());
        }
    }

    private function doHelloJob($data) {
        //实例化PHPMailer核心类
        $mail = new PHPMailer();
        $mail->SMTPOptions = array(
            'ssl' => array(
                'verify_peer' => false,
                'verify_peer_name' => false,
                'allow_self_signed' => true
            )
        );
        // 设置PHPMailer参数
        //$mail->SMTPDebug = 2; // 调试模式输出
        $mail->isSMTP(); // 使用SMTP
        $mail->Host       = config('mail.host'); // SMTP服务器
        $mail->SMTPAuth   = true; // 启用SMTP认证
        $mail->CharSet = 'UTF-8'; #设置发送的邮件的编码
        $mail->FromName   =  config('mail.username'); // SMTP用户名
        $mail->Username   =  config('mail.from_email'); // SMTP用户名
        $mail->Password   =  config('mail.password'); // SMTP密码
        $mail->From = config('mail.from_email'); #设置发件人邮箱地址 同登录账号
        $mail->SMTPSecure = 'ssll'; // 安全协议
        $mail->Port       = config('mail.port'); // SMTP端口
        $mail->isHTML(true);
        // 设置邮件内容
        //$mail->setFrom('from-email@example.com', '发件人名称');
        $mail->addAddress($data['to']); // 收件人
        $mail->Subject = $data['subject'];
        $mail->Body    = $data['body'];

        // 发送邮件
        if ($mail->send()) {
            return true;
        } else {
            Log::error("邮件发送异常",$mail->ErrorInfo());
            return false;

        }

    }
}

结果

在这里插入图片描述

异步队列发送邮箱

1 下载消息队列

thinkphp版本不同,则queue版本也不同,一下是tp5.1为例

composer require topthink/think-queue:2.0.4

在这里插入图片描述

return [
    //Redis驱动
    'connector' => 'Redis',
    "expire"=>60,//任务过期时间默认为秒,禁用为null
    "default"=>"default",//默认队列名称
    "host"=>'127.0.0.1',//Redis主机IP地址
    "port"=>6379,//Redis端口
    "password"=>'a123456789',//Redis密码
    "select"=>0,//Redis数据库索引
    "timeout"=>0,//Redis连接超时时间
    "persistent"=>false,//是否长连接


];

队列代码编写
在这里插入图片描述

<?php
namespace app\job;
use think\facade\Log;
use think\Queue;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

class SendEmail
{
    public function fire($job,$data)
    {

        print ('k开始发邮件');
        // 实例化PHPMailer对象
       // $mail = new PHPMailer(true);
        try {
            Log::error("k开始发邮件",['msg'=>'eeeeeeeeee']);
            //实例化PHPMailer核心类
            $mail = new PHPMailer();
            $mail->SMTPOptions = array(
                'ssl' => array(
                    'verify_peer' => false,
                    'verify_peer_name' => false,
                    'allow_self_signed' => true
                )
            );



            // 设置PHPMailer参数
            //$mail->SMTPDebug = 2; // 调试模式输出
            $mail->isSMTP(); // 使用SMTP
            $mail->Host       = config('mail.host'); // SMTP服务器
            $mail->SMTPAuth   = true; // 启用SMTP认证
            $mail->CharSet = 'UTF-8'; #设置发送的邮件的编码
            $mail->FromName   =  config('mail.username'); // SMTP用户名
            $mail->Username   =  config('mail.from_email'); // SMTP用户名
            $mail->Password   =  config('mail.password'); // SMTP密码
            $mail->From = config('mail.from_email'); #设置发件人邮箱地址 同登录账号
            $mail->SMTPSecure = 'ssl'; // 安全协议
            $mail->Port       = config('mail.port'); // SMTP端口
            $mail->isHTML(true);
            // 设置邮件内容
            //$mail->setFrom('from-email@example.com', '发件人名称');
            $mail->addAddress($data['to']); // 收件人
            $mail->Subject = $data['subject'];
            $mail->Body    = $data['body'];

            // 发送邮件
            if ($mail->send()) {
                // 如果发送成功,删除任务
                $job->delete();
                echo "邮件发送成功!\n";
            } else {
                echo ('邮件发送失败');
                // 如果发送失败,记录错误并释放任务重试
                Log::error("邮件发送异常",$mail->ErrorInfo());
                throw new \Exception("邮件发送失败:" . $mail->ErrorInfo);

            }
        } catch (Exception $e) {
            // 捕获PHPMailer异常
            echo ('邮件发送失败');
            Log::error("邮件发送异常",$e->getMessage());
            throw new \Exception("邮件发送异常:" . $e->getMessage());
        }
    }
}

调用

use think\Queue;
        $data = [
            'to'      => 'sky_oo8@163.com',
            'subject' => config('mail.subject'),
            'body'    =>$message,
        ];

        Queue::push('app\job\SendEmail', $data, 'email');

使用命令执行

#生产时候使用 守护进程
php think queue:work --daemon --queue email

# 无守护进程
php think queue:work --queue email

# 测试开发时候用,会显示细节
php think queue:listen --queue email

注意点
阿里云和腾讯服务器都禁用了25端口,所以需要开启ssl发送邮件

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值