Introdução

Conceitos Básicos e historico

Email : Protocolos de transferência

Qmail: Arquitetura

Qmail: Instalação

Comparativos entre Servidores de Email (MTA)

Conclusões e Perguntas

Bibliografia

 

 

O sistema qmail consiste de alguns programas executáveis, arquivos de configuração e variáveis de ambiente UNIX. Todos estes estão relacionados uns com os outros para fornecer um serviço de email. A figura 9 mostra um diagrama de blocos das partes do qmail.

Figura 9
Figura 9

Os processos

O pacote qmail necessita que cinco programas fiquem em execução em segundo plano todo o tempo. Esses programas centrais permitem ao qmail realizar a varredura das filas de email a procura de novas mensagens e manda-las para o destino próprio.

Os programas de utilidade

Alem dos cinco processos, existem outros utilitários do qmail que podem ser usados por seus processos ou por usuários locais para manipular e transmitir mensagens. Dentro os mais utilizados pelos usuários, é possível citar os criadores de caixa postal (maildirmake).

Os arquivos de controle

O próximo bloco no diagrama são os arquivos de controle. Este arquivos são o modo de armazenamento das configurações do servidor. Diferente de outros pacotes de programas de email que usam um arquivo de configuração monolítica, o qmail usa muitos arquivos individualizados de controle, cada um definindo uma parte do quebra cabeça.

Todos os arquivos de configuração estão localizados em um diretório comum: /var/qmail/control/. Todos usuários tem acesso de leitura para os arquivos deste diretório, mas somente o administrador tem capacidade de modificar os valores destes arquivos.

Os arquivo de controle tem um valor padrão definido no sistema qmail. Se um arquivo de controle não está presente, seu valor será predefinido pelo qmail. Se um arquivo de controle está presente, seus dados sobrepõe os valores padrão. Enquanto alguns arquivos de controle podem conter um valor somente, outros são permitidos conter uma lista de múltiplas variáveis.

Dois exemplos disso são os arquivo "virtualdomains" e "rcpthosts". O arquivo de controle "virtualdomains" permite ao administrador do qmail a definir os domínios aos quais o servidor qmail pode processar a mensagem. Cada domínio virtual é definido em uma única linha neste arquivo. O arquivo "rcpthosts" instrui ao sistema qmail os domínios nos quais as mensagens serão recebidas. Embora os dois sejam semelhantes e freqüentemente utilizados juntos, estão em arquivo separados. Este é o projeto típico do sistema qmail.

Um aspecto confuso dos arquivos de controle é que, mesmo se seus valores forem fixados por entradas no arquivo de controle, eles podem ser também sobrepostos por variáveis de ambiente UNIX.

As variáveis de ambiente

Além dos arquivos de controle, os programas do qmail tem capacidade para usar as variáveis de ambiente UNIX para controlar seu comportamento. A maioria dos valores de arquivos de controle podem ser sobrepostos por estas variáveis. Se estas variáveis não forem fixadas, o valor do arquivo de controle é utilizado.
Geralmente, as variáveis de ambiente são fixadas antes que um programa qmail seja executado. Isto é alcançado com um programa de envelope. Um programa deste tipo que é normalmente utilizado é o tcpserver.

O processo de distribuição de emails

O pacote qmail é composto de alguns programas executáveis que interagem para transferir as mensagens. A figura 10 mostra um diagrama de blocos dos programas centrais utilizados pelo qmail.

Figura 10
Figura 10

Como mostrado na figura acima, existem nove programas principais utilizados pelo qmail. Suas funcionalidades são:

qmail-smtp

Este programa é responsável por receber as mensagens de email de servidores remotos e passa-los para o programa qmail-queue para processamento. O programa qmail-smtp recebe a mensagem utilizando o protocolo SMTP e deve estar preparado para receber mensagens da rede a qualquer hora. Apesar disso, este não é executado como um programa contínuo em segundo plano. Este se utiliza de um programa de auxilio de rede para monitorar tentativas de conexões IP. O programa inetd é um programa UNIX comum utilizado pelo Linux e FreeBSD para monitorar estas conexões. Quando uma tentativa de conexão é detectada, o inetd automaticamente inicia o programa qmail-smtp e passa o controle para conexão IP para este. Também podemos utilizar o programa tcpserver para realizar esta tarefa.
Logo que o programa qmail-smtp estabelece uma conexão SMTP com o servidor de emails remoto, este poderá enviar mensagens para o servidor qmail.
Para testar o programa qmail-smtp, é possível manualmente realizarmos telnet para a porta SMTP (Porta TCP 25) no servidor de email local. Assim que a conexão for estabelecida, deve-se entrar manualmente comandos SMTP para realizar a comunicação com o servidor.

qmail-inject

Este programa é utilizado para aceitar mensagens geradas localmente e para repassa-las para o programa qmail-queue. Muitas vezes, as mensagem são passadas para o qmail-inject pelos MUAs do sistema UNIX, com mail, pine e elm.
Antes de passar as mensagens de entrada para o programa qmail-queue, o qmail-inject realiza uma varredura na mensagem para garantir que esta possui cabeçalhos de acordo com a RFC822. Esta RFC (Request for comments) descreve o cabeçalho padrão que fornece informação sobre o servidor, remetente, data, assunto e outros detalhes técnicos do email.

qmail-send

Assim que uma mensagem for colocada com sucesso na fila do qmail, o programa qmail-send é usado para processa-la. O programa qmail-send examina o status de cada mensagem na fila. Mensagens que falharam em sua ultima tentativa de envio são identificadas, e é determinado se estas possuem status de erro temporário ou permanente quanto ao envio. Mensagens com status de erro temporário de envio são tentadas novamente. Mensagens com status de erro permanente são passadas para o programa qmail-clean para remoção. Mensagens que ainda não foram enviadas são mandadas ao envio.
O programa qmail-send usa os programas qmail-lspawn e qmail-rspawn. Qualquer mensagem com o endereço de receptor determinado como sendo local para o servidor de email é passado para o programa qmail-lspawn. Qualquer mensagem com endereço de receptor determinado como sendo para um servidor remoto de email é passado para o programa qmail-rspawn. Assim que a mensagem é passada para um destes programas, o trabalho do qmail-send está concluído.
O programa qmail-send é executado como um processo em segundo plano no servidor de email. Quando o qmail-send é iniciado, este lê os arquivos de controle e configuração. Para determinar se o servidor qmail está em funcionamento, é possível utilizar o comando ps e verificar o programa qmail-send em execução.

qmail-clean

Este programa é usado para remover mensagens não enviadas, da fila de emails, que aparentemente falharam. O qmail usa um sistema multiestado de identificação de mensagens na fila de emails. Cada mensagem atravessa alguns estados enquanto é processada. Se em algum momento, o servidor travar, o programa qmail-send poderá detectar o ultimo estado bem sucedido da mensagem e continua-la processando. Se o programa qmail-send é incapaz de processa-la devido a erros no servidor ou porque a mensagem não pode ser entregue, o programa qmail-clean é chamado para remover a mensagem da fila de emails.
Assim como o programa qmail-send, o qmail-clean é executado continuamente em segundo plano.

qmail-rspawn

Este programa é chamado pelo qmail-send quando a mensagem é destinada a um usuário em um servidor de email remoto. O qmail-rspawn tenta agendar a mensagem para entrega pelo programa qmail-remote, invocando assincronamente este ultimo.
Um trabalho do qmail-rspawn é determinar o servidor de email destino para cada um dos receptores da mensagem. O programa qmail-remote é chamada uma vez para cada servidor receptor remoto.
Assim como o qmail-send e qmail-clean, este programa é executado continuamente em segundo plano.

qmail-remote

O trabalho do qmail-remote é entregar mensagens de email para usuários remotos através do protocolo SMTP. As mensagens são passadas para este programa através do qmail-rspawn descrito na seção anterior. O programa qmail-remote só pode se conectar com somente um servidor remoto quando é invocado. Apesar disso, este programa pode entregar mensagens de email para múltiplos receptores no mesmo servidor remoto ao mesmo tempo. É responsabilidade do qmail-rspawn chamar o programa qmail-remote múltiplas vezes, dependendo dos servidores de email de destino.

Durante o processamento, o qmail-remote varre o corpo da mensagem de email para determinar se esta está no formato SMTP correto. Um único ponto no início de qualquer linha é trocado por dois pontos de acordo com as convenções normais de SMTP (Conforme explicado anteriormente, o ponto sinaliza o final da mensagem e caso isto não fosse corrigido, estaríamos introduzindo um erro na comunicação). Alem disso, todas as linhas em uma mensagem SMTP devem terminar com uma quebra de linha (CR e LF). Qualquer quebras de linhas no estilo UNIX (LF) são adicionadas de CR para ficar de acordo com o formato SMTP.

qmail-lspawn

Este programa é similar ao qmail-rspawn e é chamado pelo qmail-send. qmail-lspawn é responsável por agendar a entrega de mensagens quando esta for determinada para ser entregue a um usuário no servidor de email local.

qmail-local

Este programa é usado para entregar mensagens para o servidor de email local. O qmail-local possui algoritmos de detecção de laços na entrega de mensagens.

qmail-queue

O programa qmail-queue manipula as mensagens recebidas pelo qmail-inject e qmail-smtp e as move para a fila de emails para entrega. Enquanto o qmail-queue processa as mensagens, varre os endereços de recepção e envio.

Caixas Postais

Existem basicamente dois tipos de caixas postais para armazenamento de mensagem de usuários do sistema. A primeira, chamada Mailbox (Mbox) é o padrão UNIX de caixa postal, na qual múltiplas mensagem são armazenadas em um único arquivo texto e as mensagens são separadas por um linha "From" que não faz parte do cabeçalho original da mensagem.

Outro sistema é chamada de Maildir, que é basicamente composto de um diretório com três subdiretórios: new , cur e tmp. Cada mensagem é gravada em um único arquivo, e colocada nos diretórios de acordo com as seguintes regras: o diretório new é utilizado para mensagens novas e não lidas, o cur é para mensagens já lidas e o tmp para mensagens que estão sendo entregues. Uma das vantagens é que este tipo de caixa postal pode ser utilizado simultaneamente por vários agentes de email, e inclusive por NFS (Network file system), sem que haja perigo de perda de dados. Além disso, não existe risco de perdemos todas as mensagens caso uma delas fique corrupta.

Dentro das filas de mensagens

O programa qmail utiliza um método único de agrupamento em filas das mensagens recebidas para entrega. Ao invés de criar um único diretório de email para manipular as mensagens, conforme fazem seus concorrentes, o qmail usa um sistema de diretórios para indicar o estado atual das mensagens durante os processos de armazenamento e entrega.

Uma funcionalidade do qmail é sua avançada capacidade em recuperar mensagens após travamentos no servidor.

Estrutura de filas de mensagens

A fila de mensagens padrão esta localizada no diretório "/var/qmail/queue". Abaixo deste, existem vários subdirectórios que guardam varias partes diferentes de cada mensagem, utilizados para cada parte do processo de fila. Cada mensagem é salva como um arquivo separado, com seu nome igual a valor do inode (numero de identificação do sistema de arquivo UNIX). Cada arquivo que contem cada parte da mensagem terá o mesmo nome. A tabela abaixo mostra os diretórios.

Diretório
Descrição
Bounce
Contem mensagem que tem defeitos permanentes de entrega
Info
Contem o endereço do remetente da mensagem
Intd
Contem o cabeçalho da mensagem reconstruída pelo qmail-queue
Local
Contem os endereços dos receptores para o servidor local
Lock
Contem arquivos usados para indicar quando as mensagens estão disponíveis para leitura pelo qmail-send
Mess
Contem a mensagem a ser entregue
Pid
Área inicial de armazenamento de novas mensagens colocadas na fila
Remote
Contem os endereços dos receptores para servidores remotos
Todo
Contem o cabeçalho completo, incluindo os endereços do remetente e dos receptores

As etapas que um mensagem atravessa até ser entregue são as seguintes:

Etapa 1 - Inserção da Mensagem
Quando a mensagem é inserida, o programa qmail-queue salva esta no diretório pid. Após verificar se esta foi salva e descobrir o numero de seu Inode, é criado um arquivo no diretório mess com o mesmo nome.

Etapa 2 - Armazenamento da Mensagem
O arquivo da mensagem localizado em pid é copiado para o arquivo aberto em mess. Assim, caso ocorra um travamento, bastaria o qmail-queue observar o diretório mess para verificar se existe alguma mensagem aguardando para ser processada.
Um arquivo é criado no diretório intd.

Etapa 3 - Extração dos Cabeçalhos
O arquivo do diretório mess é varrido e as informações de endereços de receptor e remetente são salvas no diretório intd.

Etapa 4 - Colocação na Fila e Pré-processamento
A mensagem é colocada na fila de processamento. É criado pelo qmail-queue um link entre o arquivo no diretório intd e o outro no diretório todo.
O programa qmail-send varre o diretório todo, e se encontrar arquivos, ele verificar se existem arquivos com o mesmo nome no diretórios info, local e remote. Se existir, estes são apagados. Após isso, ele cria arquivos que serão armazenados nos diretório info, local e remote, cada um segundo a tabela de referencia dada acima e a mensagem analisada.

Etapa 5 - Entrega da Mensagem
O programa qmail-send processa os arquivos no diretório local e remote, tentando enviar a mensagem armazenada em mess para os endereços dados.
Caso tudo ocorra bem e a mensagem seja entregue a todos os destinatários, então o arquivo é apagado. Caso haja falha temporária, este endereço é marcado e tentasse novamente mais tarde. Caso haja falha permanente, é criado um novo arquivo no diretório bounce.
As mensagens no subdiretório bounce são tratadas como novas mensagens. As informações das mensagens do subdiretório bounce e mess são combinadas para criar um nova mensagem que é reinserida no processo do qmail-queue. Assim que a mensagem é criada, seu arquivo no subdiretório bounce é apagado.

Limpeza das Mensagens

É possível que apesar de todas estas etapas, alguma mensagem fique encalhada, devido a travamentos, no meio do processo. Se depois de 36 horas uma mensagem continua travada, o qmail tenta apaga-la dos diretórios intd, mess e pid, nesta ordem.

>> Proxima

 
Trabalho desenvolvido por Alan Rubin - Redes I - 2001/02 - Prof. Otto C.M.B.D.