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 programação que pode ser usada para filtragem de e-mail, ou seja, é um filtro que podemos fazer em cima das mensagens de email através de MDAs.

Um dos maiores MDAs de hoje é o Dovecot, no qual iremos usar para aplicar filtros com a linguagem sieve.


O Sieve foi projetado para ser implementado tanto em um cliente de e-mail quanto diretamente no servidor de e-mail. As implementações do Sieve devem ocorrer no momento da entrega final do email; quando a mensagem é movida para a caixa de entradado usuário.


Em sistemas em que o MTA faz a entrega final é normal que o filtro aconteça quando o MTA envia o email para a caixa de entrada do usuário.


Mas com os filtros do Sieve nós podemos aplicar eles em várias etapas, por exemplo, ele pode ser usado por um servidor SMTP, por um servidor IMAP ou POP para diversos fins.

Além do Sieve nós podemos usar recursos do procmail (caso esteja em uso) para criar esses filtros.



Ações do Sieve


O Sieve possui algumas ações para serem aplicadas aos filtros, abaixo segue cada uma delas.

AçãoDescrição
KeepApenas grava a mensagem na Mailbox (ação padrão).
FileintoGrava a mensagem em outro diretório.
RedirectReencaminha a mensagem para outro e-mail.
DiscardDescarta a mensagem sem aviso.
RejectRecusa a mensagem mas retorna um aviso.

Ainda podemos aplicar um controle dentro dos filtros, são eles:

ControleDescrição
RequireAdiciona suporte a extensões externas.
StopPára o processamento.
IfImplementa verificações adicionais.

O que podemos verificar (usar para o filtro decidir o que fazer), normalmente essa verificação é usada dentro de um if:

  • Address

    Remetente e destinatário.

  • Envelope

    Informações do cabeçalho, dados de envelope.

  • Body

    Corpo da mensagem.

  • Subject

    Assunto da mensagem.

  • Size

    Tamanho do e-mail.

  • Header

    Cabeçalho do do e-mail, alguns filtros anti-spam podem adicionar headers e com isso podemos bloquear.

Lembrando que podemos fazer um mesmo filtro analisando diferentes partes do email.


Sabendo as ações, o tipo de controle e o que analisar, vamos precisar saber a condição para o teste, segue abaixo algumas delas (as mais usadas):

CondiçãoDescrição
isDa match com um conteúdo exato (todo o conteúdo precisa ser exato).
containsSe conter o conteúdo informado (é similar ao is, mas aqui não precisa ser tudo exato, apenas conter parte da informação).
RegexUsa expressão regular para dar match com a informação (mais completa que o match).
MatchIgual Regex mas implementa o * e ?.
allof (e)Implementa um E para comparar mais de uma informação.
Anyof (ou)Implementa um OU para comparar mais de uma informação.
existsVerifica se existe ou não.


Instalação do MDA com Sieve


Vamos fazer a instalação do MDA que nesse caso vamos usar o dovecot e ele já possui suporte ao Sieve.

## Na RedHat:
$ sudo apt install -y dovecot-pigeonhole


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

Com isso ele já instala o dovecot (chamado dovecot-core).


Agora precisamos informar o Postfix que a entrega de e-mail não será mais ele quem fará e sim o dovecot, vejamos abaixo:

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

## Agora configure para que a entrega seja feita pelo dovecot!

## Na redhat:
mailbox_command = /usr/libexec/dovecot/deliver -f "$SENDER" -a "$ORIGINAL_RECIPIENT"


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

Agora temos que fazer uma conf adicional para que o dovecot consiga escrever num arquivo de lock dentro de /var/mail, se isso não for aplicado, os emails não vão conseguir serem salvos na pasta correta, para mais detalhes veja aqui.

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

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

Isso vai ser alterado caso você atualize o dovecot, no próprio link acima é informado uma solução para contornar isso.


Agora vamos configurar o dovecot:

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

## Dentro desse dir vamos mexer nos arquivos: '15-lda.conf', '90-sieve.conf' e '10-mail.conf'.

lda = Local Deliver Agent


Dentro de LDA vamos configurar:

OpçãoDescrição
postmaster_addressEndereço usado para enviar emails de rejeição.
lda_mailbox_autocreateDeixe como yes para fazer com que o dovecot crie diretórios ao salvar emails em um diretório não existente.
lda_mailbox_autosubscribeDeixe como yes para que os diretórios de e-mail sejam inscritos automaticamente.

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

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

Isso fará com que seja usada a linguagem do sieve.


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

OpçãoDescrição
sieveInforma onde ficarão as regras do usuário, no meu caso será sieve = ~/.dovecot.sieve.
sieve_defaultArquivo que conterá as regras caso o usuário não possua nenhuma.
sieve_dirDiretório para incluir scripts de uso pessoal, pode deixar o padrão.
sieve_dir = ~/sieve.
sieve_globalDiretório onde ficarão os scripts incluidos como extensão de uso global (para todos os users).
sieve_global = /var/lib/dovecot/sieve.
sieve_beforeScripts lidos antes dos scripts do usuário.
sieve_afterScripts lidos depois dos scripts do usuário.

Dentro de MAIL vamos ver algumas configurações importantes:

opçãoDescrição
mail_locationDefine o formato de armazenamento dos emails e onde serão salvos os emails.
mail_location = mbox:~/mail:INBOX=/var/mail/u%.

Para entender melhor o mail_location:

Os novos email que o usuário receber vão ser enviados para /var/mail/u% definido pela variável INBOX. Depois desse email ser lido ele vai ser salvo em ~/mail.


Agora reinicie o postfix e dovecot:

$ sudo systemctl restart postfix dovecot


Criação de Regras com Sieve


Vamos criar uma configuração para o filtro do sieve dentro da home dos usuários, o arquivo 90-sieve.conf foi configurado para buscar a configuração em ~/.dovecot.sieve.

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

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

Na home do Bob:

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

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

# Grava o email na pasta 'teste':
require ["fileinto","envelope"];

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

Caso de algum erro, ele será gravado em ~/.dovecot.sieve.log.


Veja outro exemplo contendo uma lista de emails importantes (ainda na home do Bob):

require ["fileinto","envelope"];

# Faz um redirect (redireciona o email para outra conta):
if header :contains "subject" ["pagamento", "recebimento", "salario"]
{
redirect "rh@mail.test.ze";
}

Normalmente as regras são lidas e executadas sequencialmente, nós podemos mudar esse comportamento usando o Controle de Filtros mostrado mais acima. Abaixo segue um exemplo onde a primeira regra é executada e logo em seguida o 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 pegando emails que no assunto (Subject em Inglês) contenha as palavras pagamento, deposito e salario e que o remetente (From) seja do jhon e/ou alice.

Depois essa mensagem é enviara para a pasta financeiro mas é também armazenada na Mailbox do usuário (por causa do 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";
  • days 1

    Envia 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).

  • 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 o básico sobre procmail, para a LPIC2 não precisa se aprofundar, apenas ter conhecimentos básicos.



O que é Procmail?


O Procmail é usado para processar e-mails de entrada, ou seja, processa e-mails durante o recebimento dos mesmos. É um paralelo ao dovecot com sieve, já que ele vai entregar o email (MDA) e pode realizar filtros.

O programa procmail é iniciado para cada e-mail e referente as regras que encontra no arquivo de configuração (.procmailrc), executa a ação pertencente à regra encontrada.



O .procmailrc


O arquivo .procmailrc deve ficar no diretório home. Ele consiste em regras que têm duas partes. A primeira parte descreve a mensagem à qual a regra deve ser aplicada, e a segunda é a ação em sí, ou seja, o que fazer com uma mensagem que satisfaça a regra. Por exemplo:

:0
* ^From.*jhon
bobox

Essa regra salva todas as mensagens que possuem a string jhon no endereço do remetente na caixa de correio bobox.

Esse é só um exemplo do uso possível para o procmail.



Install e usar o procmail


Vamos começar instalando o procmail e então configurar o Postfix para usar ele:

$ 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 (crie caso não exista):
mailbox_command = /usr/bin/procmail -m /etc/procmailrc

PS.: Para saber onde está o binário do procmail faça:

$ which procmail
/usr/bin/procmail

O Procmail possui dois arquivos principais:

  • /etc/procmailrc

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

  • ~/.procmailrc

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



Mailbox e Maildir


O padrão é sempre enviar um novo e-mail do usuário para /var/spool/mail/USERNAME e depois que a mensagem for lida ela pode ser salva em outro lugar (O padrão é usar MailBox, portanto, esse é o comportamento do MailBox).


Mas podemos usar o Maildir, com ele o e-mail deixa de ser entregue em /var/spool/mail/USERNAME e passa a ser entregue na Home do usuário numa pasta chamada Maildir.

Para configurar o Maildir no Postfix temos que configurar a variável home_mailbox = Maildir/. Podemos usar em conjunto com o Dovecot também.


Dentro desse diretório temos outros três diretórios chamados: cur, new e tmp.

  • tmp

    Diretório para e-mails temporários durante manipulação dos mesmos, por exemplo, ao estar editando um e-mail que ele seja enviado.

  • new

    Lugar onde os e-mails novos vão ser enviados.

  • cur

    Após ler os e-mails que estão em new serão salvos aqui em cur. Aqui são salvos um arquivo para cada e-mail.



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.