Sendmail e qmail

Linux in Brazil

Documentação original
e de qualidade
em bom português

Dúvidas comuns | Perguntar no Fórum | Notícias | Mais documentos | Contato
Comparação entre os servidores de e-mail: sendmail e qmail

Elvis Pfutzenreuter
 



 

Sua primeira versão foi escrita em 1979, por Eric Allman.  Desde então, tem sido incluído em todas as distribuições UNIX. Ele ficou um tanto "esquecido"  pelo autor entre 1982 e 1990. Por esse e outros motivos, os diversos fabricantes de UNIX  (IBM, HP, Sun) trataram de expandir e melhorar o sendmail original. O resultado desse processo foi o aparecimento de inúmeras versões incompatíveis entre si.

Em 1994,  Eric começou a trabalhar na versão 8.7 do sendmail, que incorporou a maioria das extensões apresentadas pelos UNIXes comerciais. Assim, o sendmail passou a ser novamente um programa único.

A versão atual do sendmail é a 8.9.2, que foi liberada no final de 1998. O site mestre do sendmail é http://www.sendmail.org. As versões comerciais podem ser encontradas no site http://www.sendmail.com.
 

Vantagens do sendmail

Padrao da Internet

Mais de 70% dos servidores de e-mail utilizam o sendmail como MTA (mail transfer agent).  O QMail ainda detém um sétimo lugar em utilização na Internet, atrás do Exchange Server da Microsoft e de outros.

Documentação

Existe uma quantidade razoável de documentação sobre o sendmail na Internet; existem HOWTOs dedicados a certos aspectos da configuração do sendmail; e caso tudo isso falhe, sempre há o livro sendmail, da O´ Reilly, mais conhecido pelos íntimos como BatBook.

Ainda não existe um livro para o QMail, e a documentação sobre o mesmo na Internet ainda é pouca. Sua documentação on-line é suficiente porém esparsa, ainda pode melhorar bastante.

Configuração poderosa/flexível

A flexibilidade de configuração do sendmail é impressionante, bem superior a do QMail. Essa flexibilidade é herança de uma época onde redes TCP/IP, UUCP e outras tinham de conviver em harmonia. (Hoje, com o monopólio do TCP/IP e da uniformização da Rede, essa vantagem do sendmail já não é um diferencial tao importante.)

Suporte comercial

A Sendmail Inc., empresa fundada pelo próprio Eric Allman, vende versões comerciais do sendmail com front-end gráfico de configuração. Isso pode ser interessante para aqueles que precisam de suporte comercial ou fazem questão da configuração facilitada em modo gráfico.

No caso do QMail, o que existe são empresas que dão suporte comercial ao QMail, sem vinculação direta com o autor.

Versão para NT

Uma das versões comerciais é para a plataforma Windows NT. Não existe versão do QMail para Windows.
 



O QMail foi escrito por D. J. Bernstein. A primeira versão pública (beta, 0.7) foi liberada em Janeiro/1996.

Por ser um programa recente, levou em conta desde o início questões como segurança, que tornaram-se críticas após a difusão explosiva da Internet. Tambem levou em conta os problemas e complexidades do próprio sendmail; e procurou mimificar todos os seus recursos. Disso resultou um programa que é o principal concorrente free-software do sendmail.

A versão atual do QMail é a 1.03, liberada em junho/1998. O site mestre do QMail é, previsivelmente, http://www.qmail.org.
 
 
 

Vantagens do QMail

Velocidade

Segundo o autor, o QMail é até 100 vezes mais rápido que o sendmail em determinadas tarefas.

Segurança

O QMail foi planejado desde o início para ser seguro.  O autor chegou a oferecer um prêmio de US$ 1.000 para quem conseguisse invadir uma máquina por meio de uma fraqueza do QMail. Ninguém conseguiu, e o dinheiro acabou sendo doado à Free Software Foundation.

Enquanto o sendmail é um programa monolítico (um único executável que faz tudo) rodando com permissões de superusuário, o QMail é dividido em diversos executáveis, dos quais apenas um (o que gerencia a fila) tem permissão de superusuário. Mesmo que um invasor remoto consiga "tomar conta" de um dos programas de comunicação, nao terá permissão para fazer muita coisa. Já se ele tomar conta do sendmail, terá permissoes de superusuário.

Outro aspecto interessante do QMail é que ele usa uma biblioteca própria, diferenciada, para lidar com strings. Isso praticamente elimina a chance de ocorrer um estouro de buffer, que é o defeito mais comumente explorado na invasão de um programa.

Facilidade de configuração

A forma de armazenamento dos parâmetros de configuração é direta, honesta, em arquivos claramente nominados, é incrivelmente fácil de entender e manter.

Já no caso do sendmail, aos que vão querer ou vão precisar usá-lo, recomendo adquirir o BatBook. A configuração via macros é relativamente fácil, mas depois que você tiver uma boa noção do funcionamento geral do sendmail, e *isso* é dificil obter.

Adoção bem-sucedida por grandes usuários de e-mail

Empresas como Red Hat e Conectiva substituíram o sendmail pelo QMail com grande sucesso.
 



Recomendação final
 
Recomendamos a utilização do QMail, salvo em alguma situação especial que exija o uso do sendmail.

Consultores e administradores de sistema deveriam estudar os dois programas, pois poderão ter de enfrentar situações do tipo "transição do sendmail para o QMail", ou "configuração do sendmail em servidor preexistente".



Exemplos de configuração dos servidores sendmail e QMail


Elvis Pfutzenreuter

epx@netville.com.br
     Configuração
 

(fonte: sendmail address rewriting mini-HOWTO)
 

Instale o sendmail. A maioria, se não a totalidade das distribuições Linux vem com o sendmail; basta instalar o respectivo TGZ ou RPM. A própria instalação já ativa o serviço na porta 25, basta reiniciar a máquina.

Configurar diretamente o arquivo /etc/sendmail.cf seria uma aventura à parte. Aqui, utilizaremos um processador de macros (m4) para gerar o arquivo de configuração. Quem quiser que use o diff para ver em que pontos o /etc/sendmail.cf padrãozão será modificado.
 

# cd /usr/src/sendmail/cf/cf
 

Crie um arquivo de configuração com este conteúdo:

include(` ../m4/cf.m4´ )
VERSIONID(`versao EPX para workstations dial-up´)dnl
OSTYPE(linux)
FEATURE(nouucp)dnl
FEATURE(masquerade_envelope)
FEATURE(genericstable, `hash -o genericstable´)
GENERICS_DOMAIN_FILE(`/etc/genericsdomain´)
define(`SMART_HOST´,`netville.com.br´)
define(`ALIAS_FILE´,`/etc/aliases´)
MAILER(local)dnl
MAILER(smtp)dnl

A feature masquerade_envelope indica que queremos mascarar o remetente. De fato, queremos que epx@vnsa.netville.com.br saia como epx@netville.com.br para o mundo externo.

A definição SMART_HOST  permite-nos dizer para que servidor de e-mail devemos passar adiante as mensagens não locais. Não queremos entregá-las nós mesmos, pois isso demoraria muito e ocuparia muito tempo de uma cara linha discada. Se fôssemos um provedor Internet, nao usaríamos esse recurso.

Note que as aspas simples que cercam alguns campos são aspas opostas (a crase à esquerda, o apostrofe à direita). Coisas de m4....

Depois execute o comando

# m4 epx.mc > /etc/sendmail.cf

Agora, vamos ao diretório /etc, criar algumas tabelas.

# cd /etc

# echo "" > genericstable
# echo "epx  epx@netville.com.br" >> genericstable
# echo "root epx@netville.com.br" >> genericstable
# makemap -r hash genericstable.db < genericstable

A função desta tabela é determinar que os endereços da primeira coluna - no caso, endereços locais - serão convertidos para os endereços à direita.  Quem eventualmente responder a um de nossos e-mails, mandará a resposta para a caixa postal do provedor, que atende 24h por dia e está registrada no DNS.

# echo "vnsa.netville.com.br" > genericsdomain

Os domínios constantes nesse arquivo serão considerados locais. Pelo menos no nosso caso, basta inserir o nome de nossa própria máquina.

# echo "postmaster: epx" > aliases
# newaliases

A função desta tabela é passar adiante os e-mails de certos usuários para outros. Todo servidor de e-mail deve aceitar mensagens para o usuário postmaster, então no nosso caso passaremos essas mensagens adiante para um usuário real.

# killall -1 sendmail

Ordenamos ao sendmail que releia nossos arquivos de configuração, e aí temos nosso próprio servidor de e-mail.   Configuração
 

Instale o QMail conforme os arquivos de instrução INSTALL.*. Voce poderá configurar a iniciação do QMail de modo que ele entregue as mensagens locais no diretório do usuário, ou utilize a forma tradicional (var/spool/mail). Eu optei pela forma tradicional.

O conteúdo dos arquivos de configuração, no meu caso, ficou assim:

$ cd /var/qmail

$ cat alias/.qmail-default

| forward "$LOCAL"@mail.netville.com.br

# pela forma como os outros arquivos foram configurados, o QMail pensará que
# qualquer destinatário no formato usuario@netville.com.br é local, e sabemos
# que isso nao é verdade.
#
# o arquivo .qmail-default faz com que todos os e-mails desse tipo cuja entrega
# local falhar, sejam passados adiante para o servidor mail.netville.com.br
#
# é importante que o servidor de e-mail do provedor seja especificado na
# forma canônica, do contrário o QMail tentará entregar o e-mail
# localmente de novo, e falhará.
 

$ cat alias/.qmail-mailer-daemon

epx

# note que o nome dos arquivos tem importância para o QMail. Esse arquivo
# faz com que quaisquer e-mails para o MAILER-DAEMON local sejam roteados
# para o usuario epx.
 

$ cat alias/.qmail-postmaster

epx

# idem anterior; roteia postmaster para epx
 

$ cat alias/.qmail-root

epx

# Como o QMail nunca entrega e-mail local para o usuário root, é
# necessário roteá-lo para outro lugar. Do contrário, o e-mail seria
# roteado para um usuário chamado alias, e nunca lido.
 

$ cat control/defaultdomain

netville.com.br

# nome do dominio.
 

$ cat control/defaulthost

netville.com.br

# se esse arquivo existir, o domínio de todos os e-mails locais
# será alterado para o conteúdo dele, no caso netville.com.br,
# por ocasião da passagem adiante.
#
# O objetivo é que e-mails na forma epx@vnsa.netville.com.br
# seja passado adiante como epx@netville.com.br, pois nossa
# máquina nao está sempre ligada e nao tem registro no DNS.
#
# Note que isso implica em que o nome do usuario local seja
# idêntico ao nome do usuário no provedor.
 

$ cat control/locals

vnsa.netville.com.br
netville.com.br

# e-mails para essas máquinas/domínios serao considerados
# locais, e tentar-se-á entregá-los localmente.
 

$ cat control/me

vnsa.netville.com.br

# nome da máquina local
 

$ cat control/plusdomain

com.br

# domínio superior.
 

$ cat control/smtproutes

:mail.netville.com.br

# roteia todos os e-mails para o servidor mail.netville.com.br
# Note que é necessário especificar o nome canônico completo,
# do contrário o QMail vai tentar entregar o e-mail localmente,
# e estará configurado um ciclo infinito.
#
# se esse arquivo não existir, o QMail entregará os e-mails
# diretamente aos servidores dos destinatários. Isso pode ser
# uma boa idéia se formos um provedor, mas não se formos um
# pobre usuário Linux com uma linha discada.
#
# os dois pontos na frente do servidor indicam que todos os
# e-mails não-locais serão roteados para mail.netville.com.br.
# poderíamos, se necessário, criar rotas específicas para
# certos domínios, usuários, especificando-os antes dos :
 

$ cat control/rcpthosts

cat: rcpthosts: No such file or directory

# Você pode criar esse arquivo com os domínios para quem
# o seu QMail será autorizado a entregar mensagens.
# Isso não tem muito mérito num sistema caseiro, mas pode
# ter alguma utilidade num sistema corporativo...
 

$ cd /etc

$ cat inetd.conf | grep smtp

smtp stream tcp nowait qmaild /usr/sbin/tcpd /var/qmail/bin/tcp-env /var/qmail/bin/qmail-smtpd

# diferentemente do Sendmail, o QMail não atende diretamente na porta 25,
# os tcp-wrappers são necessários.
 

$ cat hosts.allow

ALL: 127.0.0.1

$ cat hosts.deny

ALL: ALL

# Não seria uma boa idéia deixar pessoal externo usar nosso servidor de e-mail,
# certo ?
 

(Verifique as páginas man e em particular o FAQ do QMail para obter estas e outras dicas de configuração)

Agora, configure seu software de leitura de e-mails predileto para remeter e-mails via o servidor local (localhost ou 127.0.0.1).
  Configuração do Fetchmail
 

O objetivo é que o Fetchmail verifique periodicamente a caixa postal que temos em nosso provedor, e transfira o que houver lá para nossa caixa postal local. Isso é simples. Basta criar um arquivo chamado

~/.fetchmailrc

com um conteúdo semelhante a este, naturalmente adaptado as suas necessidades:

set daemon 240

# faz com que o fetchmail rode em segundo plano, e verifique a caixa postal a cada 240 segundos

poll mail.netville.com.br with protocol pop3 and port 110 password abracadabra forcecr

# Consulte o servidor mail.netville.com.br, via protocolo POP3, porta 110
# Minha senha é "abracadabra".
# Utilize CR/LFs quando for comunicar-se com o servidor de e-mail local.

A cláusula forcecr é obrigatória se seu servidor de e-mail local é o QMail. Ele exige que seus clientes usem CR/LF ao fim de cada linha, e o Fetchmail utiliza, por padrão, apenas LF. (Isso mesmo, o Fetchmail entrega o e-mail a caixa postal local via SMTP!). A nao observância desse detalhe faz o fetchmail falhar.

Não precisei especificar o nome de usuário pois meu nome no sistema local (epx) é idêntico ao nome no servidor da Netville. Mas seu caso pode ser diferente. Veja man fetchmail para maiores detalhes.

Inclua a chamada ao programa fetchmail no /etc/profile ou no ~/.profile do(s) usuário(s) que tenha(m) caixa(s) postal(is) em um sistema remoto.

IMPORTANTE

Alguns leitores de e-mail suportam ler as mensagens diretamente do arquivo de spool, /var/spool/mail/epx, no meu caso. Exemplos: KMail (do KDE), pine, mail (modo texto) e outros.

Já o Netscape não suporta essa modalidade de leitura de e-mails. Se fizer questão do Netscape e também da caixa postal local, instale um servidor de POP3 local. Então configure o "incoming mail server" como localhost.
  Exemplos de configuração dos servidores sendmail e QMail

A maioria de nós tem máquinas ligadas a Internet por conexão dial-up. A princípio, isso tira o mérito de rodar um servidor de e-mail. Mas nós queremos um servidor de e-mail só nosso para brincar, de qualquer jeito... Os exemplos de configuração a seguir abordam esse caso, e estão funcionando em meu computador.
 

Meu provedor de Internet: netville.com.br

Dei à minha maquina o nome vnsa.netville.com.br
(o nó é vnsa, o dominio é netville.com.br)

bash$ cat /etc/hosts

# For loopbacking.
127.0.0.1       localhost
127.0.0.1       vnsa.netville.com.br vnsa

bash$ cat /etc/HOSTNAME
vnsa.netville.com.br

Esse nome de maquina - vnsa - nao está registrado no DNS do meu provedor, portanto ninguém do mundo exterior chegará à minha máquina usando esse nome. Ele só é reconhecido localmente.

Usuários no sistema local: epx e cobaia.Poderiam haver mais.

Caixa postal no servidor de e-mail do provedor: epx@netville.com.br

(Os programas de remessa de e-mail devem estar configurados com esse nome de caixa postal, para que os diversos campos do e-mail, como "Return-Path:" e outros estejam preenchidos com um e-mail válido. A não observancia desse fato fez com que meu provedor aceitasse todos os meus e-mails mas nao entregasse nenhum...)

* Deverá ser possivel mandar e-mails entre usuários locais SEM QUE esses e-mails sejam repassados ao servidor da Netville.

* Obviamente, deverá ser possivel mandar e-mails para outras caixas postais da Netville. É importante frisar esse ponto, veremos depois o porquê.

* E-mails para sites remotos devem ser simplesmente passados adiante ao servidor de e-mail da Netville. Por que não entregar diretamente no site de destino ? Pois isso pode tomar muito tempo se o site for distante e lento (imagine você, mandando um arquivo enorme para quem@hotmail.com). Queremos entregar rapidamente o e-mail para a Netville e ela que se encarregue de mandá-lo adiante.

* Como o nome vnsa.netville.com.br nao é conhecido na Internet, e é uma maquina que não estará conectada o tempo todo, queremos que nossos correspondentes remotos mandem replys para epx@netville.com.br, e não para epx@vnsa.netville.com.br. Isso implica em que nosso servidor de e-mail MODIFIQUE o endereco do remetente, tirando fora o "vnsa".

* Também queremos LER nossos e-mails localmente. Para atingir esse objetivo, utilizaremos outro software, o fetchmail.
 

Configurar o sendmail para atingir os objetivos acima

Configurar o QMail para atingir os objetivos acima

Configurar o fetchmail para atingir o ultimo objetivo
 

IMPORTANTE: você até pode instalar os dois servidores de e-mail, mas não poderá rodar os dois serviços ao mesmo tempo. Desative um antes de ativar o outro.