OfflineIMAP

16 сентября 2019

Резервное копирование почты с помощью OfflineIMAP

Мода на облака во многом упростила обслуживание сервисов, но отнюдь не сделала его ненужным.

Например, резервное копирование данных обязано продолжать производиться в предположении, что в один прекрасный день облако растает в небесной синеве.

Однако если предыдущая версия сервиса была запущена на собственном оборудовании, процедуру резервного копирования придётся перерабатывать с нуля, потому что прямого доступа к процессам и файлам теперь нет.

В данной заметке речь пойдёт о сохранении почты из облака, и это упрощает нам задачу, потому что стандартный почтовый протокол IMAP изначально предназначен для того, чтобы синхронизировать содержимое почтового ящика с сервером.

Осталось выбрать утилиту, удовлетворяющую следующим условиям:

  • во-первых, синхронизировать все папки, а не только «Входящие» (из-за этого, например, сразу отсеялся fetchmail);
  • во-вторых, сохранять результаты на локальный диск — как оказалось, многие утилиты синхронизации в качестве приёмника умеют использовать только другой IMAP-аккаунт;
  • иметь готовые пакеты для Линукс-дистрибутивов;
  • иметь минимум зависимостей;
  • не выглядеть заброшенной и поддерживать современные версии языков, библиотек и протоколов;
  • работать в текстовой консоли, не требовать интерактивных действий.

Беглый поиск привёл нас к OfflineIMAP. Возможно, это не оптимальный выбор, но нас он устроил. Если вы решите поискать альтернативу, то можете начать со следующих подборок:

Файл конфигурации:

[general]

metadata = /opt/backups/mail/offlineimap.metadata
maxsyncaccounts = 1
ui = Blinkenlights
ignore-readonly = no

accounts = vasya, petya, kolya

[Account vasya]

localrepository  = vasya_local
remoterepository = vasya_remote

[Repository vasya_local]

type = Maildir
localfolders = /opt/backups/mail/vasya

[Repository vasya_remote]

type = IMAP
ssl = yes
remotehost = imap.our-cloud-mail-service.com
remoteuser = vasya@cdnnow.ru
remotepass = VerySecretPass
subscribedonly = no
readonly = True

[Account petya]
...

То есть для каждого пользователя требуется три секции:

  • с описанием IMAP-аккаунта;
  • с описанием локального каталога;
  • с именами первых двух;
  • и имя третьей секции должно быть указано в директиве "accounts" в секции "general".

Финальная конфигурация может оказаться сложнее, в зависимости используемого сервиса и версий OfflineIMAP. Например, для Gmail она может принять следующий вид: https://wiki.archlinux.org/index.php/OfflineIMAP#Gmail_configuration

У получившейся схемы имеется недостаток:

Если пользователь перемещал письмо между папками (например, из «Входящих» в «Договоры», а затем в «Корзину»), в резервной копии оно будет присутствовать в каждой из папок, т.е. окажется сохранено несколько раз.

Запуск:

#!/bin/sh -e

   PROG="${0##*/}"
 LOGDIR="/var/log/$PROG"
LOGFILE="$LOGDIR/$(LANG=C date '+%Y.%m.%d-%H%M%S')".log

pids="$(pgrep offlineimap)"

if test -n "$pids" ; then
    logger -t "$PROG" -p user.warn -s "already running? ($pids)"
    exit 1
fi

mkdir -pm700 "$LOGDIR"

offlineimap -o -c "/etc/$PROG.conf" -u Basic > "$LOGFILE" 2>&1

grep -wq ALERT "$LOGFILE" &&
  logger -t "$PROG" -p user.err -s "alerts in $LOGFILE"

find "$LOGDIR/" -type f -name "*.log" -mtime "+30" -delete

Предлагаемый сценарий надо поместить в /etc/cron.daily/ и сделать исполняемым. Читать настройки он будет из /etc/имя_сценария.conf

Пояснения к ключам запуска:

  • "-o" означает однократное выполнение с немедленным выходом, директивы autorefresh в конфигурации игнорируются;
  • "-u Basic" означает отключение цветного вывода.

Восстановление:

Неожиданным сюрпризом для нас стало то, что на восстановление писем из резервной копии потребовалось на порядок больше времени, чем на настройку резервного копирования.

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

После многочисленных экспериментов мы нашли следующий вариант:

  • все файлы в каждом временном подкаталоге переименовываются в *.eml, например:
    find /path/to/tempbox -type f -not -name '*.eml' -exec mv '{}' '{}.eml' ';'
  • каталоги с файлами *.eml копируются на компьютер с Outlook Express, открываются в Проводнике, файлы перетаскиваются в папки Outlook’a.

Альтернативный вариант, который мы нашли позднее и пока не пробовали:

  • установить в Mozilla Thunderbird дополнение ImportExportTools;
  • создать в Local Folders новую пустую папку;
  • из её контекстного меню выбрать "ImportExportTools => Import all messages from a directory" и указать каталог OfflineIMAP.


← Назад в Блог

Подпишитесь на новые статьи: