Бэкап почтового ящика по IMAP

Материал из Linux Wiki
Перейти к навигацииПерейти к поиску

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

Установка

В качестве утилиты для доступа к контенту ящика из ряда вариантов был выбран isync, доступный в репозитории Debian'a.

Ставим:

apt-get install isync

Настройка

Настройка сводится к заполнению файла ~/.isyncrc и добавлению в crontab нескольких скриптов.

Для начала рассмотрим содержимое файла настроек:


# Путь к сертификату для подключения через SSL
CertificateFile /etc/ssl/certs/ca-certificates.crt
# Не стирать удаленные в ящике сообщения
Expunge no
Delete no

# Пользователь
User someuser@somedomain.com
# Путь к локальному каталогу с почтой
Mailbox /backups/emails/.imappool
# Хост для подключения
Host    mail.somedomain.org
# Пароль
Pass    mypassword
# Алиас (используется в дальнейшем при вызове из консоли)
Alias   backup_emails

В crontab добавляем пару строчек:

# Эта строчка подтягивает новую почту в локальный каталог каждый час
0       *       *       *       *       echo yes | isync -qL backup_emails 2>/dev/null
# А тут в конце рабочего дня пакуются все новые сообщения
59      23      *       *       *       /backups/emails/.t.sh 2>/dev/null

и создаем скрипт /backups/emails/.t.sh со следующим содержимым:


#!/bin/bash
# Каталог, куда складывать архивы с почтой
td="/backups/emails/$(date +%Y/%m)"
# Временный каталог для новых писем
sd='/backups/emails/.s/'
# Имя файла архива
f="${td}/orders_$(date +%Y_%m_%d).tar.bz2"

# Удаляем временный каталог с содержимым, если он существует
rm -rf "${sd}" 2>/dev/null

# Создаем временный каталог и каталог назначения
mkdir -p "${td}" "${sd}"

# Ищем все сообщения, появившиеся за последние 24 часа, после чего копируем  их в временный каталог под именем "*.eml" (для более удобной работы в дальнейшем из почтовиков)
find /backups/emails/.imappool/ -type f -mtime -1 ! -name "\.*" | while read i ; do  cp "${i}" "${sd}/$(basename "${i}" | cut -d'.' -f-2).eml" ; done

# Пакуем все сообщения из временного каталога в архив в каталоге назначения (сообщения находятся прямо в корне архива)
tar cf - -C "${sd}" . | nice -n 19 pbzip2 -9c > "${f}"

# Удаляем временный каталог
rm -rf "${sd}" 2>/dev/null