diff --git a/app/Console/Commands/CheckBirthday.php b/app/Console/Commands/CheckBirthday.php index 7b765f9..265885b 100755 --- a/app/Console/Commands/CheckBirthday.php +++ b/app/Console/Commands/CheckBirthday.php @@ -4,6 +4,7 @@ namespace App\Console\Commands; use App\Models\BirthdayMessage; use App\Models\Config; +use App\Models\EmailRecordUser; use App\Models\User; use App\Repositories\MeetRepository; use Illuminate\Console\Command; @@ -56,42 +57,82 @@ class CheckBirthday extends Command // 发送通知给用户 $smsSign = Config::getValueByKey('sms_sign') ?: ''; - $userSuccessCount = 0; - $userFailCount = 0; + $userSmsSuccessCount = 0; + $userSmsFailCount = 0; + $userEmailSuccessCount = 0; + $userEmailFailCount = 0; foreach ($users as $user) { - // 检查用户是否有手机号 - if (empty($user->mobile)) { - continue; + $username = $user->username ?: '校友'; + $hasMobile = !empty($user->mobile); + $hasEmail = !empty($user->email); + + // 发送短信 + if ($hasMobile) { + // 获取随机短信模板 + $smsMessage = BirthdayMessage::getRandomSmsMessage(); + if ($smsMessage) { + // 替换用户名占位符 + $smsContent = str_replace('{username}', $username, $smsMessage); + + // 添加短信签名 + $smsContent = $smsSign . $smsContent; + + // 直接发送短信 + $result = ymSms($user->mobile, $smsContent); + if ($result) { + $userSmsSuccessCount++; + $this->info("已向用户 {$username}({$user->mobile}) 发送生日祝福短信"); + } else { + $userSmsFailCount++; + $this->error("向用户 {$username}({$user->mobile}) 发送短信失败"); + } + } } - // 获取随机文案 - $message = BirthdayMessage::getRandomMessage(); - if ($message) { - // 替换用户名占位符 - $username = $user->username ?: '校友'; - $content = str_replace('{username}', $username, $message); - - // 添加短信签名 - $content = $smsSign . $content; - - // 直接发送短信 - $result = ymSms($user->mobile, $content); - if ($result) { - $userSuccessCount++; - $this->info("已向用户 {$user->username}({$user->mobile}) 发送生日祝福短信"); + // 发送邮件 + if ($hasEmail) { + // 获取随机邮件模板 + $emailTemplate = BirthdayMessage::getRandomEmailMessage(); + if ($emailTemplate) { + try { + // 准备变量数据 + $varData = [ + 'username' => $username, + ]; + + // 使用模板方法替换邮件标题和内容中的变量 + $emailSubject = EmailRecordUser::template($emailTemplate['subject'], $varData); + $emailContent = EmailRecordUser::template($emailTemplate['content'], $varData); + + // 发送邮件 + EmailRecordUser::email($emailSubject, $emailContent, $user->email); + $userEmailSuccessCount++; + $this->info("已向用户 {$username}({$user->email}) 发送生日祝福邮件"); + } catch (\Exception $e) { + $userEmailFailCount++; + $this->error("向用户 {$username}({$user->email}) 发送邮件失败: " . $e->getMessage()); + } } else { - $userFailCount++; - $this->error("向用户 {$user->username}({$user->mobile}) 发送短信失败"); + $this->warn("未找到可用的邮件模板,跳过向用户 {$username}({$user->email}) 发送邮件"); } } } - if ($userSuccessCount > 0) { - $this->info("共向 {$userSuccessCount} 位用户发送生日祝福短信成功"); + // 输出短信发送统计 + if ($userSmsSuccessCount > 0) { + $this->info("共向 {$userSmsSuccessCount} 位用户发送生日祝福短信成功"); + } + if ($userSmsFailCount > 0) { + $this->error("共 {$userSmsFailCount} 位用户短信发送失败"); + } + + // 输出邮件发送统计 + if ($userEmailSuccessCount > 0) { + $this->info("共向 {$userEmailSuccessCount} 位用户发送生日祝福邮件成功"); } - if ($userFailCount > 0) { - $this->error("共 {$userFailCount} 位用户短信发送失败"); + if ($userEmailFailCount > 0) { + $this->error("共 {$userEmailFailCount} 位用户邮件发送失败"); } // 如果有生日用户,给管理员发送短信 diff --git a/app/Models/BirthdayMessage.php b/app/Models/BirthdayMessage.php index 84e921d..bf639a6 100644 --- a/app/Models/BirthdayMessage.php +++ b/app/Models/BirthdayMessage.php @@ -6,7 +6,7 @@ class BirthdayMessage extends SoftDeletesModel { /** - * 随机获取一条启用的生日祝福文案 + * 随机获取一条启用的生日祝福文案(短信模板) * * @return string|null */ @@ -18,5 +18,42 @@ class BirthdayMessage extends SoftDeletesModel return $message ? $message->content : null; } + + /** + * 随机获取一条启用的短信模板 + * + * @return string|null + */ + public static function getRandomSmsMessage() + { + $message = self::where('status', 1) + ->where('type', 1) + ->inRandomOrder() + ->first(); + + return $message ? $message->content : null; + } + + /** + * 随机获取一条启用的邮件模板 + * + * @return array|null 返回包含 subject 和 content 的数组,如果没有找到则返回 null + */ + public static function getRandomEmailMessage() + { + $message = self::where('status', 1) + ->where('type', 2) + ->inRandomOrder() + ->first(); + + if (!$message) { + return null; + } + + return [ + 'subject' => $message->email_subject ?: '生日快乐', + 'content' => $message->content, + ]; + } } diff --git a/database/migrations/2026_01_14_164124_add_type_and_email_subject_to_birthday_messages_table.php b/database/migrations/2026_01_14_164124_add_type_and_email_subject_to_birthday_messages_table.php new file mode 100644 index 0000000..5a19445 --- /dev/null +++ b/database/migrations/2026_01_14_164124_add_type_and_email_subject_to_birthday_messages_table.php @@ -0,0 +1,39 @@ +tinyInteger('type')->default(1)->after('id')->comment('模板类型:1=短信模板,2=邮件模板'); + // 添加邮件标题字段(仅邮件模板使用) + $table->string('email_subject')->nullable()->after('content')->comment('邮件标题,支持{username}占位符'); + }); + + // 将现有所有记录标记为短信模板(type=1) + DB::table('birthday_messages')->whereNull('type')->update(['type' => 1]); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('birthday_messages', function (Blueprint $table) { + $table->dropColumn(['type', 'email_subject']); + }); + } +}; +