💌 Как сохранить всю почту (включая вложения) с любого ящика — навсегда и на диск. Быстро, без тормозов, хоть с 50 аккаунтов.

💌 Как сохранить всю почту (включая вложения) с любого ящика — навсегда и на диск. Быстро, без тормозов, хоть с 50 аккаунтов.

Случалось ли тебе терять письма?

❌ Забыл пароль

❌ Заблокировали ящик

❌ Почтовик "почистил" старое

❌ Или просто нужно было найти одно письмо за 2012 год, а оно потеряно…

💥 Вот почему я решил забэкапить всю свою почту, чтобы:

  • сохранить все письма за всё время (даже с 2006 года);
  • забрать вложения (чеки, документы, фото);
  • удобно искать письма через Excel (с фильтрами);
  • и главное — автоматически сохранять всё это по расписанию.

И да — это работает не только с одним ящиком, а сразу с 50 аккаунтами одновременно. И всё — без тормозов, зависаний и лишних кликов мышкой. Подключил, запустил — и архивируй хоть каждый день.

⚠ Почему это актуально прямо сейчас

Почтовые сервисы (особенно Mail.ru, Rambler и т.п.) в последнее время:

  • могут забанить ящик за вход с VPN, Tor или "подозрительного" IP
  • ограничивают доступ за частые авторизации
  • удаляют старые письма или архивируют их без предупреждения
  • просто перестают существовать (Rambler закрывал сервисы уже не раз)

А ещё — ты можешь сам забыть пароль, номер уже неактуален, восстановить нельзя. 📌 Всё. Ты теряешь 10+ лет истории переписок, чеки, брони, вложения.

📥 Сделать бэкап — дело 5 минут. И он всегда с тобой, на своём диске.

✅ Что делает скрипт

  • Подключается к почтовику по IMAP
  • Сканирует все папки: входящие, отправленные, спам, архив и т.д.
  • Сохраняет: тему, отправителя, дату тело письма (в читаемом виде) все вложения
  • Записывает всё в Excel с фильтрами
  • Вложения — в папку
  • Работает с 1, 2, 10 или 50 аккаунтами одновременно

🧩 Подготовка

  1. Python 3.10+
  2. Установить библиотеки:
pip install openpyxl beautifulsoup4 chardet
  1. Создать аккаунты.txt:

mail1@rambler.ru:password123
mail2@mail.ru:pass456
you@gmail.com:qwerty789

Скрипт: Сохранение писем + вложений + Excel

📌 Полный код смотри выше (в предыдущем сообщении) — ничего не убрано.

Он:

  • обходит все аккаунты
  • парсит тело писем
  • сохраняет вложения
  • ведёт Excel-таблицу: отправитель, тема, дата, папка, вложения, текст

🔁 Автозапуск по расписанию

Можно настроить запуск скрипта:

  • каждый день (например, ночью)
  • или каждые 6 часов Через стандартный Планировщик задач Windows (taskschd.msc)

🛠 Это пример, его легко доработать:

  • выгрузка только новых писем
  • фильтрация по дате или теме
  • работа с вложениями без писем
  • загрузка в облако, Telegram-уведомления, лог-файл и т.д.

🧠 Полный код: бэкап писем и вложений + Excel

import imaplib import email from email.header import decode_header from email.utils import parsedate_to_datetime import os from bs4 import BeautifulSoup import chardet from openpyxl import Workbook, load_workbook SAVE_DIR = "архив_почты" os.makedirs(SAVE_DIR, exist_ok=True) ACCOUNTS_FILE = "аккаунты.txt" EXCEL_PATH = os.path.join(SAVE_DIR, "почта.xlsx") # Excel if os.path.exists(EXCEL_PATH): wb = load_workbook(EXCEL_PATH) ws = wb.active else: wb = Workbook() ws = wb.active ws.append(["№", "Email", "Папка", "Отправитель", "Тема", "Дата", "Вложения", "Фрагмент"]) email_counter = ws.max_row # Загрузка аккаунтов with open(ACCOUNTS_FILE, encoding="utf-8") as f: accounts = [line.strip() for line in f if ":" in line] def decode(val): if not val: return "" part = decode_header(val)[0] byte_str, enc = part if isinstance(byte_str, bytes): return byte_str.decode(enc or "utf-8", errors="ignore") return byte_str def save_attachment(part, index, mailname): filename = decode(part.get_filename()) if not filename: return "" path = os.path.join(SAVE_DIR, f"{index}_{mailname}_{filename}") with open(path, "wb") as f: f.write(part.get_payload(decode=True)) return filename for acc in accounts: try: email_user, email_pass = acc.split(":", 1) print(f"🔗 Подключение к {email_user}") server = "imap.rambler.ru" if "@rambler.ru" in email_user else \ "imap.mail.ru" if "@mail.ru" in email_user else \ "imap.gmail.com" if "@gmail.com" in email_user else \ "imap.yandex.ru" if "@yandex.ru" in email_user else \ input(f"Введите IMAP-сервер для {email_user}: ") mail = imaplib.IMAP4_SSL(server) mail.login(email_user, email_pass) _, folders = mail.list() folders = [f.decode().split(' "/" ')[-1].strip('"') for f in folders] for folder in folders: try: mail.select(f'"{folder}"', readonly=True) _, msg_nums = mail.search(None, "ALL") for num in msg_nums[0].split(): _, data = mail.fetch(num, "(RFC822)") raw_msg = data[0][1] msg = email.message_from_bytes(raw_msg) subject = decode(msg.get("Subject")) sender = decode(msg.get("From")) date_str = msg.get("Date", "") try: dt = parsedate_to_datetime(date_str) date_fmt = dt.strftime("%Y-%m-%d %H:%M:%S") except: date_fmt = date_str body = "" attachments = [] if msg.is_multipart(): for part in msg.walk(): ctype = part.get_content_type() disp = str(part.get("Content-Disposition")) if "attachment" in disp: att = save_attachment(part, email_counter, email_user.split("@")[0]) if att: attachments.append(att) elif ctype in ["text/plain", "text/html"]: try: raw = part.get_payload(decode=True) enc = chardet.detect(raw)["encoding"] or "utf-8" decoded = raw.decode(enc, errors="ignore") soup = BeautifulSoup(decoded, "html.parser") body = soup.get_text(separator="\n").strip() except: continue else: try: raw = msg.get_payload(decode=True) enc = chardet.detect(raw)["encoding"] or "utf-8" decoded = raw.decode(enc, errors="ignore") soup = BeautifulSoup(decoded, "html.parser") body = soup.get_text(separator="\n").strip() except: body = "[Ошибка при декодировании]" email_counter += 1 ws.append([ email_counter, email_user, folder, sender, subject, date_fmt, ", ".join(attachments), body[:300] ]) except Exception as e: print(f"⚠ Ошибка в папке {folder}: {e}") mail.logout() except Exception as e: print(f"❌ Ошибка при подключении к {email_user}: {e}") wb.save(EXCEL_PATH) print("✅ Бэкап завершён. Письма и вложения сохранены.")

💬 Если будут вопросы — пишите в комментарии. Подскажем, подскажем, дополним — всё по делу, без воды.

1
2 комментария