imapsync: даты не сохраняются, полное руководство

6 min

imapsync - эталонный инструмент миграции почты для Linux-администраторов, хостинг-провайдеров и всех, кто предпочитает open source решения. Созданный Жилем Ламиралем, imapsync активно поддерживается с 2001 года и использовался для миллионов миграций ящиков по всему миру. Он поддерживает практически все IMAP-серверы: Dovecot, Courier, Cyrus, Zimbra, Exchange, Gmail и десятки других.

imapsync славится полнотой и гибкостью настроек. Администраторы ценят гранулярный контроль над папками для миграции, управление дубликатами и маппинг имён папок между разными IMAP-серверами. Но несмотря на весь этот контроль, одна проблема упорно повторяется: даты писем часто не сохраняются после миграции imapsync. Пользователи открывают ящик и видят, что каждое письмо показывает дату миграции. Это раздражает, особенно учитывая, что imapsync должен был обработать даты корректно.

Как imapsync обрабатывает INTERNALDATE

Попытка сохранения INTERNALDATE

imapsync действительно пытается сохранить INTERNALDATE каждого письма при миграции. INTERNALDATE - метка времени, которую IMAP-сервер хранит как метаданные для каждого сообщения, отдельно от заголовков. Когда imapsync копирует сообщение с источника на целевой сервер, он считывает INTERNALDATE с сервера-источника и передаёт его целевому серверу в команде IMAP APPEND.

Теоретически это должно сохранить исходную дату. На практике результат зависит от поведения целевого сервера и от того, как почтовые клиенты интерпретируют различные поля дат в сообщении.

Проблема заголовка "Received"

Даже когда imapsync успешно сохраняет INTERNALDATE, целевой почтовый сервер добавляет новый заголовок "Received" к каждому сообщению при операции APPEND. Этот "Received" содержит текущую метку времени - дату миграции. Почтовые клиенты (Outlook, Apple Mail, Thunderbird) определяют отображаемую дату получения по самому верхнему "Received", а не по INTERNALDATE. Поэтому, несмотря на усилия imapsync по сохранению INTERNALDATE, видимая дата в большинстве клиентов всё равно неправильная.

На самом деле именно этот разрыв и вызывает путаницу. imapsync сохраняет одно значение даты (INTERNALDATE), а почтовые клиенты отображают другое (метку из заголовка "Received"). Для технического погружения в этот механизм см. почему письма показывают неправильную дату после миграции IMAP.

Заблуждение из FAQ imapsync

Документация и FAQ imapsync затрагивают проблему дат, но представляют её как врождённое ограничение. FAQ намекает, что "даты могут не сохраниться" при миграции IMAP и подразумевает, что так устроен протокол. Хотя верно, что протокол IMAP требует от серверов добавления заголовков "Received" при вставке, FAQ создаёт впечатление, что проблема постоянна и неисправима.

Это не так. Заголовки "Received", добавленные при миграции, можно выявить и удалить постфактум, восстановив отображение исходной даты в почтовых клиентах. Оригинальный заголовок "Date" (фиксирующий момент отправки) всегда сохраняется imapsync и служит ориентиром для правильной даты.

Определение заголовка миграции imapsync

Как выглядит заголовок

imapsync сам не добавляет заголовок "Received" - это делает целевой IMAP-сервер. Заголовок, добавленный при миграции imapsync, обычно выглядит как стандартный заголовок вставки IMAP целевого сервера. Например, при миграции на сервер Dovecot заголовок может выглядеть так:

Received: from localhost by mail.example.com;
  Wed, 15 Jan 2025 09:14:22 +0100

Характерные признаки: этот "Received" является самым верхним в цепочке, его метка времени совпадает с датой запуска миграции imapsync, он обычно ссылается на "localhost" или hostname целевого сервера, а не на внешний почтовый сервер.

Сравнение дат

Для подтверждения проблемы сравните метку времени самого верхнего "Received" с заголовком "Date" письма. Если "Received" показывает январь 2025, а "Date" - март 2020, заголовок миграции является причиной неправильного отображения даты. Сравнение можно выполнить, просмотрев исходный текст сообщения в любом почтовом клиенте.

Почему стандартные опции imapsync не решают проблему

Флаг --syncinternaldates

imapsync предлагает флаг --syncinternaldates, который устанавливает INTERNALDATE на целевом сервере в соответствии с заголовком "Date" письма. Полезно, когда INTERNALDATE на сервере-источнике уже неправильная, но это не предотвращает добавление заголовка "Received" целевым сервером. Видимая дата в Outlook и других клиентах остаётся датой миграции вне зависимости от значения INTERNALDATE.

Опция --addheader

imapsync может добавлять пользовательские заголовки к сообщениям при миграции, но не может помешать целевому серверу добавить собственный "Received". Протокол IMAP требует от серверов фиксировать метку времени вставки, и никакая опция imapsync не способна переопределить это поведение на уровне сервера.

Пост-миграционные скрипты

Некоторые администраторы пишут пользовательские скрипты для удаления нежелательных заголовков "Received" после миграции. Звучит логично, особенно для тех, кто выбрал imapsync (людей, привычных к командной строке). Но реальность намного сложнее поиска-замены в тексте заголовка. Что произойдёт, когда скрипт встретит подписанное S/MIME письмо? Или multipart-сообщение с вложенными MIME-границами и base64-вложениями? Или заголовок с не-ASCII символами в кодировке RFC 2047? Один неправильный байт в MIME-границе может бесшумно повредить всё сообщение, уничтожив вложения или сделав письмо нечитаемым. А как подтвердить, что 10 000 исправленных писем все целы? Для тысяч писем на нескольких ящиках самостоятельное написание скриптов несёт существенный риск.

Исправление дат imapsync с Redate.io

Как Redate.io обрабатывает миграции imapsync

Проприетарный движок коррекции Redate.io создан специально для этой категории проблем. После подключения к ящику Redate.io анализирует каждое письмо и пропускает его через многоступенчатый конвейер анализа. Для миграций imapsync Redate.io обнаруживает заголовок "Received", вставленный сервером, сопоставляя сигнатуры сотен профилей миграции, анализируя полную цепочку заголовков и сверяя метки времени с оригинальным заголовком "Date".

Это не простое редактирование заголовка. Движок коррекции обрабатывает валидацию RFC, сохранение структуры сообщения (включая multipart/alternative структуры, inline-вложения и вариации Content-Transfer-Encoding) и обнаружение цифровых подписей. Письма с подписями S/MIME или PGP автоматически выявляются и обрабатываются для сохранения целостности подписей.

Что Вы получаете после коррекции

Каждое исправленное письмо показывает исходную дату получения во всех почтовых клиентах. Хронологический порядок восстановлен. Каждая коррекция проходит проверку целостности до финализации. Оригинал перемещается в папку "Redate.io - Originals" и хранится 30 дней как страховочная сетка.

Совместимость со всеми целевыми серверами

Поскольку imapsync используется для миграции практически на любой IMAP-сервер, Redate.io поддерживает тот же диапазон целевых платформ. Мигрировал ли imapsync на Dovecot, Courier, Cyrus, Zimbra, Google Workspace, Microsoft 365 или любой другой IMAP-сервер, Redate.io подключается и исправляет даты.

Как исправить даты после миграции imapsync

Подключение ящика

Войдите в Redate.io и добавьте ящик. Для Google Workspace или Microsoft 365 используйте опцию делегирования от администратора. Для других IMAP-серверов (типичных для сценариев imapsync) введите адрес сервера, логин и пароль. Redate.io подключается через стандартный IMAP.

Бесплатный анализ

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

Исправление и верификация

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

Руководства по исправлению imapsync для разных платформ

Часто задаваемые вопросы

Нужно ли использовать --syncinternaldates перед Redate.io?

Не обязательно. Redate.io устанавливает правильную INTERNALDATE в процессе коррекции, независимо от текущего значения. Сохранил ли imapsync оригинальную INTERNALDATE или нет, Redate.io выведет правильное значение из оригинального заголовка "Date".

Можно ли исправить даты на сервере-источнике до миграции imapsync?

Если сервер-источник уже имеет неправильные даты (после предыдущей миграции), Redate.io может исправить их до или после миграции imapsync. Но исправление дат на целевом сервере после миграции - самый распространённый и практичный подход.

Сколько писем может обработать Redate.io?

Redate.io обрабатывает ящики любого размера. Тарифы доступны для до 100 000 писем на ящик. Для организаций с многочисленными ящиками Redate.io предлагает объёмные скидки.

Миграция imapsync сломала даты? Запустите бесплатный анализ, чтобы узнать, сколько писем затронуто, и исправьте их с Redate.io.