Export mail archívu
z Mail Marshal

Mail Marshal, formát dát, a o čom vlastne tento článok je...

Mail Marshal je serverová aplikácia ktorá je umiestnená medzi Exchange Server a Internet. Cieľom je najmä filtrovať prichádzajúci mail od spamu, potom pár ďalších funkcií a dá sa použiť aj ako nástroj na archiváciu všetkých mailov čo boli prijaté alebo odoslané v rámci organizácie. Proste povedané jednoducho - všetky maily čo užívatelia poslali alebo prijali za posledných pár rokov sú tu (v mojom prípade) uložené. Ak potrebujem nájsť email ktorý poslala Alica komusi z firmy Acme, niekedy v októbri pred 4 rokmi - nájdem to za pár sekúnd práve v programe Mail Marshal.
Aj keď to znie zaujímavo v skutočnosti sa takéto programy prestávajú používať a sú nahradzované službami. Stále chcem mať prístup k celému archívu, ale nechce sa mi starať sa o program nainštalovaný na mojom servri, nechce sa mi starať o zálohovanie archívu, nechcem mať obavy čo sa stane ak Mail Marshal "spadne" a celá organizácia ostane bez email komunikácie. Namiesto toho sa upraví mx záznam domény, a všetky maily do a z organizácie pôjdu cez servre inej spoločnosti, ktorá všetky maily odfiltruje od spamu, skontroluje či neobsahujú vírusy, doplní podpisy, prefiltruje na základe užívateľských filtrov a všetko zarchivuje. Okrem toho je všetko zálohované v datacentrách po celom svete, službu je možné využívať aj ak nefunguje Exchange server... Proste - je to celé užitočné a fajn.

Problém je ako skonvertovať archív z programu Mail Marshal na pst alebo msg či eml súbory (alebo iný "štandard").
Teda - to ani tak hlavný problém nie je - Mail Marshal ukladá správy vo formáte mml, a jediný rozdiel oproti "štandardnej" správe je že na konci každej správy je "obálka". Problém je že Mail Marshal má všetky správy rozdelené iba podľa dátumu. Nájsť teda všetky správy ktoré boli poslané a prijaté 1. januára 2000 nie je problém. Problém je ak hľadám všetky správy ktoré poslala Alica za posledných 10 rokov...

Ak by som chcel nájsť všetky správy čo Alica odoslala alebo prijala za posledných pár rokov, v Mail Marshal konzole stačí zadať From: alica@organizacia.com, dátum od, do a za pár sekúnd mám na obrazovke všetky (tisíce až desaťtisíce) správy. Ak by som však chcel hľadať priamo v súboroch mml, znamenalo by to, že musím prehľadať milióny súborov podľa ich obsahu a hľadať v nich adresu alica@organizacia.com. A ani to by nebolo 100% spoľahlivé, pretože ak by Bob písal email Charliemu v ktorom by spomínal že Alicina adresa je alica@organizacia.com, tak tento email by bol nesprávne zaradený k tým čo poslala alebo prijala Alica.

Ok - takže o čom tento článok je? Ako pretriediť obrovské množstvo dát uložené v obrovskom množstve adresárov a súborov, podľa obsahu týchto súborov.

Príprava dát

Na začiatku je dôležité si dáta pripraviť. V žiadnom prípade nedoporučujem pracovať so "živými" dátami. Ako úplne prvé si dáta skopírujem niekam inam. Archív všetkých prijatých a odoslaných správ v Mail Marshal je v adresári
 ..\MailMarshal\Quarantine\Symbolic\Email Archive - In
 ..\MailMarshal\Quarantine\Symbolic\Email Archive - Out
keďže niektoré aplikácie, ktoré budem používať majú problémy s medzerami v názvoch adresárov, premenujem si adresáre potom ako ich skopírujem na ArchiveIn a ArchiveOut Ja som si ich uložil do pracovného adresára
F:\!exportmm\Workdir\ArchiveIn
F:\!exportmm\Workdir\ArchiveOut

Konkrétne v mojom príklade šlo o organizáciu s približne 50 užívateľmi (150 mailboxov, avšak niektorí užívatelia v minulosti odišli) a asi 5 ročný archív. Za týchto 5 rokov našich 150 uživateľov poslalo resp. prijalo spolu 2000000 správ, a adresáre ArchiveIn a ArchiveOut zaberajú na disku 200 GB.
Čiže úloha je - pretriediť 200 GB dát v 2 miliónoch súboroch, podľa toho čo sa v ktorom súbore nachádza. Počítače sú dnes pomerne rýchle - ale aj tak. Prehľadať 2 milióny súborov a nájsť všetky tie ktoré v sebe obsahuju slovo slovo, trvalo na pár rokov starom serveri viac ako 48hodín! Keďže to potrebujem spraviť pre 150 užívateľov, trvalo by mi to možno rok... Takže ako to zjednodušiť?

Ako prvé - je treba prehľadávať iba v tom čo je naozaj potrebné. V adresároch ArchiveIn a ArchiveOut sú uložené nielen mml správy, ale aj log súbory s informáciami o tom ako bola správa spracovaná.
Prvý krok úlohy teda je - vyfiltrovať z 2 miliónov súborov uložených v tisíckach adresárov iba užitočné mml súbory. Aj toto sa dá spraviť pomocou štandardného hľadania vo Windows Exploreri, ale lepší program je Useful File Utilities (UFU). Lepší aj preto, že ho budem potrebovať neskôr.
Nie je zadarmo, ale je k dispozícii plná verzia, ktorú je možné 15 krát použiť. Pre tento účel ju plánujem použiť iba raz (naozaj dúfam, že ma ďalšie takéto triedenie v blízkej dobe nečaká), takže by to malo byť ok.

Vyberiem Finder, V parametroch vyhľadávania v položke General nastavím, že hľadám len *.log súbory, zvolím adresár kde sú moje adresáre ArchiveIn a ArchiveOut a kliknem na Start Find.
Program UFU používa tzv. Basket - čo je dočasné úložisko na súbory. Teda potom ako nájdem všetky log súbory kliknem na Send to basket. Potom môžem okno "Search results" zavrieť.
No a v poslednem kroku zbytočné log subory klávesou DEL odstránim. Dôležité je zvoliť "Delete from disk"
5.5 GB ušetrených.

TAIL - ako uložiť zo súboru len posledných pár riadkov

Tým, že som odstránil všetky neužitočné log súbory sa môj pracovný adresár zmenšil povedzme na 195 GB v 1500000 súboroch. Toto však ešte nie je žiaden úspech - zmazať log súbory nebolo až tak dôležité, pretože pri zadávaní hľadania som mohol vybrať, že si želám prehľadávať iba mml súbory.
Oveľa užitočnejšie by bolo prehľadávať v súboroch iba to dôležité - teda tú časť súboru, kde je informácia o tom kto prijal alebo odoslal správu uloženú v súbore.
mml súbor vyzerá nasledovne
Received: from ???.???.??? (???.???.???[0.0.0.0]) by ...
	id ???; Fri, 11 May 2005 12:00:00 +0100
X-MimeOLE: Produced By Microsoft Exchange V6.5
Content-class: urn:content-classes:mdn
MIME-Version: 1.0
Content-Type: multipart/report;
	report-type=disposition-notification;
	boundary="???"
Subject: ???
Date: Fri, 11 May 2005 12:00:00 +0100
Message-ID: ???@???.???.???
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
Thread-Topic: ???
Thread-Index: ???
From: "UserSender" sender@domain.com
To: "UserRecipient" recipient@domain.com

This is a multi-part message in MIME format.
...
...
...

Content-Type: message/disposition-notification
Content-Transfer-Encoding: 7bit

...
...
...


StartOfEnvelope:
ExternalSender:y
From:sender@domain.com
HelloName:???.???.???
Recipient:recipient@domain.com
ReturnPath:sender@domain.com
SenderIP:0.0.0.0
Subject:???
RawSubject:???
Priority:Normal
Validated:y
SenderPtrRecord:???.???.???
Message-ID:???@???.???.???
InitialMessageBody:???
IpDosWhitelisted:false
RestartRule:???
MMSmtpMapsRbl:
ArrivalTime:???
MoveRule:???
HasAttachments:1
EndOfEnvelope:???
Hlavná časť správy - jej obsah prípadne všetky prílohy ktoré zaberajú najviac (občas až megabajty) miesta, sú uložené na mieste znázornenom troma bodkami. Táto hlavná časť správy je pre mňa neužitočná, čo je dobre - aspoň nemusím prehľadávať všetky tie megabajty "zbytočných" dát.
To čo vyzerá zaujímavo je práve posledných pár riadkov. Pretože tam je uložená informácia o tom kto správu poslal a kto správu prijal.
Na prvý pohľad aj prvých pár riadkov vyzerá zaujímavo, avšak tam to nie je až tak jednoznačné. Správy budem totiž filtrovať nie podľa frázy alica@organizacia.com, ale To: alica@organizacia.com. A toto môže byť na prvých pár riadkoch zapísané ako
To: <alica@organizacia.com>
To: alica@organizacia.com
To: "Alica" <alica@organizacia.com>
To: "Alica (e-mail)" <alica@organizacia.com>
príp. je možno Alica uvedená v políčku cc a nie to

Na posledných pár riadkoch je to už jasnejšie - stačí hľadať výraz From:alica@organizacia.com pre všetky správy ktoré Alica odoslala a Recipient:alica@organizacia.com pre všetky správy ktoré prijala.

Program UFU (a neviem ani o nijakom inom) toto neumožňuje. V parametroch hľadania nie je možné zadať aby program prehľadával iba konce (povedzme posledných 5000 bytov súborov, alebo posledných 20 riadkov). Existuje však iný program ktorý umožňuje uložiť zo súboru iba jeho posledných pár riadkov.

Myšlienka je teda nasledovná - z každého mml súboru uložím iba posledných pár riadkov. Tieto potom potriedim, a skopírujem k nim prislúchajúce pôvodné mml súbory.
Uff - znie to trošku zložito, takže pekne po poriadku.

Najprv budem potrebovať program/príkaz, ktorý uloží iba posledných pár riadkov súboru do nového súboru (nemôžem si dovoliť originálne súbory prepísať - budem ich neskôr potrebovať). Tento príkaz sa volá tail.exe, a aj keď nie je štandardným príkazom Windows, je možné si ho voľne stiahnuť v rámci Windows Server 2003 Resource Kit Tools

z konzoly spustím

FOR /R %F IN (*.mml) DO tail -20 %F > %F.tail
čo znamená - pre všetky súbory mml v danom adresári a všetkých podadresároch skopíruj posledných 20 riadkov súboru do nového súboru a pridaj tomuto súboru príponu tail. Ak sa teda pôvodný súbor volal 000105454021.mml nový súbor obsahujúci iba posledných 20 riadkov pôvodného súboru bude uložený v rovnakom adresári pod menom 000105454021.mml.tail
to že sú .tail súbory uložené v tom istom adresári ako pôvodné .mml súbory je ako sa neskôr ukáže veľmi dôležité...

Prehľadavanie a export výsledkov hľadania do súboru

V ďalšej časti budem prehľadavať iba nové tail súbory, pričom keď nájdem text alica@organizacia.com uložím si názov tohto súboru do nejakého zoznamu. Podľa tohto zoznamu potom vytvorím zoznam prislúchajúcich mml súborov, a tieto skopírujem.
Ale znova pekne poporiadku
Hľadať text alica@organizacia.com vo všetkých súboroch v danom adresári a všetkých podadresároch je možné pomocou príkazu
findstr /s /i /m alica@organizacia.com *.tail ->alica.list
Tento príkaz prehľadá všetky tail súbory v danom adresári a všetkých podadresároch, a názvy všetkých súborov v ktorých objaví text alica@organizacia.com uloží do nového textového súboru z názvom alica.list

Mám rád programovanie a konzoly, ale čo sa nemusí robiť v konzole robím radšej v GUI. Spomínal som program UFU a ten dokáže aj to o čom píšem vyššie.

Opäť použijem Finder, ale ako prvé zvolím, že chcem prehľadávať iba *.tail súbory. (V adresári a podadresároch sa teraz nechádzajú mml a tail súbory. log súbory som zmazal, ale mml zmazať nemôžem - budem ich potrebovať neskôr)
V možnostiach vyhľadávania vyberiem "By Content", a budem hľadať text From:alica@organizacia.com alebo Recipient:alica@organizacia.com. (je potrebné vybrať možnosť OR) a potom už len zvolím Start Find.
*mohol by som teoreticky hľadať iba text alica@organizacia.com akurát sa snažím vyhnúť situáciám kde napr. Charlie posiela správu Bobovi a v Subject uvedie "alicina adresa je alica@organizacia.com". Ak by som hľadal len výraz alica@organizacia.com takáto správa by bola nesprávne vyhodnotená ako poslaná alebo prijatá Alicou. Nie je to veľmi pravdepodobné ale - pre istotu.
Nájdené súbory pošlem do košíka (Send to Basket) a potom obsah košíka uložím do súboru (Save Basket list to file) napríklad ako alica.list

V súbore alica.list je zoznam tail súborov ktoré obsahujú text From:alica@organizacia.com alebo Recipient:alica@organizacia.com. Samotné tail súbory neobsahujú správy ale keďže sú v rovnakých podadresároch ako mml súbory stačí zoznam trocha upraviť.
Súbor alica.list otvorím v hocijakom textovom editore (stačí aj notepad), vyberiem príkaz nahradiť text (v notepade je pod Edit/Replace), a text .tail nahradím prázdnym miestom (resp. vymažem zo súboru všetky .tail).
Výsledkom je zoznam správ v mml súboroch (vrátane ciest k podadresárom), tento si uložím napr. ako alica.mmllist

Kopírovaníe súborov podľa zoznamu

V poslednom kroku potrebujem skopírovať všetky súbory podľa zoznamu v alica.mmllist do nejakého nového adresára. Toto je znova možné spraviť aj v UFU, ale ja som v tomto prípade dal prednosť konzole
F:\!ExportMM>FOR /F %F IN ('type alica.mmllist') do 
   copy %F f:\!exportMM\found\alica@organizacia.com\
Je dôležité spustiť príkaz z adresára kde sa nachádzajú zoznamy súborov (súbory mmllist). Príkaz hore zabezpečí že všetky súbory mml, (ktoré vďaka predošlým krokom predstavujú správy ktoré Alica prijala alebo odoslala) sa skopírujú do nového adresára
f:\!exportMM\found\alica@organizacia.com\

Linky

Aj postup hore je stále pomerne zdĺhavý - prakticky mi pretriediť 1.5 milióna súborov touto metódou trvalo niekoľko týždňov. (Nie reálneho času samozrejme - akurát proces hľadania je nutné pre každého užívateľa manuálne spustiť, a o pár hodín uložiť výsledok a spustiť hľadanie pre ďalšieho užívateľa. Teoreticky by sa to dalo spraviť cez dávkový súbor v konzole ale - uprednostnil som použitie GUI)
Na druhej strane - ako som spomínal na začiatku textu, prehľadávanie pomocou funkcie Search v MS Windows (metóda ktorá mi bola doporučená samotným výrobcom programu Mail Marshal) by trvalo určite viac ako rok.

Mail Marshal KB Article Q10422
Mail Marshal KB Article Q10412
ale najmä tipy od mojich kamarátov bMana a hira, ktorým by som rád poďakoval.

cc-by Wray 2009