Скрипты php

Все ленты — последние статьи

Электронная почта: зачем нужна резервная копия — isync

Электронная почта: зачем нужна резервная копия

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

Средства для создания архивных версий электронной почты есть, из них я рекомендую isync. Пакет isync бесплатный, является утилитой командной строки и, судя по сведениям от разработчиков, работает под Linux, Solaris 2.7, OpenBSD 2.8, FreeBSD 4.3.

 

Для того, чтобы использовать пакет из-под Windows, требуется вначале установить Cygwin, бесплатную эмуляцию Un*x-подобной среды, под которую портированы многие существующие пакеты приложений.
Установка isync

Установка isync осуществляется
 - при помощи менеджера пакетов данной конкретной ОС (например yum в случае RedHat и производных, таких как Fedora, CentOS и т.д.) — ищите и устанавливайте пакет isync
 - сборкой из исходников, они доступны на странице isync в SourceForge; для тех, кто знает знаменитую последовательность "./configure; make; make install" сборка не составит труда; вам потребуется библиотека OpenSSL, если вы будете использовать защищённую авторизацию (крайне рекомендую)

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

В пакет входят две программы, isync, "обёртка" для второй программы, mbsync, которая, собственно, и является рабочей лошадкой пакета. Работу с isync я опишу в одной из последующих статей, а пока опишу основные шаги конфигурирования mbsync и запуск процедуры создания резервной копии всей почты конкретного почтового ящика.

В примере ниже мы настроим создание архивной копии всей почты с почтового ящика в Google Mail, для ящика nobody [at] gmail [dot] com.

1. Создаём каталог (папку), в котором будем хранить архив почты:
mkdir -p ~/mailarc/gmail.com/nobody

(создать от корня домашнего каталога указанную иерархию — обратите внимание на принцип именования; он удобен, если вы настроите автоматическое создание архивов для множества ящиков)

2. Получаем цепочку SSL сертификатов (это необязательно, если не используем защищённое соединение; в случае Google Mail это является обязательным шагом). Проще всего это сделать, дав команду такого вида:
openssl s_client -connect imap.gmail.com:993 -showcerts 1>> ~/mailarc/gmail.com/gmail.pem </dev/null

Пояснение: openssl в данном случае — это "обёртка", позволяющая открыть соединение с IMAP-сервером imap.google.com по защищённому каналу; мы запрашиваем цепочку сертификатов, а поскольку нам ничего более не нужно, то при помощи ввода /dev/null прекращаем разговор)

Далее откроем любой текстовый редактор, не форматирующий строки в исходном файле, и редактируем сохранённый файл gmail.pem. В нём ищем блоки вида
-----BEGIN CERTIFICATE-----
MIIDLzCCApigAwIBAgIKKNVg8QAAAAAHfzANBgkqhkiG9w0BAQUFADBGMQswCQYD
VQQGEwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzEiMCAGA1UEAxMZR29vZ2xlIElu
dGVybmV0IEF1dGhvcml0eTAeFw0wOTAzMTIyMDIzNDFaFw0xMDAzMTIyMDMzNDFa
MGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1N
b3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUgSW5jMRcwFQYDVQQDEw5pbWFw
LmdtYWlsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAo1cDhDhgSN3M
9Do6D459nSNxZW1fTPJV5rmJctt12zZwDTBbHqWlZsK1ZvcV1ngj1nYgZ7RXZmgC
sxEUSK/sw+/5Otl6BpK3OLFZI5U/FmMUTssG588Hsl21SBxeK7RoAgxxM2vB2Jgi
3KH+E13mlgUXlCyrehnbbTlwEosURyUCAwEAAaOCAQAwgf0wHQYDVR0OBBYEFNiX
w7Ps6PWzF80VrxYbz63ucVArMB8GA1UdIwQYMBaAFL/AMOv1QxE+Z7qekfv8atrj
axIkMEYGA1UdHwQ/MD0wO6A5oDeGNWh0dHA6Ly9jcmwuZXh0Lmdvb2dsZS5jb20v
R29vZ2xlSW50ZXJuZXRBdXRob3JpdHkuY3JsMFAGCCsGAQUFBwEBBEQwQjBABggr
BgEFBQcwAoY0aHR0cDovL2NhLmV4dC5nb29nbGUuY29tL0dvb2dsZUludGVybmV0
QXV0aG9yaXR5LmNydDAhBgkrBgEEAYI3FAIEFB4SAFcAZQBiAFMAZQByAHYAZQBy
MA0GCSqGSIb3DQEBBQUAA4GBALo7fCzccb+0OeU+iGPJ/CEynTIegiqt/OkZPP4P
aVy7a0MjwK7mDDYpMMu10r4oYSM8iI1BN2iIXRFDkuogp48yeh8P3In1A332XdW3
UoaoIhI8DunLXgfBEr2/TPUHtXDfJumu+wCojdjT2ywwud1hY8LSRR2zv27FWEAD
OaRh
-----END CERTIFICATE-----

Их оставляем в сохранности, включая обе ограничивающие строки, всё прочее из файла удаляем, включая пустые строки. Сохраняем файл.

3. Создаём конфигурационный файл mbsync, по умолчанию это ~/.mbsyncrc и помещаем в него следующее содержимое (внимание! не забудьте указать действительное имя почтового ящика; все имена локальных каталогов для хранения почты также укажите по своему выбору; в примере используется то, что было упомянуто ранее)
IMAPAccount nobody-gmail-com
Host imap.gmail.com
User "nobody [at] gmail [dot] com"
# Pass mysecretpass
UseIMAPS yes
CertificateFile ~/mailarc/gmail.com/gmail.pem

IMAPStore nobody-gmail-com-remote
Account nobody-gmail-com

MaildirStore nobody-gmail-com-local
Path ~/mailarc/gmail.com/nobody/
Inbox ~/mailarc/gmail.com/nobody/Inbox

Channel gmail-nobody-save
Master :nobody-gmail-com-remote:
Slave :nobody-gmail-com-local:
# Exclude everything under the internal [Gmail] folder, except the interesting folders
Patterns * ![Gmail]* "[Gmail]/All Mail"
# Patterns * ![Gmail]*
Create Slave
Expunge Slave
Sync Pull

 Для mbsync есть страница стандартной документации, но она весьма лапидарная, поэтому вкратце опишем, как создаются настройки для ведения архивов почты, пока что для самого общего случая — синхронизацию ящика в целом.

Конфигурационный файл состоит из блоков, где определяются учётные записи, удалённые и локальные хранилища и каналы (правила) синхронизации. Символ диеза (решётки) в первой строке означает комментарий. Пустые строки игнорируются.

Для создания правил (каналов, channel) синхронизации состояния почты, определяют учётные записи на IMAP сервере, локальное и удалённое хранилища, и собственно канал — правила синхронизации. В примере выше:

Определение учётной записи IMAP:
IMAPAccount nobody-gmail-com
Host imap.gmail.com
User "nobody [at] gmail [dot] com"
UseIMAPS yes
CertificateFile ~/mailarc/gmail.com/gmail.pem

IMAPAccount: идентификатор (имя) учётной записи. Любая строка. Я предпочитаю указанное правило именования, просто для удобства чтения. Двоеточий там быть не должно.
Host: доменное имя IMAP-сервера (или IP-адрес)
User: имя пользователя, необходимое для авторизации на IMAP.
Pass: пароль (если содержит пробелы, возьмите пароль в двойные кавычки). Внимание: пароль указывать имеет смысл, только если производите синхронизацию автоматически. В одной из последующих статей я расскажу, как передавать пароль, не указывая его открытым текстом, а при ручной синхронизации эту строку не указывайте — пароль программа запросит сама.
UseIMAPS: использовать ли защищённый канал (SSL, STARTTLS) для авторизации. "yes" или "no", если не указано — считается "no".
CertificateFile: файл с цепочкой сертификатов, полученных на шаге 2. Необходим при использовании защищённых каналов.

Определение удалённого хранилища (IMAP)
IMAPStore nobody-gmail-com-remote
Account nobody-gmail-com

IMAPStore: идентификатор (имя) хранилища на удалённом (IMAP) сервере. См. по поводу именования выше.
Account: идентификатор описания учётной записи IMAP, приведённый ранее в файле конфигурации при помощи директивы IMAPAccount.

Определение локального хранилища
MaildirStore nobody-gmail-com-local
Path ~/mailarc/gmail.com/nobody/
Inbox ~/mailarc/gmail.com/nobody/Inbox

MaildirStore: идентификатор (имя) локального хранилища, где будут сохраняться индивидуальные письма и служебная информация об архиве. См. выше по поводу именования.
Path: база (корень) хранения состояния почтового ящика, мы создали её на шаге 1.
Inbox: каталог, в котором будем помещать сообщения из "Входящих". Примечание: создавать его НЕ нужно, программа создаст его сама.

Определение канала синхронизации:
Channel gmail-nobody-save
Master :nobody-gmail-com-remote:
Slave :nobody-gmail-com-local:
# Exclude everything under the internal [Gmail] folder, except the interesting folders
Patterns * ![Gmail]* "[Gmail]/All Mail"
# Patterns * ![Gmail]*
Create Slave
Expunge Slave
Sync Pull

Channel: идентификатор (имя) канала. Я использовал строку 'save', чтобы указать. что данный канал сохраняет локальную копию почтового ящика и всех его папок.
Master: между двоеточий, указать идентификатор исходного хранилища, ранее определённого в конфигурационном файле директивой IMAPStore или MaildirStore. Оттуда будут браться сообщения (почта).
Slave: между двоеточий, указать идентификатор целевого хранилища, ранее определённого в конфигурационном файле директивой IMAPStore или MaildirStore. Там будут сохраняться сообщения (почта).
Patterns: перечисление имён папок, которые подлежат синхронизации, можно использовать метасимволы '*' (без кавычек, обозначает любую последовательность любых символов) и '%' (без кавычек, обозначает любое количество любых символов вплоть до упомянутой иерархии, например '% !Trash'). Восклицательный знак обращает действие — указывается то, что НЕ подлежит синхронизации.
 В нашем примере мы не берём ничего, что лежало бы внутри технических каталогов Gmail, кроме "всей почты" (таким образом мы исключаем корзину и спам-папку). Явное указание папки отменяет описанное ранее исключение, под которое она попадает.
Create Slave: указывает, что, если папка на целевом хранилище отсутствует, то создать её.
Expunge Slave: удалять на целевом хранилище всё, что отсутствует на сиходном.
Sync: указать тип синхронизации. Указать флаги и директивы, из следующего списка:
 Pull — копировать изменения из исходного в целевое.
 Push — копировать изменения из целевого в исходное.
 New — копировать только новые сообщения.
 ReNew — скопировать то новое, что ен было скопировано по тем или иным причинам (например, нехватка места).
 Delete — синхронизовать — удалить — то, что было окончательно удалено.
 Flags — синхронизовать флаги состояния сообщений (новое или нет, помеченное к удалению и пр.).
 All — всё, перечисленное выше, действие по умолчанию, если директива Sуnc не задана.
 None — не делать ничего; удобно для синхронизации удалений (expunge).

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

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

чтобы просто проверить, всё ли настроено, как следует.

Для запуска процесса вызовите mbsync и передайте программе имя канала (каналов), например, в нашем примере,
mbsync gmail-nobody-save

введите пароль, примите (обычно один раз) SSL сертификат, если программа сомневается в его подлинности, и наблюдайте за процессом копирования. Программа действует экономно — считывает с сервера только то, что отсутствует в локальном хранилище.

Для каждой IMAP папки (в случае Google Mail — для каждой метки, тега) создаётся отдельный подкаталог. Все сообщения лежат в виде отдельных файлов, в исходном (сыром) виде, со всеми техническими заголовками.

Очень не советую что-то править во вспомогательных файлах, созданных mbsync, это может првиести к сбоям при последующих запусках. Также не создавайте каталоги под будущие IMAp папки, программа создаст их сама при необходимости.

Примечание. Я обычно сохраняю всё сохранённое в едином архиве (упаковываю всё при помощи tar/bzip2 или 7z) и копирую ещё куда-нибудь. На случай, если удалённые сообщения были важны и пропадут при последующей синхронизации. Как вариант, вообще удалите "Expunge Slave", чтобы на локальной копии сохранялось всё.
Заключение

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

Пожелания, комментарии, предложения по следующим статьям приветствуются.