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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

白话transformer(四):整体架构介绍

transformer现在是最主流的深度学习框架&#xff0c;尤其是大模型的流程让transformer的作用更加凸显&#xff0c;他可以对话、分类、生成文本等功能&#xff0c;那么他到底是如何工作的呢。 B站视频 1、背景知识铺垫 1.1、生成式模型 相信大家在使用手机聊天的输入法时&am…

闪电网络协议设计思想剖析

1. 引言 闪电网络可能是比特币之上部署的最受期待的技术创新。闪电网络&#xff0c;为由 Joseph Poon 和 Tadge Dryja 于2015年首次提出的支付层&#xff0c;承诺支持&#xff1a; 用户之间几乎无限数量的链下交易&#xff0c;几乎免费&#xff0c;同时利用比特币提供的安全性…

基于python+vue云上水果超市的设计与实现flask-django-php-nodejs

本论文的主要内容包括&#xff1a; 第一&#xff0c;研究分析当下主流的web技术&#xff0c;结合超市日常管理方式&#xff0c;进行云上水果超市的数据库设计&#xff0c;设计云上水果超市功能&#xff0c;并对每个模块进行说明。 第二&#xff0c;陈列说明该系统实现所采用的架…

Redis数据类型 Hash Set Zset Bitmap HyperLogLog GEO

Hash 说起Hash大家其实很容易想到java中的集合类HashMap,这里其实就是一个套娃,键值对套了一层键值对他的指令也很简单 首先是设置键值对 这里就是设置两个键值对 我们可以进行获取 使用hget获取值 或者我们使用hgetall来查询所有值 hmset/hmget是批量查找查询,和上面的操作类似…

【Unity】UI九宫格

什么是九宫格&#xff1f; 顾名思义&#xff0c;九宫格就是指UI切成9个格子&#xff0c;9个格子可以任意拉伸。 1、3、7、9不拉伸。 2、8水平拉伸。 4、6垂直拉伸。 5既可以水平也可以垂直拉伸。 怎么切九宫格&#xff1f; 选中图片&#xff0c;改成Sprite模式&#xff0c;点…

本地化语音识别、视频翻译和配音工具:赋能音频和视频内容处理

随着人工智能技术的飞速发展&#xff0c;语音识别、视频翻译和配音等任务已经变得更加容易和高效。然而&#xff0c;许多现有的工具和服务仍然依赖于互联网连接&#xff0c;这可能会导致延迟、隐私问题和成本问题。为了克服这些限制&#xff0c;我们介绍了一种本地化、离线运行…

使用 Dify 和 AWS Bedrock 玩转 Anthropic Claude 3

本篇文章&#xff0c;聊聊怎么比较稳定的使用 Anthropic Claude 3&#xff0c;以及基于目前表现非常好的模型&#xff0c;来做一些有趣的 AI Native 小工具。 写在前面 在实际体验了半个多月&#xff0c;月初上线的 Anthropic Claude Pro 后&#xff0c;发现 Claude 3 系列模…

LeetCode-60题:排列序列解法二(原创)

【题目描述】 给出集合 [1,2,3,...,n]&#xff0c;其所有元素共有 n! 种排列。按大小顺序列出所有排列情况&#xff0c;并一一标记&#xff0c;当 n 3 时, 所有排列如下&#xff1a;"123" 、"132" 、"213" 、"231"、"312"、…

第八篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读使用Python库清洗处理从PDF文件提取的文本

传奇开心果博文系列 系列博文目录Python自动化办公库技术点案例示例系列 博文目录前言一、Python清洗处理文本的常见步骤二、使用Python库去除非文本元素示例代码三、使用Python库去除格式化元素的示例代码四、使用Python库去除空白字符示例代码五、使用Python库合并段落和行示…

在任何 Mac 上恢复永久删除照片的 5 种简单方法

Mac 为业余和专业摄影师提供了很多东西&#xff0c;从令人印象深刻的硬件到广泛的照片管理和编辑应用程序。它还提供了多种恢复丢失照片的方法&#xff0c;我们在本文中介绍了其中的五种方法&#xff0c;以帮助您避免潜在的灾难性情况。 Mac 上删除的照片去了哪里&#xff1f;…

高能脉冲电阻-高能陶瓷电阻

EAK无感实芯电阻器&#xff0c;高能电阻&#xff0c;高能脉冲电阻&#xff0c;高能陶瓷电阻 产品特性&#xff1a; Ⅰ100%陶瓷实芯压铸结构,由粘土、二氧华硅、瓷粉等无机材料经高温烧结而成。 Ⅱ承受高脉冲能量 ,适应高压,超高压环境,能用于1000KV以上电路瞬间功率达到3KKW以…

【阅读笔记】Kinematic On‐the‐Fly GPS Positioning Relative to a Moving Reference

Hermann B R, Evans A G, Law C S, et al. Kinematic On‐the‐Fly GPS Positioning Relative to a Moving Reference[J]. Navigation, 1995, 42(3): 487-501. 单词解释 Antenna swap&#xff1a;天线交换 pseudokinematic&#xff1a;伪运动学 ambiguity&#xff1a;双关、歧…

Web框架开发-django模型层(多表操作)

一、创建模型 实例: 作者模型:一个作者有姓名和年龄 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息。作者详情模型和作者模型之间是一对一的关系(one-to-one) 出版商模型:出版商有名称,所在城市以及email。 书籍模型: 书籍有书名和出版…

Python面向对象三大特征(封装、继承、多态)

面向对象编程的三大特征&#xff1a;封装、继承和多态。 注意&#xff1a;在python面向对象编程中&#xff0c;子类对象可以传递给父类类型 一、封装 在Python中&#xff0c;封装是面向对象编程中的一种重要概念&#xff0c;它可以帮助我们实现数据隐藏、信息保护和代码复用。…

使用jscpd对比重复代码

背景 检查项目中重复的代码&#xff0c;或者代码片段 jscpd 两个文件对比 Jscpd 是一个用于检测代码复制和粘贴的工具&#xff0c;它可以比较两个文件并报告相似性的百分比。 以下是如何使用 Jscpd 来比较两个文件的示例&#xff1a; 首先&#xff0c;确保你已经安装了 Nod…

【Flutter学习笔记】9.7 动画过渡组件

参考资料&#xff1a;《Flutter实战第二版》9.7 动画过渡组件 “动画过渡组件”指的是在Widget属性发生变化时会执行过渡动画的组件&#xff0c;其最明显的一个特征就是会在内部管理一个AnimationController。controller定义了过渡动画的时长&#xff0c;而animation对象的定义…

Linux学习之C/C++文件操作底层调用及原理

前言&#xff1a;我们都知道&#xff0c;我们学习的C/C是无法直接与底层硬件进行交互的&#xff0c;所有需要与底层硬件的交互都是通过操作系统作为中介完成的&#xff0c;那Linux到底是怎么做到的呢&#xff1f;接下来我们将揭开它神秘的面纱。 目录 一&#xff0c;操作系统…

全平台7合一万能DIY小程序源码系统 带完整的安装代码包以及安装搭建教程

在当下的小程序市场中&#xff0c;虽然已有众多开发工具和服务平台&#xff0c;但很多用户仍然面临着开发难度大、功能不齐全、定制性差等问题。小编给大家分享一款全平台7合一万能DIY小程序源码系统。该系统旨在解决用户在小程序开发过程中的痛点&#xff0c;提供一站式的小程…

WordPress Plugin NotificationX插件 SQL注入漏洞复现(CVE-2024-1698)

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。 0x02 漏洞概述 WordPress plugin NotificationX是一个应用插件。2.8.2版本及之前 存在安全漏洞,该…

飞腾+FPGA+AI电力行业智能数据采集与分析网闸解决方案

行业痛点: 安全物联网闸在监控平台中的具体作用&#xff1a;35KV变电站是煤矿的动力核心&#xff0c;采矿人员上下井、煤炭提升输送、矿井通风等核心设备均依靠变电站提供电源。监控中心及时掌握变电站的运行状态对煤矿的安全生产非常重要。如若外部通过监控网络来控制变电站会…