fix(IMAP): исправить загрузку вложений — setFetchBody(true) необходим для структуры
Проблема: setFetchBody(false) не загружал структуру письма, поэтому getAttachments() возвращал пустой список. Исправления: - FetchUnreadEmailsTask: setFetchBody(true) для загрузки структуры (вложения) - FetchUnreadEmailsTask: конвертация Attribute в строку для subject - config/imap.php: убраны fetch_body/fetch_flags (контроль на уровне Query) - Обновлена документация Fix: "В письме не найдено вложений" ошибка при обработке email Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
@@ -19,38 +19,40 @@ Allowed memory size of 268435456 bytes exhausted (tried to allocate 6291480 byte
|
||||
|
||||
### Уровень 1: Конфигурация (config/imap.php)
|
||||
|
||||
Добавлены настройки для предотвращения загрузки тел сообщений:
|
||||
Добавлены настройки для предотвращения загрузки лишних данных:
|
||||
|
||||
```php
|
||||
'options' => [
|
||||
'fetch' => \Webklex\PHPIMAP\IMAP::FT_PEEK, // Не помечать как прочитанные
|
||||
'message_key' => 'id', // Использовать UID
|
||||
'fetch_body' => false, // НЕ загружать тела
|
||||
'fetch_flags' => false, // НЕ загружать флаги
|
||||
'fetch_limit' => env('IMAP_FETCH_LIMIT', 20), // Лимит сообщений
|
||||
],
|
||||
```
|
||||
|
||||
**Результат:** Загружаются только заголовки писем (subject, from, date), тела и вложения НЕ загружаются.
|
||||
**Важно:** `fetch_body` и `fetch_flags` контролируются на уровне Query (`setFetchBody()`, `setFetchFlags()`), а не в конфиге, чтобы не ломать загрузку вложений.
|
||||
|
||||
**Результат:** Письма не помечаются как прочитанные автоматически, используется лимит на количество сообщений.
|
||||
|
||||
---
|
||||
|
||||
### Уровень 2: Оптимизация кода
|
||||
|
||||
#### 2A. FetchUnreadEmailsTask
|
||||
- Добавлен `setFetchBody(false)` — явное отключение загрузки тел
|
||||
- Добавлен `setFetchFlags(false)` — отключение загрузки флагов
|
||||
- Добавлен параметр `$limit` для контроля количества сообщений
|
||||
- Добавлен параметр `$offset` для пагинации
|
||||
- `setFetchBody(true)` — загружаем структуру письма (необходимо для вложений)
|
||||
- `setFetchFlags(false)` — отключаем загрузку флагов (экономия памяти)
|
||||
- Параметр `$limit` для контроля количества сообщений
|
||||
- Добавлен мониторинг памяти через `MemoryAwareTrait`
|
||||
|
||||
```php
|
||||
$query = $folder->messages()
|
||||
->unseen()
|
||||
->setFetchBody(false) // ← КРИТИЧНО
|
||||
->setFetchFlags(false)
|
||||
->limit($limit);
|
||||
->setFetchBody(true) // Загружаем структуру (нужна для вложений)
|
||||
->setFetchFlags(false) // Флаги не нужны
|
||||
->limit($limit); // Лимит сообщений
|
||||
```
|
||||
|
||||
**Важно:** `setFetchBody(true)` необходим для загрузки структуры письма, которая содержит информацию о вложениях. Без этого `getAttachments()` возвращает пустой список.
|
||||
|
||||
#### 2B. FetchEmailNewsAction
|
||||
- Реализована **batch-обработка** (по 10 писем за цикл)
|
||||
- Добавлена **принудительная сборка мусора** после каждого batch
|
||||
|
||||
Reference in New Issue
Block a user