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ção | Descrição |
---|---|
Keep | Apenas grava a mensagem na Mailbox (ação padrão). |
Fileinto | Grava a mensagem em outro diretório. |
Redirect | Reencaminha a mensagem para outro e-mail. |
Discard | Descarta a mensagem sem aviso. |
Reject | Recusa a mensagem mas retorna um aviso. |
Ainda podemos aplicar um controle dentro dos filtros, são eles:
Controle | Descrição |
---|---|
Require | Adiciona suporte a extensões externas. |
Stop | Pára o processamento. |
If | Implementa 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ção | Descrição |
---|---|
is | Da match com um conteúdo exato (todo o conteúdo precisa ser exato). |
contains | Se conter o conteúdo informado (é similar ao is , mas aqui não precisa ser tudo exato, apenas conter parte da informação). |
Regex | Usa expressão regular para dar match com a informação (mais completa que o match ). |
Match | Igual 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. |
exists | Verifica 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
(chamadodovecot-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ção | Descrição |
---|---|
postmaster_address | Endereço usado para enviar emails de rejeição. |
lda_mailbox_autocreate | Deixe como yes para fazer com que o dovecot crie diretórios ao salvar emails em um diretório não existente. |
lda_mailbox_autosubscribe | Deixe 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ção | Descrição |
---|---|
sieve | Informa onde ficarão as regras do usuário, no meu caso será sieve = ~/.dovecot.sieve . |
sieve_default | Arquivo que conterá as regras caso o usuário não possua nenhuma. |
sieve_dir | Diretório para incluir scripts de uso pessoal, pode deixar o padrão.sieve_dir = ~/sieve . |
sieve_global | Diretório onde ficarão os scripts incluidos como extensão de uso global (para todos os users).sieve_global = /var/lib/dovecot/sieve . |
sieve_before | Scripts lidos antes dos scripts do usuário. |
sieve_after | Scripts lidos depois dos scripts do usuário. |
Dentro de MAIL vamos ver algumas configurações importantes:
opção | Descrição |
---|---|
mail_location | Define 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
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 palavraspagamento
,deposito
esalario
e que o remetente (From) seja dojhon
e/oualice
.Depois essa mensagem é enviara para a pasta
financeiro
mas é também armazenada na Mailbox do usuário (por causa dokeep;
)
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ávelhome_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 emcur
. 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