Перейти к содержимому
Вы сказали:
PHP реализации сохранения письма через IMAP Расписывать код очень подробно писать процедурный код Получаем полностью все письма из INBOX Получаем полное тело письма полностью как оно приходит с сервера почтового Сохранение тела письма происходит в два этапа 1 Читаем тело письма находим UID, ПОЧТОВЫЙ ЯЩИК ОТПРАВИТЕЛЯ, И ДАТУ ПИСЬМА И создаём из этого через md5 кэш письма который дальше будем использовать Дальше сохраняем это в базе данных sqlite кэш письма, почтовый ящик, дату письма, тема письма, сообщение письма, и если есть прикрепленные документы только имена всех файлов что прикреплены сохранить массивом в json А так же дату письма как временную метку timestamp 2 Этапа сохраняем файл тела письма по пути attach/год/месяц/день/папка кэш письма/body и заархивировать тело письма в архив с именем файла timestamp даты письма
ChatGPT сказал:

Вот подробная пошаговая процедурная реализация на PHP, которая:

  • Подключается к IMAP-серверу

  • Получает все письма из папки INBOX

  • Парсит письма (получает тело, отправителя, дату, тему, UID, вложения и т.д.)

  • Создаёт кеш на основе этих данных (в SQLite и в виде файлов)

  • Сохраняет тело письма в zip-архив по пути attach/год/месяц/день/хеш/body


📁 Структура файлов

  • imap_fetch.php – основной скрипт

  • cache.sqlite – база данных SQLite

  • attach/YYYY/MM/DD/[md5-хеш]/body/[timestamp].zip – архив письма


📜 Файл: imap_fetch.php

php
<?php // ==== 1. Подключаемся к IMAP ==== $mailbox = '{imap.example.com:993/imap/ssl}INBOX'; $username = 'your-email@example.com'; $password = 'your-password'; $imap = imap_open($mailbox, $username, $password); if (!$imap) { die("Ошибка подключения к IMAP: " . imap_last_error()); } // ==== 2. Получаем список всех писем ==== $emails = imap_search($imap, 'ALL'); if (!$emails) { die("Писем не найдено."); } // ==== 3. Подключаем SQLite ==== $db = new SQLite3('cache.sqlite'); $db->exec("CREATE TABLE IF NOT EXISTS mails ( id INTEGER PRIMARY KEY AUTOINCREMENT, cache TEXT UNIQUE, sender TEXT, subject TEXT, date TEXT, timestamp INTEGER, attachments TEXT, body TEXT )"); // ==== 4. Обработка каждого письма ==== foreach ($emails as $email_number) { // Получаем UID письма $uid = imap_uid($imap, $email_number); // Заголовки письма $overview = imap_fetch_overview($imap, $email_number, 0)[0]; $subject = isset($overview->subject) ? imap_utf8($overview->subject) : '(нет темы)'; $from = isset($overview->from) ? $overview->from : '(неизвестен)'; $date = isset($overview->date) ? $overview->date : date('r'); $timestamp = strtotime($date); // Получаем полное тело письма (сырой текст) $raw_body = imap_fetchbody($imap, $email_number, "", FT_PEEK | FT_UID); // Кэш-хеш письма $cache_key = md5($uid . $from . $date); // ==== 1. Сохраняем в SQLite ==== // Парсим структуру для получения вложений $structure = imap_fetchstructure($imap, $email_number); $attachments = []; if (isset($structure->parts) && count($structure->parts)) { for ($i = 0; $i < count($structure->parts); $i++) { $part = $structure->parts[$i]; if (isset($part->disposition) && strtoupper($part->disposition) === 'ATTACHMENT') { $params = $part->dparameters ?? $part->parameters; foreach ($params as $param) { if (strtolower($param->attribute) == 'filename') { $attachments[] = $param->value; } } } } } $json_attachments = json_encode($attachments); // Проверяем наличие в базе $stmt = $db->prepare("SELECT COUNT(*) as count FROM mails WHERE cache = :cache"); $stmt->bindValue(':cache', $cache_key, SQLITE3_TEXT); $res = $stmt->execute()->fetchArray(SQLITE3_ASSOC); if ($res['count'] == 0) { // Вставляем в БД $stmt = $db->prepare("INSERT INTO mails (cache, sender, subject, date, timestamp, attachments, body) VALUES (:cache, :sender, :subject, :date, :timestamp, :attachments, :body)"); $stmt->bindValue(':cache', $cache_key); $stmt->bindValue(':sender', $from); $stmt->bindValue(':subject', $subject); $stmt->bindValue(':date', $date); $stmt->bindValue(':timestamp', $timestamp); $stmt->bindValue(':attachments', $json_attachments); $stmt->bindValue(':body', $raw_body); $stmt->execute(); } // ==== 2. Сохраняем файл ==== $year = date('Y', $timestamp); $month = date('m', $timestamp); $day = date('d', $timestamp); $dir_path = __DIR__ . "/attach/$year/$month/$day/$cache_key/body"; if (!is_dir($dir_path)) { mkdir($dir_path, 0777, true); } $zip_path = "$dir_path/$timestamp.zip"; // Создаем ZIP-архив с телом письма $zip = new ZipArchive(); if ($zip->open($zip_path, ZipArchive::CREATE) === TRUE) { $zip->addFromString("body.eml", $raw_body); $zip->close(); } else { echo "Не удалось создать архив $zip_path\n"; } } imap_close($imap); echo "Готово!\n";

🔧 Пример настройки

Замените эти строки своими данными:

php
$mailbox = '{imap.example.com:993/imap/ssl}INBOX'; $username = 'your-email@example.com'; $password = 'your-password';

📦 Пример структуры в attach/

arduino
attach/ └── 2025/ └── 07/ └── 08/ └── 9a4df9c1b6ab92d.../ └── body/ └── 1720435200.zip

📌 Зависимости

  • PHP с поддержкой imap, sqlite3, zip

  • Создание базы и директорий происходит автоматически


Хочешь также парсить HTML-тело или сохранять вложения? Я могу дополнить.


ChatGPT может допускать ошибки. Рекомендуем проверять важную информацию.