Контроль дневных лимитов SMS через Limitation
При массовой отправке 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 для всех провайдеров и защищает от превышения квот.