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

 

posted @ 2021-04-13 20:53  Conqueror·  阅读(260)  评论(0编辑  收藏  举报