Skip to main content

211.2 Gerenciando a Entrega de E-mail


Este tópico apresenta uma forma de como configurar alguns aspectos mais usados em servidores de email no mundo real.



Introdução e Configuração do Sieve


O Sieve é uma linguagem de filtragem de e-mails usada para criar regras que processam mensagens durante a entrega final à caixa postal do usuário, normalmente por meio de um MDA.

O Dovecot oferece mecanismos de entrega, como o Dovecot LDA e o servidor LMTP, nos quais podemos aplicar filtros escritos em Sieve.


O Sieve foi projetado para ser implementado tanto em um cliente de e-mail quanto em um servidor de e-mail. Os filtros Sieve devem ser executados no momento da entrega final do e-mail, quando a mensagem é entregue à caixa postal do usuário.


Em sistemas nos quais o MTA realiza a entrega final, o filtro pode ser executado como parte da entrega local da mensagem à caixa postal do usuário.


Os filtros do Sieve são independentes do protocolo de acesso às mensagens. Portanto, embora possam ser gerenciados por clientes ou executados por componentes integrados ao servidor, normalmente são aplicados durante a entrega final, e não pelos protocolos SMTP, IMAP ou POP.

Além do Sieve, podemos usar recursos do procmail, caso ele esteja em uso, para criar filtros de entrega de e-mails.



Ações do Sieve


O Sieve possui algumas ações que podem ser aplicadas aos filtros. Abaixo estão algumas delas.

AçãoDescrição
keepGrava a mensagem na caixa postal padrão do usuário (ação padrão).
fileintoGrava a mensagem em outra caixa postal.
redirectEncaminha a mensagem para outro endereço de e-mail.
discardDescarta a mensagem sem enviar aviso.
rejectRejeita a mensagem e retorna um aviso ao remetente.

Também podemos aplicar comandos de controle dentro dos filtros:

ControleDescrição
requireDeclara as extensões utilizadas pelo script.
stopInterrompe o processamento do script.
ifExecuta ações de acordo com o resultado de um teste.

Podemos verificar diferentes partes da mensagem para que o filtro decida o que fazer. Normalmente, essa verificação é realizada dentro de um if:

  • address = Verifica endereços presentes em campos de cabeçalho, como From e To.

  • envelope = Verifica informações do envelope da mensagem, como o remetente e o destinatário do envelope.

  • body = Verifica o corpo da mensagem.

  • subject = O assunto da mensagem pode ser verificado como o campo de cabeçalho Subject.

  • size = Verifica o tamanho do e-mail.

  • header = Verifica campos do cabeçalho do e-mail. Alguns filtros antispam podem adicionar campos ao cabeçalho, permitindo que eles sejam usados nas regras de filtragem.

Podemos criar um mesmo filtro analisando diferentes partes do e-mail.


Conhecendo as ações, os comandos de controle e o que pode ser analisado, precisamos definir a condição utilizada no teste. Abaixo estão algumas das mais usadas:

CondiçãoDescrição
isVerifica se o conteúdo corresponde exatamente ao valor informado.
containsVerifica se o conteúdo contém o valor informado.
regexUsa uma expressão regular para comparar o conteúdo.
matchesRealiza a comparação utilizando os caracteres curinga * e ?.
allof (E)Retorna verdadeiro quando todos os testes informados forem verdadeiros.
anyof (OU)Retorna verdadeiro quando pelo menos um dos testes for verdadeiro.
existsVerifica se um ou mais campos de cabeçalho existem na mensagem.


Instalação do MDA com Sieve


Vamos instalar o Dovecot e o suporte ao Sieve. Para realizar a entrega local das mensagens, utilizaremos o dovecot-lda, que atua como MDA.

## Na Red Hat:
$ sudo dnf install -y dovecot-pigeonhole


## Na Debian:
$ sudo apt install -y dovecot-managesieved dovecot-sieve

Esses pacotes também instalam o Dovecot como dependência. Na Debian, o núcleo do Dovecot é fornecido pelo pacote dovecot-core.


Agora precisamos informar ao Postfix que, para os usuários locais, a entrega de e-mails não será mais realizada pelo seu agente de entrega padrão, mas pelo dovecot-lda. Vejamos abaixo:

# Edite o arquivo abaixo:
$ sudo vim /etc/postfix/main.cf

## Agora configure para que a entrega seja feita pelo Dovecot.

## Na Red Hat:
mailbox_command = /usr/libexec/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT"


## Na Debian:
mailbox_command = /usr/lib/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT"

Formas de usar o Dovecot

Para usar o Dovecot podemos fazer isso por meio das configurações virtual_transport e mailbox_command. Embora as duas configurações executem o Dovecot, elas atuam em classes de destinatários diferentes e em pontos diferentes do fluxo interno do Postfix. Portanto, se atente que elas não são duas formas equivalentes de configurar a mesma entrega, embora o resultado possa ser parecido.


Quando usamos virtual_transport = dovecot, estamos associando o transporte chamado dovecot à classe de domínios definida em virtual_mailbox_domains, ou seja, quando o Postfix recebe um email que tem como destinatário um domínio cadastrado ali, ele não encaminha a mensagem ao agente local(8), já que estamos trabalhando com domínios virtuais. Mas para que isso funcione, temos que cadastrar o serviço dovecot definindo ele no master.cf.


Resumindo para ficar mais claro, só usamos a abordagem acima quando temos configurado virtual_mailbox_domains. Isso significa que os usuários não possuem contas individuais no /etc/passwd.


Apesar de eu ter comentado como configurar virtual_transport = dovecot informando que deve ter uma configuração em master.cf, a configuração moderna é apenas em main.cf:

virtual_transport = lmtp:unix:private/dovecot-lmtp

Essa configuração faz com que o Postfix use seu cliente LMTP interno para entregar as mensagens diretamente ao serviço LMTP do Dovecot por um socket Unix.


Agora, usamos mailbox_command quando a entrega é local.


Para ficar claro a diferença é necessário entender a diferença entre entrega local e entrega virtual. Quando a entrega é local, o domínio do destinatário pertence a mydestination, exemplo:

myhostname = mail.hermodr.com.br
mydestination = $myhostname, localhost.$mydomain, localhost

# Email para: jhon@mail.hermodr.com.br

Nesse caso, o Postfix trata o endereço como uma conta local do servidor e usa o local_transport (normalmente o agente local(8)). É nesse fluxo que entram usuários UNIX, /etc/aliases, .forward e parâmetros como mailbox_command, ou seja, o domínio precisa corresponder a mydestination para a entrega ser considerada local.


Já a entrega virtual ocorre quando o domínio não está em mydestination, mas está em virtual_mailbox_domains, exemplo:

myhostname = mail.hermodr.com.br
mydestination = $myhostname, localhost.$mydomain, localhost
virtual_mailbox_domains = hermodr.com.br
virtual_transport = dovecot

# Email para: jhon@hermodr.com.br

Nesse caso, o destinatário não é tratado como usuário UNIX local, já que o domínio não bate com mydestination e sim com virtual_mailbox_domains. Nesse caso, a entrega é feita pelo virtual_transport, como Dovecot LDA ou LMTP.


Em sistemas que armazenam a caixa de entrada no formato mbox dentro de /var/mail, pode ser necessário permitir que o dovecot-lda crie o arquivo de bloqueio nesse diretório. Sem essa permissão, a entrega das mensagens pode falhar. Para mais detalhes, veja aqui.

## Na Red Hat:
# Aplique o grupo 'mail' ao arquivo abaixo:
$ sudo chgrp mail /usr/libexec/dovecot/dovecot-lda

# Acerte a permissão:
$ sudo chmod 2755 /usr/libexec/dovecot/dovecot-lda


## Na Debian:
# Aplique o grupo 'mail' ao arquivo abaixo:
$ sudo chgrp mail /usr/lib/dovecot/dovecot-lda

# Acerte a permissão:
$ sudo chmod 2755 /usr/lib/dovecot/dovecot-lda

Essas permissões podem ser alteradas após uma atualização do Dovecot. No próprio link acima é apresentada uma solução para contornar esse problema.


Agora vamos configurar o Dovecot:

# Entre no diretório:
$ cd /etc/dovecot/conf.d/

## Dentro desse diretório, vamos alterar os arquivos:
## '15-lda.conf', '90-sieve.conf' e '10-mail.conf'.

LDA = Local Delivery Agent.


Dentro de LDA, vamos configurar:

OpçãoDescrição
postmaster_addressEndereço usado como remetente das mensagens de rejeição geradas pelo LDA.
lda_mailbox_autocreateDefina como yes para que o Dovecot crie uma caixa postal inexistente ao tentar salvar uma mensagem nela.
lda_mailbox_autosubscribeDefina como yes para que as caixas postais criadas automaticamente também sejam inscritas.

Agora, dentro de protocol lda, descomente a linha que começa com mail_plugins e adicione sieve ao final dela, ficando assim:

protocol lda {
# Space separated list of plugins to load (default is global mail_plugins).
mail_plugins = $mail_plugins sieve
}

Isso habilita o plugin Sieve para as entregas realizadas pelo LDA.


Dentro de SIEVE, vamos configurar onde ficarão as regras, mas também veremos algumas outras opções:

OpçãoDescrição
sieveDefine o armazenamento dos scripts pessoais e o script ativo do usuário.
sieve = file:~/sieve;active=~/.dovecot.sieve.
sieve_defaultArquivo que conterá as regras usadas caso o usuário não possua um script pessoal ativo.
sieve_dirDiretório usado para armazenar scripts pessoais. Essa opção foi incorporada à diretiva sieve.
sieve_dir = ~/sieve.
sieve_globalLocalização dos scripts incluídos por meio da extensão include com o modificador :global.
sieve_global = /var/lib/dovecot/sieve.
sieve_beforeScripts executados antes do script pessoal do usuário.
sieve_afterScripts executados depois do script pessoal do usuário.

Dentro de MAIL, vamos ver uma configuração importante:

OpçãoDescrição
mail_locationDefine o formato de armazenamento e o local em que as mensagens serão salvas.
mail_location = mbox:~/mail:INBOX=/var/mail/%u.

Para entender melhor o mail_location:

As mensagens recebidas na caixa de entrada do usuário serão armazenadas em /var/mail/%u, conforme definido pela opção INBOX. As demais caixas postais no formato mbox serão armazenadas dentro de ~/mail. A leitura de uma mensagem não faz com que ela seja movida automaticamente de /var/mail/%u para ~/mail.


Agora reinicie o postfix e o dovecot:

$ sudo systemctl restart postfix dovecot


Criação de Regras com Sieve


Vamos criar um script de filtragem do Sieve no diretório pessoal dos usuários. O arquivo 90-sieve.conf foi configurado para buscar o script ativo em ~/.dovecot.sieve.

Eu criei dois servidores de e-mail com um usuário em cada:

  • Bob no domínio mail.test.ze;
  • Jhon no domínio mail.example.te.

Na home do Bob:

# Edite o arquivo:
$ vim ~/.dovecot.sieve

### Adicione o conteúdo abaixo ao arquivo ###

# Grava o e-mail na caixa postal 'teste':
require ["fileinto", "envelope"];

if envelope :is "from" "jhon@mail.example.te" {
fileinto "teste";
}

Caso ocorra algum erro ou aviso relacionado ao script, ele poderá ser registrado em ~/.dovecot.sieve.log.


Veja outro exemplo contendo uma lista de assuntos importantes, ainda na home do Bob:

# Redireciona o e-mail para outra conta:
if header :contains "Subject" ["pagamento", "recebimento", "salario"] {
redirect "rh@mail.test.ze";
}

Normalmente, os comandos são avaliados sequencialmente dentro do script. Podemos mudar esse comportamento usando os comandos de controle mostrados anteriormente. Abaixo está um exemplo no qual a primeira regra é executada e, em seguida, o processamento do script é encerrado por causa do stop.

require ["fileinto", "envelope"];

if envelope :is "from" "jhon@mail.example.te" {
fileinto "teste";
stop;
}

if header :contains "Subject" ["pagamento", "recebimento", "salario"] {
redirect "rh@mail.test.ze";
}

Vamos ver um exemplo usando o E (allof):

require ["fileinto", "envelope"];

if allof (
header :contains "Subject" ["pagamento", "deposito", "salario"],
envelope :contains "from" ["jhon", "alice"]
) {
fileinto "financeiro";
keep;
}

Nesse exemplo, estamos selecionando e-mails cujo assunto (Subject, em inglês) contenha pelo menos uma das palavras pagamento, deposito ou salario e cujo remetente do envelope contenha jhon ou alice.

Depois, a mensagem é armazenada na caixa postal financeiro e também na caixa postal padrão do usuário, por causa da ação keep;.



Resposta automática de Férias


Agora vamos criar um exemplo que envia uma resposta automática de férias. Abaixo segue a regra:

require ["vacation"];

vacation
:days 1
:subject "Resposta automática de férias"
:addresses ["suporte@mail.test.ze","rh@@mail.test.ze"]
"Olá, no momomento estou de férias, te retorno assim que voltar.

Att,
Bob";

O days 1 vai enviar somente uma resposta automática por dia, se o remetente enviar 5 e-mails para Bob, o remetente só irá receber 1 resposta (por dia). O addresses são possíveis e-mails em que Bob faz parte, se receber vindo de algum desses e-mails vai enviar a resposta também.



Noções de Procmail


Vamos ver o básico sobre o procmail. Para a LPIC-2, não é necessário se aprofundar, pois é exigido apenas conhecimento sobre sua existência e finalidade.



O que é Procmail?


O Procmail é usado para processar e-mails durante a entrega local. Ele pode atuar como MDA e aplicar filtros às mensagens, exercendo uma função semelhante à entrega realizada pelo Dovecot com filtros Sieve.


O programa procmail é iniciado para cada e-mail recebido e, de acordo com as regras encontradas nos arquivos de configuração, executa as ações correspondentes. Por padrão, ele lê primeiro o arquivo global /etc/procmailrc, caso exista, e depois o arquivo ~/.procmailrc do usuário.



O .procmailrc - Não cai na LPIC-2


O arquivo .procmailrc deve ficar no diretório home do usuário. Ele pode conter atribuições de variáveis e regras, chamadas de recipes. Cada regra possui uma linha inicial, zero ou mais condições e uma ação, que define o que fazer com a mensagem caso as condições sejam satisfeitas. Por exemplo:

:0
* ^From.*jhon
bobox

Essa regra salva na caixa de correio bobox todas as mensagens cujo campo From contenha a string jhon.

Esse é apenas um exemplo de uso possível do Procmail.



Install e usar o procmail - Não cai na LPIC-2


Vamos começar instalando o Procmail e, em seguida, configurar o Postfix para utilizá-lo:

$ sudo apt install -y procmail

Agora vamos configurar o uso do Procmail:

# Edite o arquivo abaixo:
$ sudo vim /etc/postfix/main.cf

# Edite a variável abaixo ou crie-a, caso não exista:
mailbox_command = /usr/bin/procmail

# Recarregue a configuração do Postfix:
$ sudo systemctl reload postfix

Para saber onde está o binário do procmail, execute:

$ which procmail
/usr/bin/procmail

O Procmail possui dois arquivos principais:

  • /etc/procmailrc

    Aqui ficam as regras que se aplicam a todos os usuários.

  • ~/.procmailrc

    Esse é um arquivo específico para que cada usuário tenha sua configuração individual.



Mailbox e Maildir


Em muitos sistemas, a entrega local padrão armazena os novos e-mails em uma caixa postal no formato mbox, localizada em /var/spool/mail/USERNAME ou /var/mail/USERNAME, dependendo da distribuição. Nesse formato, as mensagens da caixa postal são armazenadas em um único arquivo. A leitura de uma mensagem não faz com que ela seja movida automaticamente para outro local.


Também podemos usar o formato Maildir. Com ele, cada e-mail é armazenado em um arquivo separado e as mensagens podem ser entregues no diretório Maildir, localizado na home do usuário.

Para configurar a entrega em formato Maildir pelo agente de entrega local do Postfix, devemos definir a variável home_mailbox = Maildir/. Caso a entrega seja realizada pelo Dovecot, o formato e o local da caixa postal também devem ser configurados no próprio Dovecot.


Dentro do diretório Maildir, existem três subdiretórios chamados cur, new e tmp:

  • tmp

    Diretório usado temporariamente durante a entrega das mensagens. O e-mail é gravado nesse diretório antes de ser movido para new.

  • new

    Diretório no qual são armazenadas as mensagens recém-entregues.

  • cur

    Diretório no qual ficam as mensagens que já foram acessadas pelo cliente de e-mail. Assim como em new, cada e-mail é armazenado em um arquivo separado.



Fontes importantes


https://www.fastmail.help/hc/en-us/articles/360060591373

https://doc.dovecot.org/configuration_manual/sieve/examples/

https://support.tigertech.net/sieve

https://www.fastmail.help/hc/en-us/articles/360058753794

https://wiki.dovecot.org/LDA/Postfix

https://www.fi.muni.cz/tech/unix/procmail.html.en

https://www.interserver.net/tips/kb/difference-between-maildir-and-mboxs-directory-structure/#:~:text=Mbox%20was%20the%20original%20mail,individual%20files%20with%20unique%20names.&text=Directories%20in%20the%20Maildir%20format%20has%20three%20subdirectories.