• Модуль: sender
  • Путь к файлу: ~/bitrix/modules/sender/lib/postingmanager.php
  • Класс: BitrixSenderPostingManager
  • Вызов: PostingManager::send
static function send($id, $timeout = 0, $maxMailCount = 0)
{
	$letter = EntityLetter::createInstanceByPostingId($id);
	$sender = new PostingSender($letter);

	$sender->setThreadStrategy(
		MessageMarketingFb::checkSelf($sender->getMessage()->getCode()) ?
			ThreadStrategyContext::buildStrategy(
				IThreadStrategy::SINGLE
			): RuntimeEnv::getThreadContext()
	)
	->setLimit($maxMailCount)
	->setTimeout($timeout)
	->send();

	static::$threadId = $sender->getThreadStrategy()->getThreadId();

	switch ($sender->getResultCode())
	{
		case PostingSender::RESULT_CONTINUE:
			$result = static::SEND_RESULT_CONTINUE;
			break;
		case PostingSender::RESULT_ERROR:
			$result = static::SEND_RESULT_ERROR;
			break;
		case PostingSender::RESULT_WAITING_RECIPIENT:
			$result = static::SEND_RESULT_WAITING_RECIPIENT;
			break;
		case PostingSender::RESULT_WAIT:
			$result = static::SEND_RESULT_WAIT;
			break;
		case PostingSender::RESULT_SENT:
		default:
			$result = static::SEND_RESULT_SENT;
			break;
	}

	$limiter = $sender->getExceededLimiter();
	if ($result === static::SEND_RESULT_CONTINUE && $limiter)
	{
		// update planned date only with timed limit;

		if ($limiter->getParameter('sendingStart'))
		{
			$currentTime = $limiter->getParameter('currentTime');
			$sendingStart = $limiter->getParameter('sendingStart');
			$sendingStartDate = (new DateTime())->setTimestamp($sendingStart);

			$sendingStartDate = $currentTime > $sendingStart
				? $sendingStartDate->add(DateInterval::createFromDateString('1 day'))
				: $sendingStartDate;

			$date = TypeDateTime::createFromPhp($sendingStartDate);
		}
		elseif ($limiter->getUnit())
		{
			$date = new TypeDate();
			$date->add('1 day');
		}
		else
		{
			$date = new TypeDateTime();
			$date->add('2 minute');
		}

		$letter->getState()->updatePlannedDateSend($date);
	}

	return $result;
}