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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端静态开发案例-基于H5C3开发的仿照视频网站的前端静态页面-2 样式表部分和效果展示

原创作者&#xff1a;田超凡&#xff08;程序员田宝宝&#xff09; 版权所有&#xff0c;引用请注明原作者&#xff0c;严禁复制转载 charset "utf-8"; /* 程序员田宝宝原创版权所有&#xff0c;仿冒必究&#xff0c;该界面是仿照某视频网站官网开发的静态页面 */ …

QT界面制作

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setWindowFlag(Qt::FramelessWindowHint);//接收动图QMovie *mv new QMovie(":/pictrue/th.gif…

MySQL之索引与事务

一 索引的概念 一种帮助系统查找信息的数据 数据库索引 是一个排序的列表&#xff0c;存储着索引值和这个值所对应的物理地址无须对整个表进行扫描&#xff0c;通过物理地 址就可以找到所需数据是表中一列或者若干列值排序的方法 需要额外的磁盘空间 索引的作用 1 数据库…

【C++】弥补C语言的不足(①命名冲突问题)

Hello&#xff0c;这里是关于C的入门&#xff0c;C的命名冲突问题&#xff0c;如果你像我一样对命名空间满是疑惑&#xff0c;只知道using namespace std,那么可以看下这篇文章&#xff0c;我自己之前的一些疑惑以及一些形象的理解。 命名冲突问题与命名空间 &#x1f33b;命名…

京东云开发者:DDD 学习与感悟 —— 向屎山冲锋

原文地址:https://mp.weixin.qq.com/s/Hvq1ttBopbxypatVcKcLiA 软件系统是通过软件开发来解决某一个业务领域或问题单元而产生的一个交付物。而通过软件设计可以帮助我们开发出更加健壮的软件系统。因此&#xff0c;软件设计是从业务领域到软件开发之间的桥梁。而DDD是软件设计…

按键模拟精灵

按键模拟精灵功能简单&#xff1a; 1.添加模拟按键 2.删除模拟按键 3.开始模拟 4.停止模拟 适合简单的按键操作&#xff0c;有需要的可以点赞收藏关注我&#xff01;

【JS】浅谈Promise

Promise 前言一、Promise是什么&#xff1f;二、为什么用Promise&#xff1f;2.1解决回调地狱2.2 集中错误处理2.3代码解耦和复用 三、做什么&#xff1f;四、原型方法和实例方法&#xff1f;五、应用场景&#xff1f; 前言 promise是es6的新规范&#xff0c;它是一种异步解决…

jmeter之常用函数-第六天

1.常见函数&#xff1a; _counter 计数器函数 TRUE(每个用户都有自己的计数器) FALSE(所有用户共用一个计数器) _Random 随机数函数 参数1:取值范围最小值(包含) 参数2:取值范围最大值(包含) _time 获取当前时间的函数 无参: 获取的是距离 1970/01/01 00:00:00 的毫秒值 参…

基于springboot的大学生租房平台系统

技术&#xff1a;springbootmysqlvue 一、系统背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对大学生租房信息管理混乱…

IT部门领导的角色与责任:在挑战中塑造未来

前言 在当今快节奏的商业环境中&#xff0c;IT部门领导扮演着至关重要的角色。他们需要具备技术专长&#xff0c;同时也需要展现出卓越的领导力来有效地管理团队和应对各种挑战。 一、技术创新的引领者 1. 重要角色转变 随着信息技术的迅猛发展&#xff0c;IT部门领导已逐渐…

【系统架构设计师】计算机系统基础知识 03

系统架构设计师 - 系列文章目录 01 系统工程与信息系统基础 02 软件架构设计 03 计算机系统基础知识 文章目录 系统架构设计师 - 系列文章目录 文章目录 前言 一、计算机系统概述 1.计算机组成 ​编辑2.存储系统 二、操作系统 ★★★★ 1.进程管理 2.存储管理 1.页式存储 …

EPRO PR6423/005-030 涡流位移传感器CSI 6500机械健康监测器

EPRO PR6423/005-030 涡流位移传感器CSI 6500机械健康监测器 描述 PR 6423是一种非接触式涡流传感器 具有坚固耐用的电流传感器 建造和设计用于 极其关键的涡轮机 诸如蒸汽的应用&#xff0c; 天然气、压缩机和水电 涡轮机、鼓风机和风扇。 置换的目的 探针用于测量位置或 …