Tp5使用消息队列实现邮键发送
1、首先,compare需要下载安转包,如果你有的话就可以直接使用这个扩展包 消息队列扩展
composer require topthink/think-queue
在extra文件夹中的queue.php进行配置
return [ 'connector' => 'database', 'table' => 'jobs', //表名 你需要在数据库中创建这个表 'expire' => null, // 任务的过期时间,默认为60秒,若要禁用,则为null ];
sql文件
CREATE TABLE `jobs` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `queue` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `payload` longtext COLLATE utf8mb4_unicode_ci, `attempts` tinyint(3) unsigned DEFAULT NULL, `reserved` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `available_at` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL, `reserved_at` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`), KEY `zfw_jobs_queue_index` (`queue`) ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
2、然后配置你的邮件发送的一些配置项 下面是我的qq与用户密码,你需要去获取
'smtp' => [ 'server' => "smtp.qq.com",//SMTP服务器 例如:smtp.qq.com/smtp.163.com 'serverport' => "",//SMTP服务器端口 例如:25 'usermail' => "407489226@qq.com",//SMTP服务器的用户邮箱 'pass' => "xxxxxxxxxxxxx",//SMTP服务器的用户密码 qq邮箱提供 'smtpuser' => "407489226@qq.com" //SMTP服务器的用户帐号 ],
3.在app下新建文件夹job 并在文件夹中创建Test类
<?php namespace app\job; use think\queue\Job; class Test { public function fire(Job $job, $data) { // extract(input());
//sendMail 中第一个参数为收件人号码 参数二 标题 参数三 邮件内容
$res = sendMail('407489226@qq.com','name','邮件内容'); if ($res){ $job->delete(); } } }
4.在model中创建Test模型 书写实现消息队列的方法
<?php namespace app\admin\model; use think\Model; use think\Queue; class Test extends Model { //指定表名 protected $table="think_testsss"; // public static function add($data){ return self::create($data); } protected static function init() { Test::afterInsert(function ($user) { Queue::later(30, 'app\job\Test', $user, 'Test'); }); } }
注意:有些类需要自己引入 不然不可以使用
这时也需要一个test表
CREATE TABLE `tests` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `create_time` varchar(255) DEFAULT NULL, `update_time` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4;
5.书写发送邮件的方法
<?php namespace app\admin\controller; use app\admin\model\Test; use think\Db; class Email extends Base { public function index(){ return $this->fetch('email/index'); } /* * 发送邮件 */ public function sendEmail(){ $data=['name'=>'qyy']; $res=Test::add($data); if($res){ return json(['code'=>200,'msg'=>'发送成功']); }else{ return json(['code'=>100,'msg'=>'发送失败']); } }
6.开启监听
php think queue:work --daemon --queue test
注意 test为你的模型名
现在试着发送邮件,查看test与job表中是否有数据,并等待是否有邮件发送成功
参考链接:https://blog.csdn.net/Qiyijie666/article/details/115667495?spm=1001.2014.3001.5501
https://www.cnblogs.com/flzs/p/14070099.html