Стоит задача с облачного сервера сделать выгрузку писем по IMAP.
Содержание
Что попробовал?
В поисках решения для резервного копирования почты по IMAP я попробовал два программных продукта. Первый это Handy Backup, второй это AOIME Backup.
В Handy мне не понравилось, что программа просто зависла и висела до тех пор, пока я ее не перезапустил принудительно. В ТП обращаться не стал.
AOIME Backup делал копии замечательно, но очень быстро инкрементные копии забили весь диск, при этом не пропорционально размеру почты. И ровно так же, как Handy в какой-то момент просто зависло на стадии «Выполнение 20%» и все, только перезагрузка ВМ помогла. Сильно много времени этому вопросу я не захотел уделять. Разово снять копию — ок, а вот на постоянной основное сомнительно.
MailStore Home решение понравилось, но платную версию не купить. А без нее только ручной режим и пара ящиков.
Еще посмотрел решение, которое описано вот этой записи https://cdnnow.ru/blog/offlineimap/, но меня оттолкнуло то, что offlineimap давно не обновлялся.
Поэтому выбор пал на imap-backup. О нем и рассказываю.
Настройка imap-backup
Страница на github https://github.com/joeyates/imap-backup.
В этом примере установка на Ubuntu 24.
Для начала установим менеджер пакетов для языка Ruby.
1 |
apt install rubygems |
Далее установим сам imap-backup.
1 |
gem install imap-backup |
В этом примере я все буду сохранять в директорию /opt/
.
Создание списка ящиков.
Создаем файл /opt/imap-backup.json
.
1 |
nano /opt/imap-backup.json |
С содержимом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{ "accounts": [ { "username": "bite-byte@yandex.ru", "password": "iLoveDanceWithCake2025", "server": "imap.ya.ru", "local_path": "/opt/emails/bite-byte@yandex.ru" }, { "username": "user2@yandex.ru", "password": "password2", "server": "imap.yandex.ru", "local_path": "/opt/emails/user2@yandex.ru" }, { "username": "user3@yandex.ru", "password": "password3", "server": "imap.yandex.ru", "local_path": "/opt/emails/user3@yandex.ru" } ] } |
В этом файле всё просто, но я поясню:
username
— email ящик;password
— пароль от ящика;server
— imap сервер email ящика;local_path
— путь, куда сохранять бекап;
Выдаем права на чтение этого файла.
1 |
chmod 0600 /opt/imap-backup.json |
И выдадим права на папку с бекапами ящиков. Этот шаг необходим для раздела «Вернуть выборочные письма из бекапа на ящик»
1 |
sudo chmod -R 755 /opt/emails |
Далее сделаем скрипт для автозапуска.
1 |
nano /opt/backupEmail.sh |
С содержимом
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#!/bin/bash CONFIG_FILE="/opt/imap-backup.json" LOG_DIR="/opt/imap-logs" mkdir -p "$LOG_DIR" DATE=$(date "+%Y-%m-%d") LOG_FILE="$LOG_DIR/$DATE.log" TELEGRAM_TOKEN="ТЕЛЕГРАМ ТОКЕН" CHAT_ID="CHAT ID куда отправлять уведомления" log() { echo "[$(date '+%F %T')] $*" | tee -a "$LOG_FILE"; } send_telegram() { curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage" \ -d chat_id="$CHAT_ID" \ --data-urlencode "text=$1" >> "$LOG_FILE" } log "=== Запуск бэкапа $(date '+%F %T') ===" [[ ! -f "$CONFIG_FILE" ]] && { log "ERROR: Конфиг $CONFIG_FILE не найден"; send_telegram "❌ Конфиг $CONFIG_FILE не найден"; exit 1; } OUTPUT=$(imap-backup backup --config "$CONFIG_FILE" 2>&1) rc=$? echo "$OUTPUT" >> "$LOG_FILE" if [[ $rc -ne 0 || "$OUTPUT" =~ "ERROR" ]]; then log "ERROR: imap-backup вернул код $rc или содержит ошибки в логе" send_telegram "❌ Ошибка бэкапа. Код $rc. См. $LOG_FILE" exit 1 fi send_telegram "✅ Бэкап успешно завершен" log "=== Завершено $(date '+%F %T') ===" exit 0 |
Переменные, которые необходимо заменить:
TELEGRAM_TOKEN
— токен бота, которые выдает @BotFather;CHAT_ID
— ID пользователя телеграм, которому отправлять уведомления, узнать его можно через бота @my_id_bot;
Примеры уведомлений в телеграм:
Делаем файл исполняемым
1 |
chmod u+x /opt/backupEmail.sh |
Далее можно запустить скрипт для проверки конфига и его работы.
1 |
/bin/bash /opt/backupEmail.sh |
Если все отлично и ошибок нет, то можем ставить запуска скрипта на cron. В это примере я делаю запуск бекапа каждый день в 21:00.
1 |
(crontab -l 2>/dev/null; echo "0 21 * * * /opt/backupEmail.sh >> /opt/backupEmail.log 2>&1") | crontab - |
Проверяем, что задание в cron.
1 |
crontab -l |
Ожидаемый вывод.
1 |
0 21 * * * /opt/backupEmail.sh >> /opt/backupEmail.log 2>&1 |
Процедура восстановления
Резервная копия есть, уведомления об ошибках есть — это хорошо. Но что делать в случае, если необходимо восстановить письма или письмо?
Вернуть всю почту из бекапа на ящик
Для полного восстановления содержимого из бекапа на исходный сервер мы воспользуемся командой (описание на github).
Поскольку я использовал нестандартный путь до кофнига, то сначала надо сделать симлинк.
1 2 |
mkdir -p /root/.imap-backup ln -s /opt/imap-backup.json /root/.imap-backup/config.json |
После этого запустить команду restore. Например, вот так.
1 |
imap-backup restore bite-byte@yandex.ru |
Данная команда отправляет резервные копии электронных писем на сервер IMAP. При возникновении конфликтов папки переименовываются.
Письма не задублируются, т.к. восстанавливаются по папке + индификатору. Существующее письма на исходном сервере пропускаются.
Вернуть выборочные письма из бекапа на ящик
Вот тут начинаются проблемы. Во-первых, у нас нет GUI. Во-вторых, найти нужное письмо без поиска довольно проблематично.
С помощью sshfs-win-manager подключим наш диск с бекапами к Windows-машине.
Пример параметров подключения.
Выглядит содержимое каталога вот так.
Далее нам потребуется почтовый клиент Thunderbird.net и внутри него плагин ImportExportTools NG.
Открываем локальные папки и подключаем необходимую mbox файл или монтируем целиком. От выбора зависит скорость обработки. Плагин импортирует в локальную папку содержимое файла (ов).
Например, я хочу посмотреть папку «Банки Тинькофф».
Выбираем нужную mbox папку.
Дожидаемся обработки. Она внизу слева.И наша папка появляется в почтовике.
Находим нужное письмо и экспортируем его в любом удобном формате. Отдаем пользователю. Можно ящик подключить по imap и это письмо вернуть на исходное место.
Минусы данного решения
Основной минус данного решения это его мониторинг. Да, у нас есть уведомления, но уведомления != мониторинг.
Второй минус это ручное управление ящиками. Через консоль. Не могу сказать, что это прям существенный минус, но некоторые неудобства есть. Особенно, если ящик много и есть текучка. Решение больше рассчитано на копирование каких-то важных ящиков.
Третий минус это неудобный способ возвращения писем на ящик.
Четвертый минус. Ящики будут раздуваться. Т.к. у нас не удаляется из бекапа то, что удалилось на исходном сервере. Оно, в принципе, и логично.
Если мой материал был полезен, то можете угостить меня кофе ☕️