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

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

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

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

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

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

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

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

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

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

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

Почтовики всё чаще блокируют аккаунты без предупреждения:

  • за вход с VPN или других IP
  • за «подозрительную активность»
  • за то, что давно не заходили
  • и просто по причине "в целях безопасности"

Также письма могут удаляться автоматически (в «спаме», «черновиках» или просто из-за политики хранения). 📌 Один день — и вы теряете архив за 10+ лет.

Сделать бэкап = застраховать себя от потери важной информации.

🧩 Подготовка

Python 3.10+

Установить библиотеки:

pip install openpyxl beautifulsoup4 chardet

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

🧠 Полный код: бэкап писем и вложений + 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("✅ Бэкап завершён. Письма и вложения сохранены.")

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

Можно настроить запуск скрипта в фоне через планировщик задач:

  • taskschd.msc → создать задачу
  • триггер: каждый день / каждые 6 часов
  • действие: python путь_до_скрипта.py

🛠 Это просто пример — при желании:

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

💬 Если будут вопросы — пишите в комментарии. Подскажем, доработаем, подскажем конфигурации под ваши ящики.