這是我第一次嘗試實作任務調度,我試圖在某個時間發送自動電子郵件:
在實作我的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中的所有條件列印我的 LOG ,但它不會發送電子郵件。
結果 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]);
}
}
uj5u.com熱心網友回復:
首先讓我們檢查所有事情:
- 驗證 .env 中的郵件配置;
- 如果有,請在您的電子郵件課程中驗證
implements ShouldQueue; - 如果你正在實作 ShouldQueue,你必須在 .env 中驗證你的佇列配置;
- 如果沒有實作 ShouldQueue,不要錯過驗證佇列配置的時間;
好吧,所有事情都經過驗證,但仍未發送電子郵件:
- 在 try catch 中添加 Send mail 并在出現問題時記錄 catch;
- 如果在 try catch 中沒有記錄任何內容,請嘗試創建一個僅發送簡單電子郵件的命令;
- 如果不起作用,請嘗試在 Cpanel 中通過您的郵件發送電子郵件,因為這應該是問題所在;
最后
- 在我使用 cPanel 的情況下,我總是像所有秒一樣創建 croon 任務,
* * * * *并且在我的 laravel 專案的內核中,我驗證是否必須使用 laravel 命令(如->twiceDaily(12, 15).
嘗試所有方法,如果錯誤仍然存??在,請更新此執行緒!
uj5u.com熱心網友回復:
經過多次嘗試,我找到了解決方法。
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-添加一條新路線
添加了沒有身份驗證的新路線
Route::get('/delayedtask',[MailController::class, 'delayedtask']);
3-在 Cpanel 上添加了一個 cronjob
curl -s "https://myWebsiteURL/delayedtask">/dev/null 2>&1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/421486.html
標籤:
