Há cerca de dois anos resolvi aceitar a dura realidade de que nenhum programa de email presta. Após essa revelação, resolvi seguir os passos dos que foram iluminados antes e resolvi usar o mutt 1. O mutt é um programa bacana criado com um único propósito: ler email. Isso quer dizer que ele não não se preocupa em baixar os emails, enviá-los ou em editá-los. Ele é até capaz de fazer isso, mas sejamos sinceros, ele é uma porcaria desempenhando essas outras funções. :)

Screenshot do
mutt

Então, depois de configurar meu ambiente de email, com

  • offlineimap para sincronização do backup local de mensagens com os servidores IMAP de meu email;
  • vim para edição dos emails;
  • msmtp para envio dos emails por SMTP;
  • msmtpqueue para manutenção da fila de emails não enviados;
  • Truecrypt para cifragem do banco de dados de emails;
  • GnuPG para a paranóia básica;
  • gnome-keyring como chaveiro com as minhas senhas2;
  • nmzmail para indexação e busca rápida das minhas mensagens.

Essa configuração funciona muito bem, mas dia desses acabei esbarrando numa página que comparava três indexadores (mairix, nmzmail e maildir-utils) e que dizia que o maildir-utils era a opção do sujeito.

Nunca considerei o mairix pois li em alguns reviews [citation needed] que o nmzmail possuía mais impressões positivas, mas como não conhecia o maildir-utils (mu), era hora de comparar os dois e ver no que dava. Meu objetivo não era comparar por comparar, mas o nmzmail costumava gastar bastante tempo processando meu banco de dados de email, que consiste de aproximadamente 45000 documentos e quase dois milhões de palavras.

Após instalação do mu, hora de gerar o índice. Como a geração inicial do índice costuma ser custosa, ela não foi usada para comparação. No entanto, após a criação do índice, resolvi fazer algumas novas indexações para comparação de desempenho (há um cronjob que levanta de três em três horas para atualizar o índice, quanto menos tempo, melhor). Enquanto o tempo total de indexação do mu ficou na ordem de cinco segundos em todas as execuções, o nmzmail levou cerca de 50 segundos. :o

Depois desse resultado, resolvi usar o mu por mais algum tempo para ver se me adapto ao programa. Infelizmente ele não possui uma interface para entrada de consultas (pelo menos eu não vi nenhuma) e a solução do zack não me agradou muito. Por isso, criei o script python abaixo para fazer cache das consultas com readline e facilitar a minha vida.

#!/usr/bin/env python

import atexit
import readline

from os.path import join
from os import environ as env
from subprocess import call

HOME = env['HOME']
INDEXPATH = join(HOME, '.mu', 'results')
MAILDIRPATH = join(HOME, 'Maildir')
HISTORY = '.mailfinder_history'
HISTFILE = join(HOME, HISTORY)

try:
    readline.read_history_file(HISTFILE)
except IOError:
    pass

atexit.register(readline.write_history_file, HISTFILE)

def main():
    query = raw_input('Query: ')
    call(['rm -fr %s' % INDEXPATH], shell = True)
    command = 'mu find -m %s -l %s %s' % (MAILDIRPATH, INDEXPATH, query)
    ret = call([command], env = env, shell = True)

if __name__ == '__main__':
    main()

No mutt, continuo com o meu antigo atalho (S) para para execução das consultas e adicionei outro atalho (F9) para revisitar os resultados da última busca:

macro generic S "<shell-escape>mail-finder.py<return><esc>c~/.mu/results<return>" "Search via mu"
macro index <F9> "<change-folder-readonly>~/.mu/results\n" "Display mu find results"

O script de atualização dos índices, por sua vez, ficou assim agora:

#!/bin/sh

mount | grep $MAILDIR &> /dev/null
if [ "$?" == "1" ]; then
    echo "$MAILDIR not mounted. Aborting." > /dev/stderr
    exit 1
fi

exec nice -n 19 /usr/bin/mu index -q -m $MAILDIR

Fim! Legal, né?

PS: O esquema de cores padrão do mutt é meio nojento também. Depois de virar usuário do zenburn, acabei criando um tema equivalente para o mutt, exibido no início deste post.


  1. O slogan do mutt é “All mail clients suck. This one just sucks less.” 

  2. A questão do chaveiro é complicada. Eu queria uma solução realmente multiplataforma, mas ainda não achei algo que seja satisfatório. 

Related content