php Laravel计划不发送电子邮件

zzlelutf  于 2023-04-19  发布在  PHP
关注(0)|答案(4)|浏览(126)

这是我第一次尝试实现任务调度,我试图在某个时间发送自动电子邮件:
在实现我的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设置了twiceDaily

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

我在我的DemoCron.php中打印了一个日志,看看它是否真的有效

结果1:当我选择schedule once per minute时,它会打印我的日志,尊重我的Democron.php中的所有条件,但它 * 不发送电子邮件 *。
**结果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]);
    }
}
5f0d552i

5f0d552i1#

尝试了几次之后,我找到了一个解决方案。

1-新建控制器

我创建了一个名为MailController的新控制器,而不是使用通过Laravel Scheduling生成的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-添加新路由

添加了一个不带身份验证的新路由

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

3-在Cpanel上增加了一个cronjob

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

cvxl0en22#

首先检查所有内容:

  • 在.env中验证您的邮件配置;
  • 在您的电子邮件类中验证是否有implements ShouldQueue;
  • 如果你正在实现ShouldQueue,你必须在.env中验证你的队列配置;
  • 如果没有实现ShouldQueue,不要错过验证队列配置的时间;
    所有的东西都已验证,但仍然无法发送电子邮件:
  • 在try catch中添加Send mail,如果出现问题,则记录catch;
  • 如果在try catch中不记录任何内容,请尝试创建一个仅发送简单电子邮件的命令;
  • 如果dosen´工作尝试发送电子邮件通过您的邮件在Cpanel,因为这应该是问题;
    终于
  • 在我使用cPanel的情况下,我总是创建croon任务到所有秒,如* * * * *,并且在我的laravel项目的内核中,我验证是否必须使用laravel命令执行某些命令,如->twiceDaily(12, 15)

尝试所有的事情,如果错误仍然存在,请更新此线程!

n3h0vuf2

n3h0vuf23#

对我来说,这是我的Apache配置文件(php.ini)
我最初是按照ConfigServer建议的“disable_functions”配置来做的,这就是导致我出现这个问题的原因
看起来像是在disabled_functions中添加proc_open导致了这个问题
打开你的php.ini并找到“disable_functions”,然后从列表中删除/移除“proc_open”
我所要做的就是保存文件,我的日程表立即工作,没有重新启动任何东西-但你可能需要尝试重新启动你的
希望这能帮助任何遇到这个的人

vjrehmav

vjrehmav4#

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

MAIL_HOST=pro.eu.turbo-smtp.com

MAIL_ENCRYPTION=ssl

而不是

MAIL_HOST=smtpauth.online.net

MAIL_ENCRYPTION=tls

我不知道这是关于加密还是主机功能,但它对我很有效

相关问题