【问题标题】:Laravel Schedule not sending emailLaravel 计划不发送电子邮件
【发布时间】:2022-05-06 17:07:36
【问题描述】:

这是我第一次尝试实现任务调度,我正在尝试在某个时间发送自动电子邮件:

在实现我的cron之前我先在一个普通的类中手动测试了我的邮件发送代码,看看有没有报错,没有报错,邮件发送成功了。

之后,我开始实现任务调度

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);
                }
            }
        }

    }

内核.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: 当我每分钟选择一次计划时,它会根据 Democron.php 中的所有条件打印我的日志,但它没有t 发送电子邮件

结果 2: 当我选择某个时间(每天两次或每天一次)时,我的 LOG 不打印任何内容,并且它不发送电子邮件

我做错了什么?请帮帮我!

更新

我用来手动发送电子邮件的 SendMail 类可以完美运行,

但预定的电子邮件没有发送


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]);
    }
}

【问题讨论】:

    标签: php laravel cron


    【解决方案1】:

    首先让我们检查所有内容:

    • 验证 .env 中的邮件配置;
    • 在您的电子邮件类中验证是否有implements ShouldQueue
    • 如果您正在实施 ShouldQueue,您还必须在 .env 中验证您的队列配置;
    • 如果没有实现 ShouldQueue,不要错过验证队列配置的时间;

    好的,所有事情都经过验证,但仍未发送电子邮件:

    • 在 try catch 中添加 Send mail 并在出现问题时记录 catch;
    • 如果在 try catch 中不记录任何内容,请尝试创建一个只发送简单电子邮件的命令;
    • 如果不起作用,请尝试在 Cpanel 中通过您的邮件发送电子邮件,因为这应该是问题所在;

    终于

    • 在我使用 cPanel 的情况下,我总是创建像 * * * * * 这样的所有秒的 croon 任务,并且在我的 laravel 项目的内核中,我验证是否必须使用像 ->twiceDaily(12, 15) 这样的 laravel 命令执行某些命令。

    尝试所有方法,如果错误仍然存​​在,请更新此线程!

    【讨论】:

    • 嗨@samuel,感谢您的合作,我所有的发送电子邮件配置都很好,因为我测试了手动发送电子邮件并且它有效,当我添加一个 try-catch 时,LOG 不打印任何内容
    【解决方案2】:

    经过多次尝试,我找到了解决方法。

    1- 创建一个新的控制器

    我创建了一个名为 MailController 的新控制器,而不是使用我通过 Laravel 调度生成的 Kernel.php 和 Democron.php 类

    
    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-添加新路线

    添加了一个没有 Auth 的新路由

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

    3-在 Cpanel 上添加了一个 cronjob

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

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题, 我尝试了一个新的 smtp 电子邮件服务器

      MAIL_HOST=pro.eu.turbo-smtp.com
      
      MAIL_ENCRYPTION=ssl
      

      而不是

      MAIL_HOST=smtpauth.online.net
      
      MAIL_ENCRYPTION=tls
      

      不知道是加密还是主机功能, 但它对我有用

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 2022-08-13
      • 1970-01-01
      • 2018-07-29
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多