Контроль дневных лимитов SMS через Limitation

17.12.2025

При массовой отправке SMS-сообщений критически важно контролировать количество отправленных сообщений. Превышение лимитов провайдера приводит к блокировке аккаунта или дополнительным расходам. Модуль messageservice предоставляет класс Bitrix\MessageService\Sender\Limitation для управления дневными лимитами.

Установка дневного лимита

Для каждого провайдера и номера отправителя можно задать индивидуальный лимит:

        use Bitrix\MessageService\Sender\Limitation;

// Устанавливаем лимит 1000 SMS в день для sms.ru с номера +79001234567
Limitation::setDailyLimit('smsru', '+79001234567', 1000);

// Лимит для Twilio
Limitation::setDailyLimit('twilio', 'MGXXXXXXXXXX', 500);

    

После установки лимита все отложенные сообщения автоматически возвращаются в очередь обработки.

Проверка текущего состояния лимитов

Метод getDailyLimits() возвращает полную информацию о лимитах всех провайдеров:

        use Bitrix\MessageService\Sender\Limitation;

$limits = Limitation::getDailyLimits();

foreach ($limits as $key => $data)
{
    // $key = 'smsru:+79001234567'
    echo sprintf(
        "Провайдер: %s, Номер: %s, Лимит: %d, Отправлено: %d\n",
        $data['senderId'],
        $data['fromId'],
        $data['limit'],
        $data['current']
    );
}

    

Проверка лимита перед отправкой

Метод checkDailyLimit() проверяет, доступна ли отправка:

        use Bitrix\MessageService\Sender\Limitation;
use Bitrix\Main\Diag\EventLogger;
use Psr\Log\LogLevel;

$senderId = 'smsru';
$fromNumber = '+79001234567';

if (Limitation::checkDailyLimit($senderId, $fromNumber))
{
    // Лимит не превышен — можно отправлять
    $message = SmsManager::createMessage([
        'MESSAGE_TO' => '+79009876543',
        'MESSAGE_BODY' => 'Ваш код подтверждения: 123456',
    ]);
    $message->send();
}
else
{
    // Лимит исчерпан — сообщение будет отложено
    // Можно уведомить администратора
    $logger = new EventLogger('messageservice', 'SMS_LIMIT_EXCEEDED');
    $logger->log(
        LogLevel::WARNING,
        'Дневной лимит SMS исчерпан для ' . $senderId
    );
}

    

Настройка времени повторной отправки

Если сообщение отложено из-за лимита, оно будет отправлено на следующий день. Время повторной попытки настраивается:

        use Bitrix\MessageService\Sender\Limitation;

// Повторная отправка в 9:00 по московскому времени
Limitation::setRetryTime([
    'h' => 9,
    'i' => 0,
    'auto' => false,
    'tz' => 'Europe/Moscow',
]);

// Получение текущих настроек
$retryTime = Limitation::getRetryTime();
// ['h' => 9, 'i' => 0, 'auto' => false, 'tz' => 'Europe/Moscow']

    

Класс Limitation обеспечивает централизованное управление лимитами отправки SMS для всех провайдеров и защищает от превышения квот.

Опубликовано 2 дня назад