在Laravel中完成命令后发送电子邮件

时间:2019-03-14 15:51:51

标签: php laravel laravel-queue

我有一个要写在laravel上的命令。这将至少需要4个小时,所以我想在任务结束后从计算机收到一封电子邮件。我正在使用队列,所以我想追加整个操作,但是我不知道是否可能。

这是当前任务:

public function handle()
    {

        $directory = 'pv';
        $files = Storage::allFiles($directory);
        foreach($files as $file)
        {
            $fname = basename($file);
            \Log::info('Procesando ',[$fname]);
            $arr = explode(" ", $fname);
            $day = substr($arr[2], 0, 10);
            $date = Carbon::parse($day);
            // this process goes to a queue in chunks
            Excel::queueImport(new POSImport($date), $file);
        }
    }

在结束后,如何附加发送电子邮件的新作业?我不确定是否需要执行新命令或新工作。我的电子邮件作业已经过测试,可以正常工作。

App \ Jobs \ SendMailFinished.php

public function handle()
    {
        //Sends message
        $me = 'me@example.com';
        $msg = 'Process finished';
        Mail::to($me)->queue(new TasksFinished($msg));
    }

1 个答案:

答案 0 :(得分:1)

您可以通过多种不同的方式来完成此操作。

选项1

handle方法末尾发送邮件。这是最简单的选项:

public function handle()
{

    // job logic...

    Mail::to($me)->queue(new TasksFinished($msg));
}

选项2

使用withChain链接要在其他作业成功后发送的电子邮件作业:

YourTask::withChain([
    new SendMailFinished
])->dispatch();

选项3

JobProcessed的事件侦听器添加到EventServiceProvider.php:

/**
 * Register any events for your application.
 *
 * @return void
 */
public function boot()
{
    parent::boot();

    Queue::after(function (JobProcessed $event) {
        // $event->connectionName
        // $event->job
        // $event->job->payload()

        if ($was_my_job_class) {
            Mail::to($me)->queue(new TasksFinished($msg));
        }
    });
}

您可以使用this stackoverflow answer来确定所处理的作业是否是正确的类别。