ProcessScheduledEmailCommand.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Models\EmailScheduled;
  4. use App\Models\EmailScheduledRecipient;
  5. use App\Mail\CustomEmail;
  6. use Illuminate\Console\Command;
  7. use Illuminate\Support\Facades\Mail;
  8. use Carbon\Carbon;
  9. class ProcessScheduledEmailCommand extends Command
  10. {
  11. protected $signature = 'email:process-scheduled';
  12. protected $description = 'Process scheduled email messages that are due to be sent';
  13. public function handle()
  14. {
  15. $this->info('🔍 Checking for scheduled Email messages...');
  16. $dueMessages = EmailScheduled::where('status', 'scheduled')
  17. ->where('scheduled_at', '<=', now())
  18. ->with('recipients')
  19. ->get();
  20. if ($dueMessages->isEmpty()) {
  21. $this->info('✅ No scheduled emails due for sending.');
  22. return 0;
  23. }
  24. $this->info("📧 Found {$dueMessages->count()} email batches due for sending.");
  25. foreach ($dueMessages as $message) {
  26. $this->info("📤 Processing email batch ID: {$message->id}");
  27. try {
  28. $message->update(['status' => 'sending']);
  29. $successCount = 0;
  30. $failCount = 0;
  31. foreach ($message->recipients as $recipient) {
  32. if ($recipient->email) {
  33. $recipientRecord = EmailScheduledRecipient::create([
  34. 'email_scheduled_id' => $message->id,
  35. 'user_id' => $recipient->id,
  36. 'email_address' => $recipient->email,
  37. 'status' => 'pending'
  38. ]);
  39. try {
  40. Mail::to($recipient->email)->send(
  41. new CustomEmail($message->subject, $message->content, $recipient->name)
  42. );
  43. $recipientRecord->markAsSent();
  44. $successCount++;
  45. $this->line(" ✅ Sent to {$recipient->name} ({$recipient->email})");
  46. usleep(100000);
  47. } catch (\Exception $e) {
  48. $recipientRecord->markAsFailed($e->getMessage());
  49. $failCount++;
  50. $this->line(" ❌ Failed to {$recipient->name} ({$recipient->email}): " . $e->getMessage());
  51. }
  52. } else {
  53. $failCount++;
  54. $this->line(" ⚠️ No email address for {$recipient->name}");
  55. }
  56. }
  57. // Update final status
  58. $finalStatus = $failCount === 0 ? 'sent' : ($successCount === 0 ? 'failed' : 'sent');
  59. $message->update([
  60. 'status' => $finalStatus,
  61. 'delivery_report' => [
  62. 'total' => $successCount + $failCount,
  63. 'successful' => $successCount,
  64. 'failed' => $failCount,
  65. 'completed_at' => now()
  66. ]
  67. ]);
  68. $this->info("✅ Email batch {$message->id} completed: {$successCount} sent, {$failCount} failed");
  69. } catch (\Exception $e) {
  70. $message->update([
  71. 'status' => 'failed',
  72. 'delivery_report' => [
  73. 'error' => $e->getMessage(),
  74. 'failed_at' => now()
  75. ]
  76. ]);
  77. $this->error("❌ Failed to process email batch {$message->id}: " . $e->getMessage());
  78. }
  79. }
  80. $this->info('🎉 Scheduled email processing completed!');
  81. return 0;
  82. }
  83. }