VMP – Visual Mail Project – Search engine para email

Olá a todos,

Por trabalharmos em consultadoria informática e recebermos quantidades copiosas de email, já devem ter notado que arranjar tempo para organizar uma mailbox profissional de uma forma eficiente é um desafio.

É necessário não perder muito tempo a encontrar um email, ou tema dentro de um e seguir rapidamente a thread do mesmo e sobretudo não queremos perder muito tempo a organizar a nossa mailbox.

Claro que existem spotlight’s, gmail’s, e outlook searches, mas todos eles tem o seu downside: Perca de privacidade, bases de dados autoindexadas centralizadas num portátil ou desktop, e muitas vezes o search simplesmente não funciona como queremos.

Podemos precisar de ver um tópico, on the go, mantendo toda a privacidade necessária que os NDA’s da nossa profissão exige.

Como sou um tipo que no meu core procuro soluções muitas vezes overkill para resolução de problemas informáticos que muita gente nem se apercebe que tem, decidi fazer o que chamei de Visual Mail Projet.

O desafio: Indexar cerca de 23 anos de emails profissionais (sim tenho os meus emails profissionais todos desde que comecei a trabalhar), que contabilizam cerca de 7 milhões de emails e cerca de 190GB de espaço ocupado.

Inicialmente pensei em IMAPS e um cliente típico de outlook (tem search built in), mas quando a DB gerada por ele simplesmente era tão grande que o próprio outlook falhava, procurei outras soluções.

Sim, o tbird ou o evolution funcionam, mas tinham o problema de serem pontos fixos de consulta, ou seja, tinha que ter o portátil sempre por perto, ou forma de me ligar a um ponto centralizado para consultar o meu índice.

Sem esse acesso perdia acesso ao meu catalogo. Necessitava de algo que fosse possível consultar, num formato aberto. Por exemplo uma página web em https.

Decidi manter o IMAPS como datastore de email, assente em dovecot, que é de-facto a plataforma de pop3,imaps, etc para Linux e após centralizar todos os meus dados na datastore (com perto de 190GB) cheguei a altura de pensar como resolver o tema de indexação.

Optei pelo mailman para gerar os HTML’s dos emails e criar páginas com threads visíveis, e pelo swish-e para gerir o search engine que irá trabalhar todos os documentos de forma a serem indexáveis.

Como o mailman é algo cego ao que já foi ou não indexado (o processo é descrito mais abaixo), optei por criar dois tipos de mailboxes. O que ainda não foi indexado, e o que já foi.
Para a tarefa criei um simples script que causa a separação dentro da Maildir (o dovecot *tem* que estar forçosamente em modo de maildir e não mailbox).

Nota: Para os próximos passos é necessário terem um backup válido dos vossos emails, sob pena de os baralharem todos ou os perderem.

datafile=/mnt/vmp/originais/mbox
datafile_process=/mnt/vmp/originais/mbox.process
maildir=/mnt/mailboxes-historico/historico
mboxdir=/mnt/vmp/originais
LOG=/mnt/vmp/log/VMP.log

echo “Create Frame”
SAVEIFS=$IFS

IFS=$(echo -en “\n\b”)

for i in `find /mnt/mailboxes-historico/historico -type d | grep -v VMP | sed ‘s/\.INBOX/\.INBOX\.VMP/g’`
                do
                        mkdir -p “$i”
               done

IFS=$SAVEIFS

echo “Generate MBOX from MDIR”
SAVEIFS=$IFS
IFS=$(echo -en “\n\b”)

for i in `find /mnt/mailboxes-historico/PT.historico -type f | grep -v onversation | grep -v VMP`

                do
            formail < $i >> $datafile
            echo “`ls -lah $i` moved” >> $LOG
            mv $i `echo $i | sed ‘s/\.INBOX/\.INBOX\.VMP/g’`
               done

IFS=$SAVEIFS
Em seguida é necessário depurar a qualidade da mailbox gerada:

echo “Cleanup de mbox”
/usr/lib/mailman/bin/cleanarch < $datafile >  $datafile_process # Isto cria uma mbox que o mailman conseguirá indexar.

.. e gerar o HTML a ser indexado:

echo “A gerar HTML”
/usr/lib/mailman/bin/arch –quiet vmp-pt $datafile_process # Isto gera o html da mbox para que o swish-e possa correr e indexar.

Finalmente a gerar a DB que irmos utilizar para o search:

echo “A gerar swish”
/usr/bin/swish-e  -c /mnt/vmp/swish-e/swish.config

O resultado final será uma diretoria de imap com ficheiros com extensão VMP que não será indexada para a próxima vez que carregarem dados.
O pressuposto é, que quando fizerem upload de novo conteúdo no vosso imaps, não coloquem nada novo la dentro de diretórios com o extensões vmp.

Criem por exemplo um diretório no servidor imaps com o nome INBOX.JULHO.2016 e copiem para lá os vossos novos emails.
Na próxima vez que executarem o vosso script, ele irá apenas procurar nos diretórios que não tenha o VMP no nome.

A configuração do search engine em si é extremamente simples e leve:

# cat /mnt/vmp/swish-e/swish.config
# Index file – this is what Swish will create
IndexFile /mnt/vmp/swish-e/vmp-net-xpto.index
# Root of our Mailman archives – everything under here will be indexed
IndexDir /mnt/vmp/vmp
# We want to index .html files only
IndexOnly .html
# Don’t index summary pages: author.html, date.html etc.
#FileRules filename is (attachment\.html|author\.html|date\.html|index\.html|subject\.html|thread\.html)
FileRules filename is (attachment\.html|author\.html|date\.html)
# Replace local (physical) path with the web-accessible path
ReplaceRules replace “/mnt/vmp/vmp/” “/vmp/”

# Store description in search results
IndexContents HTML .html
StoreDescription HTML <pre> 200000
# Look at the title, too
MetaNames swishtitle

FollowSymLinks yes
NoContents .gif .jpg .xbm .au .mov .mpg .pdf .ps
IgnoreTotalWordCountWhenRanking yes

Será necessário configurarem igualmente o ficheiro de configuração do cgi-bin que ira servir de frontend as vossas querys:

# cat /mnt/vmp/swish-e/swish-cgi.conf
return {
    title        => ‘Visible Mail Project V0.2 – Search Engine’,
    swish_binary => ‘/usr/bin/swish-e’,
    swish_index  => ‘/mnt/vmp/swiss-e/vmp.net.xpto.index’,
    secondary_sort  => [qw/swishtitle/],
    sorts           => [qw/swishrank swishtitle swishdocsize/],
    metanames       => [qw/ swishdefault swishtitle /],
    display_props   => [qw/swishdocsize/],
}

O resultado final é extremamente agradável e de fácil utilização.
Acedendo ao site: https://vmp.xxxx.xxxx/cgi-bin/swish.cgi:

Screen Shot 2016-07-06 at 10.24.10

Como podem ver é fácil aceder a informação, podendo serem construidos filtros para depurar o que desejamos ver (por exemplo para a query linux), podendo ser filtradas por ano, vezes vistas ou intervalo de tempo.

blur

Como considerações finais, aponto as possibilidades para este tipo de configuração, seja para um técnico como eu, seja para um grupo comercial onde todos podem indexar os emails do grupo levando a uma partilha de informação disponível a qualquer hora sobre qualquer tópico.

O software utilizado neste post foi:

Dovecot: http://www.dovecot.org/
Mailman: https://www.gnu.org/software/mailman/
Swish-e: http://swish-e.org/

Caso tenham duvidas já sabem onde me podem encontrar.

Abraço!
Nuno