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

news2024/11/26 0:27:28

邮箱注册配置:

  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发送邮件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1531103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安卓(uniapp)上架华为踩坑合集

1.如果是离线打包&#xff0c;注意在manifest那里修改&#xff1a; android:debuggablefalse2…您的应用targetsdk版本低于30&#xff0c;不符合华为应用市场审核标准。 修改建议&#xff1a;请您将应用targetsdk等级升级到30或30以上。 因为之前我升到30被打回来过&#xff…

【LAMMPS学习】三、构建LAMMPS(5)可选的构建设置

3、构建LAMMPS 3.5.可选的构建设置 LAMMPS 可以通过多种可选设置来构建。每个小节都解释了如何使用 CMake 和 make 进行构建。 3.5.1. C11 标准合规性 编译 LAMMPS 需要 C11 标准兼容编译器。 LAMMPS 2020 年 3 月 3 版是核心代码和大多数软件包与之前的 C98 标准兼容的最…

使用 Flink + Faker Connector 生成测试数据压测 MySQL

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

基于java校园在线打印预约系统设计与实现

摘 要 二十一世纪以来&#xff0c;计算机行业应用技术不断发展&#xff0c;人们的观念也在不断改变。传统打印行业&#xff0c;用户已经意识到传统的打印文件方法等待时间太长。校园在线打印预约系统可以通过网络来打印文件&#xff0c;用户可以在特定的时间预约打印文件&#…

【RabbitMQ | 第一篇】消息队列基础知识

文章目录 1.消息队列基础知识1.1什么是消息队列&#xff1f;1.2消息队列有什么用&#xff1f;&#xff08;结合项目说&#xff09;1.2.1异步处理1.2.2削峰/限流1.2.3降低系统耦合性1.2.4实现分布式事务 1.3消息队列的缺点1.4JMS和AMQP1.4.1 JMS的两种消息模型&#xff08;1&…

PSQLException:limit must not be negative

limit must not be negative异常原因及解决 在PostgreSQL中遇到PsqlException: limit must not be negative异常&#xff0c;通常是由于在执行SQL查询时&#xff0c;传递给LIMIT子句的值为负数导致的。LIMIT子句用于限制查询结果的数量&#xff0c;其值必须是非负整数。 解决这…

C++ Qt开发:QUdpSocket实现组播通信

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QUdpSocket组件实现基于UDP的组播通信…

15届蓝桥杯第二期模拟赛所有题目解析

文章目录 &#x1f9e1;&#x1f9e1;t1_求余&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t2_灌水&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t3_字符显示&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t4_区间最大和…

Mysql:行锁,间隙锁,next-key锁?

注&#xff1a;以下讨论基于InnoDB引擎。 文章目录 问题引入猜想1&#xff1a;只加了一行写锁&#xff0c;锁住要修改的这一行。语义问题数据一致性问题 猜想2&#xff1a;要修改的这一行加写锁&#xff0c;扫描过程中遇到其它行加读锁猜想3&#xff1a;要修改的这一行加写锁&…

[ C++ ] STL---list的使用指南

目录 list简介 list的常用接口 构造函数 赋值运算符重载 迭代器 容量相关接口 元素访问接口 修改相关接口 头插push_front() 头删pop_front() 尾插push_back() 尾删pop_back() insert() erase() list的迭代器失效 list简介 1. list是可以以O(1)的时间复杂度在任意…

ORACLE 上机操作3-1

sqlplus / as sysdba 显示parameter结构 SQL> set pause on SQL> desc v$parameter 显示系统静态参数 SQL> select name from v$parameter where isses_modifiable FALSE; 显示db_files是否可以用命令修改 SQL> select isses_modifiable, issys_modifiable, ismod…

使用 OpenAI 的 Embedding模型 构建知识向量库并进行相似搜索

OpenAI的embedding模型的使用 首先第一篇文章中探讨和使用了ChatGPT4的API-Key实现基础的多轮对话和流式输出&#xff0c;完成了对GPT-API的一个初探索&#xff0c;那第二步打算使用OpenAI的embedding模型来构建一个知识向量库&#xff0c;其实知识向量库本质上就是一个包含着一…

四、HarmonyOS应用开发-ArkTS开发语言介绍

目录 1、TypeScript快速入门 1.1、编程语言介绍 1.2、基础类型 1.3、条件语句 1.4、函数 1.5、类 1.6、模块 1.7、迭代器 2、ArkTs 基础&#xff08;浅析ArkTS的起源和演进&#xff09; 2.1、引言 2.2、JS 2.3、TS 2.4、ArkTS 2.5、下一步演进 3、ArkTs 开发实践…

【Linux】网络基础一

网络基础一 1.计算机网络背景1.1 网络发展1.2 认识 “协议” 2.网络协议初识2.1 协议分层2.2 OSI七层模型2.3 TCP/IP五层(或四层)模型 3. 网络传输基本流程3.1 网络传输流程图 4.数据包封装和分用5.网络中的地址管理 从今天开始我们将要从系统横跨到网络的学习了&#xff0c;因…

微信支付宝--充ChatGPTPLUS/openAI key

ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够基于在预训练阶段所见的模式和统计规律&#xff0c;来生成回答&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;甚至能完成撰写论文、邮件、脚本、文案、翻译、代码等…

MFC界面美化第四篇----自绘list列表(重绘列表)

1.前言 最近发现读者对我的mfc美化的专栏比较感兴趣&#xff0c;因此在这里进行续写&#xff0c;这里我会计划写几个连续的篇章&#xff0c;包括对MFC按钮的美化&#xff0c;菜单栏的美化&#xff0c;标题栏的美化&#xff0c;list列表的美化&#xff0c;直到最后形成一个完整…

【Python】反编译PyInstaller打包的exe

查看exe基本信息 需要反编译的exe 查看exe文件的打包工具&#xff0c;查看exe信息的软件叫Detect It Easy(查壳工具) 由图我们可以看出当前选中的exe文件是由名叫PyInstaller的打包工具打包好的exe 反编译 exe反编译工具&#xff1a;pyinstxtractor.py 使用方法 python py…

VMWare虚拟机使用openmediavault搭建NAS服务器完整步聚

下载: gopenmediavault - The open network attached storage solution 下载好openmediavault的ISO镜像后,打开虚拟机并安装 系统类型选择Debian 启动虚拟机并安装openmediavault 选择中文 地区选中国 键盘配置选汉语 开始安装 配置网络信息 配置root密码 确认密码 系统安装中…

spark基本原理UI界面解读

这里是引用 1 八股文 1.1 基本原理 driver节点是整个应用程序的指挥所 指挥官是sparkcontext 环境&#xff1a;构建一个集群 应用程序提交 确定主节点&#xff0c;确定指挥所driver&#xff0c;确定指挥官sparkcontext sparkcontext会向资源管理器申请资源 会将作业分…

英伟达出品:全球最强大芯片Blackwell来了!采用4nm制程,2080 亿个晶体管组,支持10万亿参数模型

更多精彩内容在 美国加利福尼亚州圣何塞 —— 2024 年 3 月 18 日 —— NVIDIA 于今日宣布推出 NVIDIA Blackwell 平台以赋能计算新时代。该平台可使世界各地的机构都能够在万亿参数的大语言模型&#xff08;LLM&#xff09;上构建和运行实时生成式 AI&#xff0c;其成本和能耗…