簡體   English   中英

Laravel 計划不發送 email

[英]Laravel Schedule not sending email

這是我第一次嘗試實現任務調度,我試圖在某個時間發送自動電子郵件:

在實現我的cron之前,我首先測試了我的email在正常的class中手動發送代碼,看看是否沒有錯誤,並且沒有錯誤,email發送成功。

之后,我開始實施任務調度

Democron.php


protected $signature = 'demo:cron';

    protected $description = 'Command description';

    public function __construct()
    {
        parent::__construct();
    }

 
    public function handle()
    {
        
        $tasks = Task::all();
        $date = Carbon::now()->toDateTimeString();
        
        foreach ($tasks as $task) {
            if($task->completed_at != null){
                $validad = $task->completed_at;
                $receiver_id =  User::findOrFail($task->user_id);
                if($date > $validad){
                    $details = [
                        'task_id' =>$task->id,
                        'receiver_id' => $receiver_id
                    ];
                    
                    $subject = 'TeamWork - Você tem tarefas em atraso!';
                    $view = 'emails.project.delaydtask';
                    Mail::to($receiver_id->email)->send(new SendMail($details, $subject, $view));
                    Log::info('Email enviado com sucesso para '.$receiver_id->email);
                }
            }
        }

    }

Kernel.php

protected $commands = [
        DemoCron::class,
    ];

    protected function schedule(Schedule $schedule)
    {
        $schedule->command('demo:cron')
                 ->twiceDaily(12, 15)
                 ->timezone('Africa/Maputo');
    }

    protected function commands()
    {
        $this->load(__DIR__.'/Commands');
     
        require base_path('routes/console.php');
    }

在 CPANEL 上添加到 CRON JOBS並在 12 和 15 處設置了兩次

  /usr/local/bin/php /.......myProjectPath/artisan schedule:run >> /dev/null 2>&1

我在 DemoCron.php 中打印了一個 LOG,看看它是否真的有效

結果 1:當我 select 計划每分鍾一次時,它會打印我的 LOG,尊重我的Democron.php中的所有條件,但它不會發送 Z0C83F57C786A0B4A39EFAB2373

結果 2:當我 select 某個時間(每天兩次或每天一次)時,我的 LOG 沒有打印任何內容,也沒有發送 email

我究竟做錯了什么? 請幫幫我!

更新

我用來手動發送電子郵件的 SendMail class 運行良好,

但預定的電子郵件沒有發送


class SendMail extends Mailable
{
    use Queueable, SerializesModels;

    public $details, $subject, $view;

    public function __construct($details, $subject, $view)
    {
        $this->details = $details;
        $this->subject = $subject;
        $this->view = $view;
    }

    public function build()
    {
        return $this->subject($this->subject)
                    ->view($this->view, ['details' => $this->details]);
    }
}

首先讓我們檢查所有事情:

  • 驗證 your.env 中的郵件配置;
  • 在您的 email class 中驗證是否有implements ShouldQueue
  • 如果你正在實現 ShouldQueue,你也必須在.env 中驗證你的隊列配置;
  • 如果沒有實現 ShouldQueue,不要錯過驗證隊列配置的時間;

好吧,所有事情都經過驗證,但仍未發送 email:

  • 在 try catch 中添加 Send mail 並在出現問題時記錄 catch;
  • 如果在 try catch 中不記錄任何內容,請嘗試創建一個僅發送簡單 email 的命令;
  • 如果不起作用,請嘗試通過您的郵件在 Cpanel 中發送 email,因為這應該是問題所在;

最后

  • In my cases using cPanel, I always create the croon task to all seconds like * * * * * and in the kernel of my laravel project I verify if some command must be executed with the laravel commands like ->twiceDaily(12, 15) .

嘗試所有方法,如果錯誤仍然存在,請更新此線程!

經過多次嘗試,我找到了解決方法。

1-新建controller

I created a new controller called MailController instead of using the Kernel.php and Democron.php classes that I generated through Laravel Scheduling


class MailController extends Controller
{
    public function delayedtask(){
        try {
            
            $tasks = Task::all();
            $date = Carbon::now()->toDateTimeString();
            
            foreach ($tasks as $task) {
                if($task->completed_at != null){
                    $validad = $task->completed_at;
                    $receiver_id =  User::findOrFail($task->user_id);
                    if($date > $validad){
                        $details = [
                            'task_id' =>$task->id,
                            'receiver_id' => $receiver_id
                        ];
                        
                        $subject = 'TeamWork - Você tem tarefas em atraso!';
                        $view = 'emails.project.delaydtask';
                        Mail::to($receiver_id->email)->send(new SendMailQueue($details, $subject, $view));
                        Log::info('Email enviado com sucesso para '.$receiver_id->email);
                    }
                }
            }

            return "Done!";

            } catch (Exception $e) {
                return "Something went wrong!";
            }
    }
}

2-添加一條新路線

添加了沒有身份驗證的新路線

Route::get('/delayedtask',[MailController::class, 'delayedtask']);

3-在 Cpanel 上添加了一個 cronjob

   curl -s "https://myWebsiteURL/delayedtask">/dev/null 2>&1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM