> For the complete documentation index, see [llms.txt](https://docs.iexexchanger.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.iexexchanger.com/guide/uvedomleniya/ocheredi-i-pisma.md).

# Очереди и письма

В iEXExchanger отправка писем и часть системных задач может выполняться через очереди.

Очереди позволяют системе не выполнять тяжёлые операции сразу во время действия пользователя, а передавать их в фоновую обработку.

Например, клиент создаёт заявку, система быстро показывает результат, а письмо клиенту или администратору отправляется отдельно в фоне.

{% hint style="info" %}

## Важное уведомление о почтовом драйвере

iEXExchanger использует стандартный почтовый механизм Laravel Framework, который работает через Symfony Mailer.

Это официальный механизм Laravel для отправки писем через SMTP, Resend и другие почтовые службы.

Разработчики iEXExchanger не изменяют внутренний код почтового драйвера Laravel.

Поэтому если при настройке почты возникают ошибки соединения, авторизации, SSL/TLS, timeout, блокировка порта или отказ почтового сервиса, чаще всего причина находится не в коде системы, а в настройках почтовой службы, сервера, DNS или очередей.

Перед обращением в поддержку проверьте:

* SMTP host;
* SMTP port;
* тип шифрования;
* логин и пароль;
* пароль приложения;
* e-mail отправителя;
* SPF, DKIM и DMARC;
* доступность портов `465` и `587` на сервере;
* ограничения почтового провайдера;
* работу очередей, если письма отправляются не сразу.

Если сервер не может подключиться к SMTP-службе, обратитесь в поддержку хостинга или сервера и попросите проверить исходящие подключения к нужному SMTP-хосту и порту.
{% endhint %}

## Что такое очередь

Очередь — это механизм фоновой обработки задач.

Он позволяет системе выполнять часть операций не сразу, а отдельно от основного действия пользователя.

Например, пользователь создал заявку.

Система может:

* сразу создать заявку;
* показать пользователю результат;
* отправить письмо позже через очередь;
* отправить Telegram-уведомление в фоне;
* выполнить пересчёт, экспорт или другую тяжёлую задачу отдельно.

Это помогает не замедлять сайт и панель управления.

***

## Для чего очереди используются в iEXExchanger

В iEXExchanger очереди могут использоваться для разных задач:

* отправка e-mail уведомлений;
* отправка Telegram-уведомлений;
* уведомления безопасности;
* подтверждение e-mail;
* уведомления о новых заявках;
* уведомления администраторам;
* экспорт заявок;
* архивирование заявок;
* пересчёт заявок;
* пересчёт уровней клиентов;
* обработка медиафайлов;
* аналитика;
* webhooks;
* фоновые задачи модулей.

Поэтому параметр `QUEUE_DRIVER` влияет не только на письма, а на всю систему фоновых задач.

***

## Где настраивается QUEUE\_DRIVER

Параметр очереди настраивается на сервере в `.env` файле Backend.

Обычно файл находится в директории Backend-проекта:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/MDuqJRjp8L1cHG9i4sRB" %}
[Файлы сайта в FastPanel](/help-center/upravlenie-serverom/panel-fastpanel/faily-saita-v-fastpanel.md)
{% endcontent-ref %}

```
/var/www/имя_пользователя/data/www/app.ваш_домен/.env
```

Пример:

```
QUEUE_DRIVER=sync
```

или:

```
QUEUE_DRIVER=redis
```

После изменения `.env` обычно нужно очистить конфигурационный кеш и перезапустить процессы очередей.

Эти действия должен выполнять специалист, который обслуживает сервер.

## Какие QUEUE\_DRIVER доступны

В проекте доступны стандартные драйверы очередей Laravel:

```
sync
database
beanstalkd
sqs
redis
null
```

В обычной эксплуатации чаще всего используются:

```
sync
database
redis
```

Для рабочего production-сервера рекомендуется:

```
QUEUE_DRIVER=redis
```

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

```
QUEUE_DRIVER=sync
```

## QUEUE\_DRIVER=sync

```
QUEUE_DRIVER=sync
```

`sync` означает, что задачи не ставятся в фоновую очередь, а выполняются сразу.

Например, если система должна отправить письмо, она будет пытаться отправить его прямо во время действия пользователя или администратора.

{% stepper %}
{% step %}

### Когда использовать sync

`sync` можно использовать:

* для тестовой установки;
* для простого проекта с небольшой нагрузкой;
* для быстрой диагностики почты;
* если на сервере не настроен Redis;
* если Horizon временно не используется;
* если нужно проверить, работает ли сама отправка писем без очередей.
  {% endstep %}

{% step %}

### Плюсы sync

* не нужен Horizon;
* не нужен отдельный queue worker;
* проще настройка;
* ошибки отправки часто видны сразу;
* удобно проверять почту.
  {% endstep %}

{% step %}

### Минусы sync

* действия пользователя могут выполняться дольше;
* если SMTP-сервер долго отвечает, страница может ждать;
* при ошибке почтового сервиса действие может завершиться ошибкой;
* тяжёлые задачи могут замедлять админку или сайт;
* отложенные задачи работают менее гибко, чем в полноценной очереди.
  {% endstep %}
  {% endstepper %}

## Когда sync полезен для проверки почты

Если письма не отправляются через Horizon, можно временно установить:

```
QUEUE_DRIVER=sync
```

После этого отправьте тестовое письмо из панели управления.

Если при `sync` письмо отправилось, значит почтовые настройки рабочие, а проблема была в Redis, Horizon или обработчике очередей.

Если при `sync` письмо не отправилось, значит проблема не в Horizon, а в SMTP/API-настройках, DNS, пароле, портах или почтовом сервисе.

***

## QUEUE\_DRIVER=database

```
QUEUE_DRIVER=database
```

`database` означает, что задачи сохраняются в таблицу базы данных, а затем обрабатываются отдельным процессом очереди.

{% stepper %}
{% step %}

### Когда использовать database

Этот режим можно использовать:

* если Redis недоступен;
* если проект небольшой;
* если нужна простая фоновая очередь без Horizon;
* если сервер не позволяет использовать Redis.
  {% endstep %}

{% step %}

### Что нужно для database

Для работы нужны таблицы очередей:

```
jobs
failed_jobs
job_batches
```

Также должен быть запущен обработчик очереди:

```bash
php artisan queue:work
```

Обычно такой процесс запускают через Supervisor или другой менеджер процессов.
{% endstep %}

{% step %}

### Плюсы database

* не нужен Redis;
* задачи не выполняются прямо в момент запроса;
* можно хранить неуспешные задачи;
* настройка проще, чем Redis + Horizon.
  {% endstep %}

{% step %}

### Минусы database

* работает медленнее Redis;
* при большой нагрузке увеличивает нагрузку на базу данных;
* нет удобной панели Horizon;
* нужно отдельно следить за worker-процессом.
  {% endstep %}
  {% endstepper %}

***

## QUEUE\_DRIVER=redis

```
QUEUE_DRIVER=redis
```

`redis` — рекомендуемый режим для production-сервера.

В этом режиме задачи складываются в Redis и обрабатываются фоновыми процессами.

В iEXExchanger Horizon настроен именно для работы с Redis-очередями.

{% stepper %}
{% step %}

### Когда использовать redis

Используйте `redis`, если:

* проект работает в production;
* есть регулярные уведомления;
* есть активные заявки;
* используются фоновые задачи;
* нужно, чтобы сайт не ждал отправку писем;
* нужен Horizon для контроля очередей;
* важна стабильная работа под нагрузкой.
  {% endstep %}

{% step %}

### Плюсы redis

* быстро работает;
* подходит для production;
* хорошо работает с Horizon;
* можно разделять очереди по приоритетам;
* удобно отслеживать ошибки;
* меньше нагрузка на базу данных по сравнению с database-очередью.
  {% endstep %}

{% step %}

### Минусы redis

* Redis должен быть установлен и запущен;
* Horizon должен быть правильно настроен;
* нужно следить за процессами;
* при остановленном Horizon задачи будут копиться и не выполняться.
  {% endstep %}
  {% endstepper %}

***

## Что такое Horizon

Horizon — это официальный инструмент Laravel для управления Redis-очередями.

Он позволяет:

* обрабатывать фоновые задачи;
* смотреть очереди;
* видеть ошибки задач;
* отслеживать скорость выполнения;
* контролировать нагрузку;
* разделять задачи по приоритетам.

В iEXExchanger Horizon используется для обработки Redis-очередей.

## Какие очереди слушает Horizon

В iEXExchanger Horizon может обрабатывать несколько очередей:

```
mail-high
high
default
media
mail-low
low
order-recount-scan
order-recount
presence
analytics
```

Простыми словами:

* `mail-high` — важные e-mail уведомления;
* `mail-low` — менее срочные e-mail уведомления;
* `default` — обычные фоновые задачи;
* `low` — низкоприоритетные задачи;
* `media` — обработка медиафайлов;
* `analytics` — аналитические задачи;
* `order-recount` — задачи пересчёта заявок;
* `presence` — задачи присутствия и онлайн-статуса.

***

## Когда Horizon нужен

Horizon нужен, если в `.env` указано:

```
QUEUE_DRIVER=redis
```

В этом режиме фоновые задачи не выполняются сами по себе.

Их должен обрабатывать Horizon.

Если Horizon остановлен, письма и другие задачи могут не отправляться сразу, а будут ожидать обработки в очереди.

## Когда Horizon можно не использовать

Horizon можно не использовать, если система работает в режиме:

```
QUEUE_DRIVER=sync
```

В этом случае задачи выполняются сразу, без Redis и Horizon.

Но это простой или временный режим.

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

```
QUEUE_DRIVER=redis
```

и запущенный Horizon.

## Как временно отключить Horizon для проверки почты

Если письма не отправляются и нужно понять, проблема в почтовых настройках или очереди, можно временно переключить очередь на `sync`.

В `.env` установите:

```
QUEUE_DRIVER=sync
```

После этого:

1. Очистите конфигурационный кеш.
2. Перезапустите Backend, если используется кеш конфигурации.
3. Отправьте тестовое письмо из панели управления.
4. Проверьте результат.

Если письмо отправилось — почта настроена правильно, нужно проверять Redis, Horizon или queue worker.

Если письмо не отправилось — проблема в почтовых настройках, сервере, DNS или почтовом провайдере.

После проверки рекомендуется вернуть production-настройку:

```
QUEUE_DRIVER=redis
```

## SMART\_NOTIFIER\_QUEUE

В системе уведомлений есть отдельный параметр:

```
SMART_NOTIFIER_QUEUE=true
```

Он отвечает за то, будут ли уведомления SmartNotifier ставиться в очередь.

Если указано:

```
SMART_NOTIFIER_QUEUE=true
```

уведомления отправляются через очередь.

Если указано:

```
SMART_NOTIFIER_QUEUE=false
```

уведомления SmartNotifier отправляются сразу, без постановки в очередь.

Важно понимать разницу:

`SMART_NOTIFIER_QUEUE` влияет на уведомления.

`QUEUE_DRIVER` влияет на всю очередь Laravel в целом.

## Разница между QUEUE\_DRIVER и SMART\_NOTIFIER\_QUEUE

{% stepper %}
{% step %}

### QUEUE\_DRIVER

Определяет, как Laravel обрабатывает все фоновые задачи.

Примеры:

```
QUEUE_DRIVER=sync
QUEUE_DRIVER=database
QUEUE_DRIVER=redis
```

Влияет на:

* письма;
* уведомления;
* экспорты;
* пересчёты;
* архивирование;
* аналитику;
* webhooks;
* другие фоновые задачи.
  {% endstep %}

{% step %}

### SMART\_NOTIFIER\_QUEUE

Определяет, ставить ли уведомления SmartNotifier в очередь.

Примеры:

```
SMART_NOTIFIER_QUEUE=true
SMART_NOTIFIER_QUEUE=false
```

Влияет именно на систему уведомлений SmartNotifier.
{% endstep %}
{% endstepper %}

***

## Рекомендуемые режимы

{% stepper %}
{% step %}

### Для production-сервера

Рекомендуется:

```
QUEUE_DRIVER=redis
SMART_NOTIFIER_QUEUE=true
```

При такой настройке должен быть запущен Horizon.

Это лучший режим для рабочего обменника.
{% endstep %}

{% step %}

### Для простого сервера без Horizon

Можно использовать:

```
QUEUE_DRIVER=sync
SMART_NOTIFIER_QUEUE=true
```

В этом случае задачи будут выполняться сразу через `sync`-драйвер.
{% endstep %}

{% step %}

### Для диагностики почты

Можно временно использовать:

```
QUEUE_DRIVER=sync
```

Так проще проверить, работает ли SMTP/API-отправка без участия Horizon.
{% endstep %}
{% endstepper %}

***

### Для отключения очереди только у уведомлений

Можно использовать:

```
SMART_NOTIFIER_QUEUE=false
```

В этом случае уведомления SmartNotifier будут отправляться сразу.

Используйте этот вариант только если понимаете, зачем отключаете очередь именно для уведомлений.

## Что происходит, если Horizon не работает

Если используется:

```
QUEUE_DRIVER=redis
```

и Horizon остановлен, возможны такие симптомы:

* тестовое письмо не приходит;
* клиентские письма не отправляются;
* уведомления администраторам не приходят;
* задачи экспорта не выполняются;
* архивирование не запускается;
* пересчёты не обрабатываются;
* фоновые задачи остаются в ожидании.

В этом случае проверьте:

* запущен ли Redis;
* запущен ли Horizon;
* не упал ли процесс Horizon;
* нет ли ошибок в логах;
* не переполнены ли очереди;
* правильно ли указан `QUEUE_DRIVER=redis`.

***

## Как понять, проблема в почте или в очереди

{% stepper %}
{% step %}

### Отправьте тестовое письмо

Откройте раздел: **«Настройки» — «Общие настройки» — «Уведомления» — «E-mail уведомления»**

Нажмите: **Тестовое сообщение**

Если письмо не приходит, переходите к следующей проверке.
{% endstep %}

{% step %}

### Временно включите sync

В `.env` временно установите:

```
QUEUE_DRIVER=sync
```

Повторите отправку тестового письма.
{% endstep %}

{% step %}

### Результат проверки

Если при `sync` письмо пришло:

```
Почта настроена правильно, нужно проверять Horizon, Redis или queue worker.
```

Если при `sync` письмо не пришло:

```
Проблема в почтовых настройках, SMTP/API, DNS, портах, пароле или ограничениях почтового сервиса.
```

{% endstep %}
{% endstepper %}

***

## Какие ошибки не связаны с Horizon

Horizon не исправляет ошибки почтового сервиса.

Если SMTP или API-почта возвращает ошибку, нужно проверять настройки почты, DNS или сервера.

Например:

* неверный пароль;
* неправильный host;
* неправильный port;
* неверный SSL/TLS;
* authentication failed;
* relaying denied;
* connection refused;
* connection timeout;
* sender address rejected;
* domain not verified;
* SPF/DKIM не настроены.

Horizon отвечает только за выполнение фоновых задач.

Он не меняет правила SMTP-провайдера и не исправляет ошибки авторизации или DNS.

***

## Что лучше выбрать

{% stepper %}
{% step %}

### Если проект маленький

Можно начать с:

```
QUEUE_DRIVER=sync
```

Но если заявок и уведомлений станет больше, лучше перейти на Redis + Horizon.
{% endstep %}

{% step %}

### Если проект рабочий и принимает заявки

Рекомендуется:

```
QUEUE_DRIVER=redis
```

и запущенный Horizon.
{% endstep %}

{% step %}

### Если Redis недоступен

Можно использовать:

```
QUEUE_DRIVER=database
```

Но нужно настроить queue worker.
{% endstep %}

{% step %}

### Если нужно быстро проверить почту

Временно используйте:

```
QUEUE_DRIVER=sync
```

{% endstep %}
{% endstepper %}

***

## Что не рекомендуется использовать

{% stepper %}
{% step %}

### QUEUE\_DRIVER=null

```
QUEUE_DRIVER=null
```

Этот режим фактически отключает выполнение задач.

Для рабочего обменника его использовать не нужно.
{% endstep %}

{% step %}

### QUEUE\_DRIVER=beanstalkd

```
QUEUE_DRIVER=beanstalkd
```

Это отдельный сервер очередей.

В стандартной установке iEXExchanger обычно не используется.
{% endstep %}

{% step %}

### QUEUE\_DRIVER=sqs

```
QUEUE_DRIVER=sqs
```

Это Amazon SQS.

Подходит для отдельной облачной инфраструктуры, но для обычной установки обменника чаще всего не нужен.
{% endstep %}
{% endstepper %}

***

## Пример настройки для production

```
QUEUE_DRIVER=redis
SMART_NOTIFIER_QUEUE=true
QUEUE_FAILED_DRIVER=database-uuids
```

При такой настройке:

* задачи выполняются через Redis;
* уведомления ставятся в очередь;
* Horizon обрабатывает фоновые задачи;
* неуспешные задачи сохраняются в таблицу failed jobs.

## Пример настройки для диагностики почты

```
QUEUE_DRIVER=sync
SMART_NOTIFIER_QUEUE=true
```

При такой настройке:

* Horizon не нужен;
* письма отправляются сразу;
* проще увидеть ошибку SMTP/API;
* удобно проверять Gmail, Яндекс Почту, Zoho Mail и Resend.

После проверки рекомендуется вернуть production-режим.

## Пример настройки без очереди для уведомлений

```
QUEUE_DRIVER=redis
SMART_NOTIFIER_QUEUE=false
```

При такой настройке:

* остальные фоновые задачи могут работать через Redis;
* уведомления SmartNotifier будут отправляться сразу;
* Horizon продолжит обрабатывать другие очереди.

Используйте этот вариант только осознанно.

***

## Краткая памятка

`sync` — задачи выполняются сразу, Horizon не нужен.

`database` — задачи сохраняются в базу, нужен `queue:work`.

`redis` — production-режим, нужен Redis и Horizon.

`null` — задачи не выполняются, для рабочего сайта не использовать.

`SMART_NOTIFIER_QUEUE=false` — отключает очередь только для уведомлений SmartNotifier.

`QUEUE_DRIVER=sync` — отключает фоновую очередь для всех Laravel-задач и выполняет их сразу.

***

## Коротко

Для рабочего обменника рекомендуется использовать:

```
QUEUE_DRIVER=redis
SMART_NOTIFIER_QUEUE=true
```

и запущенный Horizon.

Если письма не отправляются, временно переключите `QUEUE_DRIVER` на `sync` и отправьте тестовое письмо.

Если при `sync` письмо пришло — проблема в очередях, Redis или Horizon.

Если при `sync` письмо не пришло — проблема в настройках почты, DNS, сервере или почтовом провайдере.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.iexexchanger.com/guide/uvedomleniya/ocheredi-i-pisma.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
