Импорт писем из базы восстановления Microsoft Exchange (RDB)
Перед началом
Если письма остались только в резервной копии базы Microsoft Exchange — например, сотрудник уволен и его ящик удалён, — их можно перенести в архив Клавдия из базы восстановления (Recovery Database, RDB). Для этого применяется утилита выгрузки из RDB (поставляется отдельно, обратитесь к поставщику).
Импорт проходит в два этапа:
- На сервере Exchange утилита читает письма из подключённой базы восстановления и сохраняет их в файлы EML.
- Файлы EML загружаются в Клавдий через приёмник SMTP.
Утилита только читает базу восстановления: письма, папки, права и сама база не изменяются. Восстанавливать ящик в промежуточный ящик, устанавливать Outlook или включать EWS не нужно.
Что потребуется
| Что | Требование |
|---|---|
| Сервер Exchange | Exchange 2013, 2016 или 2019; утилита запускается на том сервере, где подключена база восстановления |
| База восстановления | создана и подключена (смонтирована) администратором Exchange из резервной копии |
| Учётная запись | администратор Exchange; консоль Exchange Management Shell, запущенная от имени администратора |
| Программы на сервере | только штатные: .NET Framework 4.5 или новее, Windows PowerShell 3 или новее. Устанавливать ничего не нужно |
| Место на диске | локальный диск сервера (желательно NTFS) с запасом больше объёма выгружаемых ящиков |
Клавдий должен быть с включённой службой SMTP и правилами для хранения входящих писем.
Создание и подключение базы восстановления выполняется штатными средствами Exchange и в этой статье не описывается. Ниже в примерах база называется
Recovery_VIP— подставьте имя своей базы.
Шаг 1. Разместите утилиту на сервере Exchange
- Скопируйте архив утилиты на сервер Exchange и распакуйте его (правая кнопка мыши → [Извлечь всё]).
- Создайте папку
C:\RdbReaderи скопируйте в неё содержимое папки утилиты из архива. - Убедитесь, что есть файлы
C:\RdbReader\scripts\Export-Rdb.ps1иC:\RdbReader\bin\RdbWorker.exe. - Выберите папку для результата на локальном диске, например на
C:\RdbExport. Сетевые папки для результата не используйте.
Шаг 2. Откройте консоль Exchange
- В меню [Пуск] найдите Exchange Management Shell.
- Нажмите по нему правой кнопкой мыши → [Запуск от имени администратора].
Все команды ниже вставляются в это окно целиком и выполняются клавишей Enter. Обычная командная строка cmd не подходит.
Если Windows запрещает запуск скрипта, выполните в этом же окне:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force
Разрешение действует только до закрытия окна. Если запрет задан групповой политикой и команда его не снимает, обратитесь к администратору Windows.
Шаг 3. Проверьте базу и получите список ящиков
Get-MailboxDatabase -Identity 'Recovery_VIP' -Status | Format-List Name,Recovery,Mounted,Server,Guid
& 'C:\RdbReader\scripts\Export-Rdb.ps1' -Database 'Recovery_VIP' -Mode List -OutputDirectory 'C:\RdbExport'
У базы значения Recovery и Mounted должны быть True. Утилита сама проверит, что запущена на нужном сервере и что версия Exchange поддерживается.
В списке ящиков найдите нужного сотрудника по столбцу DisplayName и запишите его MailboxGuid — идентификатор вида aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee.
Шаг 4. Выполните пробное чтение
Перед полной выгрузкой обязательно убедитесь, что утилита читает письма именно на вашем сервере. Пробное чтение сохраняет до трёх писем выбранного ящика:
& 'C:\RdbReader\scripts\Export-Rdb.ps1' -Database 'Recovery_VIP' -Mode Probe -MailboxGuid 'GUID-ящика' -OutputDirectory 'C:\RdbExport'
Вместо GUID-ящика подставьте MailboxGuid из списка. Выбирайте ящик, в котором точно есть письма: пустой ящик не подтверждает, что чтение работает.
Проба успешна, если в итоге Saved больше нуля и нет ошибок. Письма сохраняются в папку C:\RdbExport\.probe. Откройте в ней пару файлов message.eml (найдите их поиском в Проводнике), включая письмо с вложением, и убедитесь, что текст и вложения на месте. Файлы EML можно открыть любым почтовым клиентом на другом компьютере — на сервер Exchange ничего устанавливать не нужно.
{{СКРИНШОТ}} Консоль Exchange: итог пробного чтения.
Если доступ запрещён
Если проба завершается ошибкой AccessDenied или NoAccess, не меняйте права на базу наугад. Повторите пробу с параметром -RunAsSystem:
& 'C:\RdbReader\scripts\Export-Rdb.ps1' -Database 'Recovery_VIP' -Mode Probe -MailboxGuid 'GUID-ящика' -OutputDirectory 'C:\RdbExport' -RunAsSystem
Утилита запустит чтение от имени локальной системы через временное задание Планировщика Windows и удалит задание после завершения. Если это помогло, добавляйте -RunAsSystem и во все команды выгрузки. Если выгрузку прервать принудительно, задание может остаться: его имя начинается с Klavd-Rdb-, удалите его в Планировщике заданий.
Шаг 5. Выгрузите письма
Один ящик:
& 'C:\RdbReader\scripts\Export-Rdb.ps1' -Database 'Recovery_VIP' -Mode Export -MailboxGuid 'GUID-ящика' -OutputDirectory 'C:\RdbExport'
Все ящики базы восстановления — та же команда без -MailboxGuid.
Чтобы сначала проверить выгрузку на небольшом объёме, добавьте -MaxMessages 100, а затем запустите ту же команду без этого ограничения.
Во время выгрузки база восстановления должна оставаться подключённой. Не запускайте две выгрузки в одну и ту же папку результата одновременно.
Если выгрузка прервалась
Повторите ту же команду с той же папкой результата. Уже выгруженные письма будут пропущены (их число показывает счётчик Resumed). Не удаляйте файлы и служебные папки внутри папки результата — по ним утилита определяет, где остановилась.
Если чтение письма зависает, утилита сама перезапускает его. Письмо, на котором чтение зависло три раза подряд, пропускается, остальные письма выгружаются дальше, а итог ящика будет partial. После устранения причины повторите пропущенные письма:
& 'C:\RdbReader\scripts\Export-Rdb.ps1' -Database 'Recovery_VIP' -Mode Export -OutputDirectory 'C:\RdbExport' -RetryFailed
Если сервер или диск просто медленные, увеличьте время ожидания, добавив -IdleTimeoutSeconds 900 (по умолчанию — 300 секунд).
Итог выгрузки
Итог последнего запуска по каждому ящику — в файле C:\RdbExport\run-summary.json:
| Итог | Что означает |
|---|---|
complete |
ящик выгружен полностью, ошибок нет |
limited |
выгрузка остановлена ограничением -MaxMessages — это не полная выгрузка |
partial |
часть писем не выгружена; список ошибок — в файле errors.jsonl в папке ящика |
failed |
выгрузка ящика не удалась; см. «Если утилита не подходит к вашему серверу» |
Выгруженные письма лежат в папке C:\RdbExport\<GUID базы>\<GUID ящика>\items\, каждое — в отдельной папке с файлом message.eml.
Шаг 6. Загрузите письма в Клавдий
-
Скопируйте папку ящика (
C:\RdbExport\<GUID базы>\<GUID ящика>) на компьютер, с которого доступен приёмник SMTP Клавдия, — например, на Linux-сервер рядом с Клавдием. -
Проверьте, что в Клавдии включена служба SMTP, создан источник SMTP и для него настроено правило хранения. Без правила письма принимаются, но в архив не помещаются.
-
Отправьте письма в приёмник SMTP. Например, на Linux — штатной программой
curl:cd /путь/к/папке-ящика find items -name message.eml -print0 | while IFS= read -r -d '' f; do curl -sS --url "smtp://<адрес-узла>:<порт>" \ --mail-from "import@<ваш-домен>" --mail-rcpt "archive@<ваш-домен>" \ --upload-file "$f" || echo "НЕ ОТПРАВЛЕНО: $f" doneВместо
<адрес-узла>и<порт>укажите адрес и порт приёмника SMTP Клавдия. Адреса в--mail-fromи--mail-rcpt— технические: Клавдий распределяет письма по ящикам по отправителю и получателям, указанным в самих письмах.
Архив отбрасывает повторно присланные письма по их идентификатору (Message-ID), поэтому при сбое загрузку обычно можно запустить заново. Исключение — письма без идентификатора (встречаются у старой внутренней почты Exchange): при повторной отправке они задвоятся. Чтобы этого избежать, при сбое отправляйте только те файлы, которые попали в строки «НЕ ОТПРАВЛЕНО».
Загрузить файлы EML можно и через HTTP-API — см. Импорт PST / OST / EML / MSG.
Проверьте результат
- Сравните число отправленных писем с числом выгруженных (
message.eml) и убедитесь, что строк «НЕ ОТПРАВЛЕНО» нет. - Откройте ящик сотрудника в архиве и проверьте несколько писем: даты, отправителя, получателей, текст и вложения.
- Если письмо есть в архиве, но не находится поиском, проверьте очередь индексирования — индексирование большого объёма занимает время.
Что важно знать
- Только почта. Выгружаются письма; контакты, календарь и задачи не переносятся.
- Письма восстанавливаются из базы, а не копируются побайтно. Файл EML собирается из сохранённых в базе свойств письма: тема, адреса, даты, текст, вложения и вложенные письма сохраняются, но служебные заголовки исходного письма могут отличаться. Электронные подписи (S/MIME) и зашифрованные письма могут не сохранить исходную структуру.
- Внутренняя почта Exchange. Если в базе у отправителя нет SMTP-адреса (старая внутренняя переписка), письмо попадает в технический ящик, а не в ящик сотрудника — так же, как при импорте PST.
- Папки исходного ящика. При загрузке через SMTP письма распределяются по ящикам и папкам архива по адресам отправителя и получателей, исходная структура папок ящика Exchange не воспроизводится.
- Удалённые и скрытые элементы по умолчанию не выгружаются.
Если утилита не подходит к вашему серверу
Внутреннее устройство Exchange отличается между накопительными обновлениями (CU), поэтому на отдельных версиях утилита может сообщить, что сервер не распознан. В этом случае не копируйте файлы от другой версии Exchange и не устанавливайте Outlook. Соберите диагностику:
& 'C:\RdbReader\scripts\Export-Rdb.ps1' -Database 'Recovery_VIP' -Mode Inspect -OutputDirectory 'C:\RdbExport'
и передайте в поддержку файл C:\RdbExport\rdb-environment.txt, а также файлы result.json и worker-*.stderr.log проблемного ящика из папки C:\RdbExport\.state\. В них есть имена серверов и ящиков, идентификаторы и версии компонентов Exchange, но нет паролей; имена при пересылке можно скрыть.
Что дальше
Навигация по книге
- Следующая статья: Подключение LDAP / Active Directory