Areas: Principal | Apache | DNS | FreeSWAN | giFT | LDAP | Mutt | Postfix | Sincronia | Vim | VNC

Configurando o Mutt com Fetchmail e sendEmail

by Deives Michellis "thefallen"



Introducao

Quem gosta de ler emails em modo texto (mais rapido e com menos frufrus que os clients graficos), as vezes fica cansado de ter que instalar o sendmail/procmail ou similares soh pra enviar/receber emails...

Aqui tem uma solucao simples e pratica pra manusear seus emails com o mutt e o fetchmail, e o sendEmail pra enviar os emails pro SMTP do provedor, sem daemons adicionais para "detonar" a memoria e a CPU do seu micrinho. Com alguns scripts, podemos resolver essa situacao...

1. Por que Maildir

O formato Maildir consiste em tratar cada mensagem como um arquivo independente dentro de um diretorio (por isso MAIL+DIR). Esse formato eh bastante interessante porque agrega muitas vantagens:

Uma desvantagem que o Maildir causa eh quando se tem muitas mensagens pequenas. Dependendo do seu filesystem, cada arquivo vai ocupar multiplos de 4k no disco (isso eh definido na hora da formatacao do filesystem). Isso quer dizer que mensagens com 1k irao ocupar 4k no disco, mensagens com 4.1k irao ocupar 8k, e assim por diante. Uma vez dito isso, voce ja pode ter uma ideia geral para escolher entre os 2 formatos.

2. Software Necessario

3. Configurando

3.1. Mutt

Pra configurar o Mutt, edite o arquivo .muttrc dentro do seu Home Directory. No site www.mutt.org, tem, no link de configuracoes, um site que monta o .muttrc pra voce, uma vez que ha MUITAS opcoes possiveis de configuracao. Pra quem quer soh o fejao-com-arroz, aqui vao as configuracoes do Mutt que eu uso:

  ~/.muttrc:
  #
  # O nome e email que aparecem no "From" do email
  #
  set realname = "Deives Michellis"
  set from = "dmichellis@yahoo.com"
  # Defaults
  set status_on_top = yes
  set mail_check =5
  set delete = yes
  set beep_new = yes
  set check_new = yes
  set mark_old = no
  set menu_scroll = yes
  #
  # Macro para mostrar as caixas com novos emails automaticamente; basta digitar "c"
  #
  macro   index   c  '<enter>c?<toggle-mailboxes>'
  #
  # Verifica novos emails em multiplas contas
  #
  mailboxes ~/Mail/FUG ~/Mail/Fun ~/Mail/Inbox ~/Mail/Jobs ~/Mail/Lidas ~/Mail/SecuriTeam ~/Mail/Slack-Users ~/Mail/Slackzine
  #
  # Eh aqui que o Mutt deixa TODOS os outros mail clients pra tras... Seu mecanismo de Threading dos emails eh impressionante :)
  #
  set sort = threads
  set sort_aux = reverse-date
  #
  # Mover as mensagens ja lidas pro diretorio de Lidas
  #
  set move = ask-yes
  #
  # Configuracoes de mailbox/maildirs
  #
  set spoolfile = "~/Mail/Inbox/"
  set mbox = "~/Mail/Lidas/"
  set tmpdir = "~/Mail/tmp/"
  set folder = "~/Mail/"
  #
  # Se voce for usar filtros no dropmaildir.sh, pode pedir para o Mutt verificar
  # novas mensagens em outras caixas alem da Inbox. Basta adiciona-las na
  # listinha abaixo:
  #
  mailboxes = ~/Mail/Inbox/ ~/Mail/Securanca/ ~/Mail/UOL/
  #
  # Mude as opcoes pra corresponder as da sua conta de email
  #
  set sendmail = "~/bin/sendEmail -f dmichellis@yahoo.com -s smtp.terra.com.br -q -l /home/thefallen/Mail/logs/sendEmail.log -C -smtpuser dmichellis@terra.com.br -smtppasswd nononono -t "
  #
  # Se voce for usar o GnuPG pra assinar seus emails com certificado digital; fica pro proximo tutorial :)
  #
  #source ~/.mutt-gnupgrc
  #
  # Vamos separar os Alias/catalogo de enderecos num arquivo separado para nao "zonear" o muttrc :)
  #
  source ~/.mutt-alias

E pronto. Temos o Mutt ja configurado pra ler e enviar os emails.

Vamos agora mexer no resto do sistema :)

3.2. Fetchmail

Depois de instalado o fetchmail, vamos configura-lo. O fetchmail ja vem com um utilitario pra fazer isso (o fetchmailconf), mas como nossas opcoes de configuracao sao poucas, vamos faze-las manualmente.

Edite o arquivo ~/.fetchmailrc e adicione as seguintes linhas:

  ~/.fetchmailrc:
  set syslog
  set postmaster "postmaster"
  set nobouncemail
  set no spambounce
  set properties ""
  set daemon 2
  poll pop.sao.terra.com.br with proto POP3
         user 'dmichellis' there with password 'nonono' is thefallen here mda '~/bin/dropmaildir.sh Inbox'
  poll pop3.uol.com.br with proto POP3
         user 'dmichellis' there with password 'nonono' is thefallen here mda '~/bin/dropmaildir.sh Inbox'

Essa configuracao do fetchmail pede o script "~/bin/dropmaildir.sh".

O dropmaildir.sh eh o responsavel por salvar a mensagem no formato Maildir.

Aqui vai o dito cujo:

  ~/bin/dropmaildir.sh:
  #!/bin/sh
  #
  # Script pra salvar um email em um determinado diretorio com a estrutura Maildir
  #
  # A estrutura Maildir consiste em ter 3 diretorios: cur, new e tmp.
  #
  # O cur sao as msgs ja lidas, ou seja, na caixa corrente. o new sao as novas mensagens que vc ainda nao leu. o tmp ta na cara o q eh, neh? :)
  #

  CAIXA=$1
  if [ "x$CAIXA" = "x" ]; then
    CAIXA="Inbox"
  fi
  BASEDIR=/home/thefallen/Mail/
  DIRETORIO=$BASEDIR/$CAIXA
  if [ ! -d $DIRETORIO/new ]; then
    mkdir -p $DIRETORIO/new
  fi

  if [ ! -d $DIRETORIO/tmp ]; then
    mkdir -p $DIRETORIO/tmp
  fi

  if [ ! -d $DIRETORIO/cur ]; then
    mkdir -p $DIRETORIO/cur
  fi

  DATA=`date +%Y%m%d%H%M%S`
  #
  # O diretorio "tmp" eh usado para "montar" a mensagem e depois move-la para o diretorio apropriado.
  # Isso impede q algum client leia a mensage enqto ela esta sendo montada (o q acontece qdo salvamos direto no new).
  #
  # Adicionalmente, mantem o nome do arquivo temporario em uma variavel
  #
  ARQNAME=$DIRETORIO/tmp/msg.$DATA.$$.$RANDOM
  cat >> $ARQNAME
  #
  # Exemplo de filtros
  # Use sempre o comando "elif" (else + if) para os filtros, para q uma mesma mensagem nao seja filtrada mais de uma vez
  #
  if [ `grep -i "^subject: [Dicas-L]" $ARQNAME | wc -l ` -ne 0 ]; then
    mv -f $ARQNAME  $BASEDIR/DicasL/new/
  elif [ `grep -i "buddy@somewhere.com" $ARQNAME | grep -i "^From:" | wc -l ` -ne 0 ]; then
    # Para adicionar mais filtros, basta copiar esse laco "elif" e mudar os "greps"
    mv -f $ARQNAME $BASEDIR/Buddy/new/
  else
    #
    # Se nao cair em nenhum filtro, mova do diretorio temporario para o "new"
    #
    mv -f $ARQNAME $DIRETORIO/new/
  fi

E pronto :). Esse script permite que voce "gerencie" mais de uma caixa, ou que separe por Contas. Na configuracao do fetchmail, por exemplo, eu poderia alterar:

  ~/.fetchmailrc:
  poll pop.sao.terra.com.br with proto POP3
         user 'dmichellis' there with password 'nonono' is thefallen here mda '~/bin/dropmaildir.sh Terra'
  poll pop3.uol.com.br with proto POP3
         user 'dmichellis' there with password 'nonono' is thefallen here mda '~/bin/dropmaildir.sh UOL'

Isso faria com que as mensagens obtidas do POP3 do Terra fossem pro Maildir do Terra, e as do UOL fossem pro Maildir do UOL. Legal, neh? :)

Voce pode configurar o fetchmail pra rodar via cron com uma linha similar a essa no seu crontab:

  0 * * * * /lugar/onde/esta/o/fetchmail -a -d0

Pra criar um diretorio Maildir, eh bastante simples. Simplesmente crie um diretorio com 3 subdiretorios: cur, tmp e new.

Aqui vai um scriptzinho que faz isso:

  ~/bin/makemaildir.sh:
  #!/bin/sh
  mkdir -p $1/cur $1/tmp $1/new

Basta rodar o comando:

  thefallen@KlingonRealm:~/Mail$ makemaildir.sh Inbox

3.3. sendEmail

Para configurarmos o sendEmail, primeiro precisamos "patchea-lo" para ser usado com o Mutt (Sendmail-compatibility) e depois pra usar SMTPAuth, se for o caso no seu provedor.

Uma vez que voce fez o download do sendEmail, va no diretorio que acabou de ser criado e rode o patch:

  thefallen@KlingonRealm:/usr/src/sendEmail-1.42$ bunzip2 -c sendEmail-1.42-SMTPAUTH_SendmailCompat.patch.bz2 | patch -p 1 --dry-run
  ...

Se nao aparecer nenhum erro, rode o comando novamente sem o "--dry-run":

  thefallen@KlingonRealm:/usr/src/sendEmail-1.42$ bunzip2 -c sendEmail-1.42-SMTPAUTH_SendmailCompat.patch.bz2 | patch -p 1

Pronto. rode agora o comando "./sendEmail --help". Verifique se as seguintes linhas aparecem:

   ...
      -C                   Activate Sendmail-style compatibility (Message will be sent to SMTP "as-is")
   ...
    SMPTAuth (AUTH PLAIN only!):
      -smtpuser            Username to authenticate as
      -smtppasswd          Password to authenticate with
   ...

E pronto. Agora eh soh entrar no Mutt e mandar um email pra ver se tudo esta ok :)

4. FetchYahoo!

Aqui vai um "brinde" pra quem tem email no Yahoo! - o FetchYahoo! :) - http://fetchyahoo.sourceforge.net/

Esse script em Perl (versao 2.5.5 na escrita deste documento) requere alguns modulos do Perl que podem facilmente ser instalados via CPAN: HTML::Entities, LWP::UserAgent, MIME::Entity, Net:SMTP, Crypt::SSLeay (https)

Como a ideia desse documento nao era o FetchYahoo!, aqui vao soh as dicas pra faze-lo funcionar com essa estrutura que ja montamos.

Junto com ele, ja vem o arquivo fetchyahoorc. Copie-o para seu home directory como .fetchyahoorc, e altere os seguintes dados:

  ~/.fetchyahoorc:
  username = seuyahooid
  password = senha
  use-spool = 1
  no-delete = 0
  spool = /lugar/onde/esta/o/dropmaildir.sh
  spool-mode = pipe
  logout = 1

Soh agenda-lo no cron pra rodar com seu usuario com uma linha similar a essa:

  0 * * * * /lugar/onde/esta/o/fetchyahoo.pl

5. Conclusao

Esse eh um jeito de receber e enviar emails sem precisar subir um SMTP/MTA (Postfix, Sendmail, Exim, Qmail, etc), que normalmente consomem uma quantia razoavel da sua memoria, se voce ja estiver brigando byte-a-byte com ela :)

Tenho achado bastante pratico o formato Maildir, pois eh bem facil fazer um "grep" na mailbox e mover os arquivos pra outro diretorio. Espero que seja util pra quem for usa-lo tambem (especialmente pra quem tem conta no Terra que exige SMTP autenticado) :)

Sobre o autor

Deives Michellis "thefallen" <dmichellis@yahoo.com | thefallen@unitednerds.org>

Ultima Revisao: Thu Apr 15 12:03:59 2004

Criado com o txt2tags



A menos que especificado de outra maneira, todos os documentos e textos sao protegidos sob licenca BSD - Veja a licenca para mais detalhes
Leia tambem sobre o motivo de uso de licencas em documentacao.