📄 SendSmsJob.cs
using HuaweiWifiSms.Grpc;
using Microsoft.Extensions.Logging;
using Quartz;

internal sealed class SendSmsJob(SmsSender.SmsSenderClient smsSender, ILogger<SendSmsJob> logger) : IJob
{
    public static JobKey Key { get; } = JobKey.Create(nameof(SendSmsJob));

    public async Task Execute(IJobExecutionContext context)
    {
        var phoneNumber = context.MergedJobDataMap.GetString("phoneNumber")!;
        var message = context.MergedJobDataMap.GetString("message")!;

        var response = await smsSender.SendSmsAsync(
            new SmsRequest { RecipientPhoneNumber = phoneNumber, Content = message },
            cancellationToken: context.CancellationToken
        );

        if (response.Status is SmsStatus.Success)
        {
            logger.LogSmsSent(phoneNumber);
        }
        else
        {
            logger.LogSmsFailed(phoneNumber, response.Status);
        }
    }
}

internal static partial class SendSmsJobLoggerExtensions
{
    [LoggerMessage(LogLevel.Information, "Successfully sent SMS to {PhoneNumber}")]
    public static partial void LogSmsSent(this ILogger logger, string phoneNumber);

    [LoggerMessage(LogLevel.Error, "Failed to send SMS to {PhoneNumber} with status {SmsStatus}")]
    public static partial void LogSmsFailed(this ILogger logger, string phoneNumber, SmsStatus smsStatus);
}