<!-- review: finished -->

<a id="mail-core"></a>

# Módulo Mail

O módulo mail principal implementa funcionalidades básicas para um servidor proxy de email:
isso inclui suporte para protocolos SMTP, IMAP e POP3, configuração de blocos de servidor,
roteamento de requisições de email, autenticação de usuário e suporte SSL/TLS para
proteger conexões de email.

Os outros módulos nesta seção estendem essa funcionalidade, permitindo que você
configure e otimize flexivelmente o servidor de email para vários cenários e
requisitos.

Ao [compilar a partir do código fonte](https://pt.angie.software//angie/docs/installation/sourcebuild.md#sourcebuild),
este módulo não é compilado por padrão;
ele deve ser habilitado com a
`--with-mail`
[opção de compilação](https://pt.angie.software//angie/docs/installation/sourcebuild.md#configure).
Em pacotes e imagens dos [nossos repositórios](https://pt.angie.software//angie/docs/installation/index.md#install-packages),
o módulo está incluído na compilação.

<a id="configuration-example-52"></a>

## Exemplo de Configuração

```nginx
worker_processes auto;

error_log /var/log/angie/error.log info;

events {
    worker_connections  1024;
}

mail {
    server_name       mail.example.com;
    auth_http         localhost:9000/cgi-bin/auth.cgi;

    imap_capabilities IMAP4rev1 UIDPLUS IDLE LITERAL+ QUOTA;

    pop3_auth         plain apop cram-md5;
    pop3_capabilities LAST TOP USER PIPELINING UIDL;

    smtp_auth         login plain cram-md5;
    smtp_capabilities "SIZE 10485760" ENHANCEDSTATUSCODES 8BITMIME DSN;
    xclient           off;

    server {
        listen   25;
        protocol smtp;
    }
    server {
        listen   110;
        protocol pop3;
        proxy_pass_error_message on;
    }
    server {
        listen   143;
        protocol imap;
    }
    server {
        listen   587;
        protocol smtp;
    }
}
```

<a id="directives-56"></a>

## Diretivas

<a id="index-0"></a>

<a id="m-listen"></a>

### listen

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `listen` address[:port] [`ssl`] [`proxy_protocol`] [`backlog=`number] [`rcvbuf=`size] [`sndbuf=`size] [`bind`] [`ipv6only=``on` | `off`] [`reuseport`] [`so_keepalive=`on|off|[`keepidle`]:[`keepintvl`]:[`keepcnt`]];   |
|-------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Padrão                                                                                    | —                                                                                                                                                                                                                        |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | server                                                                                                                                                                                                                   |

Define o address e port para o socket no qual o servidor aceitará conexões. É possível especificar apenas a port, para que o Angie escute em todas as interfaces IPv4 (e IPv6, se habilitado) disponíveis. O endereço também pode ser um nome de host, por exemplo:

```nginx
listen 127.0.0.1:110;
listen *:110;
listen 110;     # mesmo que *:110
listen localhost:110;
```

Endereços IPv6 são especificados entre colchetes:

```nginx
listen [::1]:110;
listen [::]:110;
```

Sockets de domínio UNIX são especificados com o prefixo `unix:`:

```nginx
listen unix:/var/run/angie.sock;
```

#### NOTE
Servidores diferentes devem escutar em pares address:port diferentes.

| `ssl`            | especifica que todas as conexões aceitas nesta porta devem funcionar em modo SSL.                                                                                                                                                                                                                                                                                                                                             |
|------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `proxy_protocol` | especifica que todas as conexões aceitas nesta porta devem usar<br/>o protocolo PROXY. As informações obtidas são passadas para o<br/>[servidor de autenticação](https://pt.angie.software//angie/docs/configuration/modules/mail/mail_auth_http.md#mail-auth-http) e podem ser usadas para<br/>[alterar o endereço do cliente](https://pt.angie.software//angie/docs/configuration/modules/mail/mail_realip.md#mail-realip). |

A diretiva `listen` pode ter vários parâmetros adicionais específicos para chamadas de sistema relacionadas a sockets.

| `backlog=`number      | define o parâmetro backlog na chamada `listen()` que limita o<br/>comprimento máximo da fila de conexões pendentes. Por padrão,<br/>backlog é definido como -1 no FreeBSD, DragonFly BSD e macOS, e<br/>como 511 em outras plataformas.                                                                                                                                                                                                                                                                                                                                                                                                                                             |
|-----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `rcvbuf=`size         | define o tamanho do buffer de recepção (a opção SO_RCVBUF) para o socket de escuta.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| `sndbuf=`size         | define o tamanho do buffer de envio (a opção SO_SNDBUF) para o socket de escuta.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| `bind`                | instrui a fazer uma chamada `bind()` separada para um<br/>par address:port específico. O fato é que se houver várias<br/>diretivas `listen` com a mesma porta mas endereços diferentes,<br/>e uma das diretivas `listen` escuta em todos os endereços para a<br/>porta especificada (\*:port), o Angie fará `bind()` apenas para \*:port.<br/>Deve-se notar que a chamada de sistema `getsockname()` será<br/>feita neste caso para determinar o endereço que aceitou a conexão.<br/>Se os parâmetros backlog, rcvbuf, sndbuf, ipv6only,<br/>reuseport ou so_keepalive forem usados, então para um<br/>par address:port específico uma chamada `bind()` separada sempre será feita. |
| `ipv6only=on` | `off` | determina (via a opção de socket IPV6_V6ONLY) se um socket IPv6 escutando em um endereço curinga [::] aceitará apenas conexões IPv6 ou tanto conexões IPv6 quanto IPv4. Este parâmetro está ativado por padrão. Só pode ser definido uma vez na inicialização.                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `multipath`           | habilita aceitar conexões via [Multipath TCP](https://en.wikipedia.org/wiki/Multipath_TCP) (MPTCP),<br/>suportado no kernel Linux versão 5.6 e posterior.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |

`so_keepalive=on` | `off` | [`keepidle`]:[`keepintvl`]:[`keepcnt`]

Configura o comportamento "TCP keepalive" para o socket de escuta.

| `''`   | se este parâmetro for omitido, as configurações do sistema operacional estarão em vigor para o socket   |
|--------|---------------------------------------------------------------------------------------------------------|
| `on`   | a opção SO_KEEPALIVE é ativada para o socket                                                            |
| `off`  | a opção SO_KEEPALIVE é desativada para o socket                                                         |

Alguns sistemas operacionais suportam a configuração de parâmetros TCP keepalive
por socket usando as opções de socket `TCP_KEEPIDLE`, `TCP_KEEPINTVL` e
`TCP_KEEPCNT`. Em tais sistemas, eles podem ser configurados usando os parâmetros `keepidle`,
`keepintvl` e `keepcnt`. Um ou dois parâmetros podem ser omitidos, neste
caso a configuração padrão do sistema para a opção de socket correspondente estará
em vigor.

Por exemplo,

```nginx
so_keepalive=30m::10
```

definirá o timeout de inatividade (`TCP_KEEPIDLE`) para 30 minutos, deixará o intervalo de sonda (`TCP_KEEPINTVL`) em seu padrão do sistema, e definirá a contagem de sondas (`TCP_KEEPCNT`) para 10 sondas.

Servidores diferentes devem escutar em pares address:port diferentes.

<a id="index-1"></a>

<a id="m-mail"></a>

### mail

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `mail` { ... }   |
|-------------------------------------------------------------------------------------------|------------------|
| Padrão                                                                                    | —                |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | main             |

Fornece o contexto do arquivo de configuração no qual as diretivas do servidor de email são especificadas.

<a id="index-2"></a>

<a id="max-commands"></a>

### max_commands

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `max_commands` number;   |
|-------------------------------------------------------------------------------------------|--------------------------|
| Padrão                                                                                    | `max_commands 1000;`     |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | mail, server             |

Define o número máximo de comandos emitidos durante a autenticação
para melhorar a proteção contra ataques DoS.

<a id="index-3"></a>

<a id="m-max-errors"></a>

### max_errors

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `max_errors` number;   |
|-------------------------------------------------------------------------------------------|------------------------|
| Padrão                                                                                    | `max_errors 5;`        |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | mail, server           |

Define o número de erros de protocolo após os quais a conexão é fechada.

<a id="index-4"></a>

<a id="m-protocol"></a>

### protocol

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `protocol` imap | pop3 | smtp;   |
|-------------------------------------------------------------------------------------------|----------------------------------|
| Padrão                                                                                    | —                                |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | server                           |

Define o protocolo para um servidor proxy. Os protocolos suportados são [IMAP](https://pt.angie.software//angie/docs/configuration/modules/mail/mail_imap.md#mail-imap), [POP3](https://pt.angie.software//angie/docs/configuration/modules/mail/mail_pop3.md#mail-pop3) e [SMTP](https://pt.angie.software//angie/docs/configuration/modules/mail/mail_smtp.md#mail-smtp).

Se a diretiva não for definida, o protocolo pode ser detectado automaticamente com base na porta conhecida especificada na diretiva `listen`:

```console
imap: 143, 993
pop3: 110, 995
smtp: 25, 587, 465
```

Ao [compilar a partir do código-fonte](https://pt.angie.software//angie/docs/installation/sourcebuild.md#sourcebuild), protocolos desnecessários podem ser desabilitados usando as
`‑‑without‑mail_imap_module`, `‑‑without‑mail_pop3_module` e
`‑‑without‑mail_smtp_module` [opções de compilação](https://pt.angie.software//angie/docs/installation/sourcebuild.md#configure).

<a id="index-5"></a>

<a id="m-resolver"></a>

### resolver

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `resolver` address ... [`valid=`time] [`ipv4=``on` | `off`] [`ipv6=``on` | `off`] [`status_zone=`zone] | `off`;   |
|-------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------|
| Padrão                                                                                    | `resolver off;`                                                                                                   |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | mail, server                                                                                                      |

Configura servidores de nomes usados para encontrar o nome do host do cliente para passá-lo ao [servidor de autenticação](https://pt.angie.software//angie/docs/configuration/modules/mail/mail_auth_http.md#mail-auth-http), e no comando [XCLIENT](https://pt.angie.software//angie/docs/configuration/modules/mail/mail_proxy.md#m-xclient) ao fazer proxy SMTP. Por exemplo:

```nginx
resolver 127.0.0.53 [::1]:5353;
```

O valor especial `off` desabilita a resolução do nome do host do cliente e cancela o valor herdado da diretiva.

O endereço pode ser especificado como um nome de domínio ou endereço IP, com uma porta opcional. Se a porta não for especificada, a porta 53 é usada. Os servidores de nomes são consultados em round-robin.

#### NOTE
Recomenda-se usar um resolver local confiável, como `127.0.0.53`
(systemd-resolved), em vez de um público (p.ex., `8.8.8.8`). Resolvers
públicos expõem consultas DNS a terceiros e aumentam o risco de ataques de
envenenamento de cache.

#### NOTE
O valor da diretiva é herdado por blocos aninhados
e pode ser sobrescrito neles se necessário.
Dentro de um único bloco, a diretiva só pode ser especificada uma vez.
Se for repetida, a última definição terá efeito.

Por padrão, o Angie armazena em cache as respostas usando o valor TTL de uma resposta. Se
a diretiva `resolver` não for especificada e nenhuma consulta DNS dinâmica
for realizada (por exemplo, ao usar nomes fixos em [Proxy](https://pt.angie.software//angie/docs/configuration/modules/mail/mail_proxy.md#mail-proxy) sem
variáveis), especificar um resolver não é necessário: os nomes serão resolvidos na inicialização
usando o resolver do sistema. O parâmetro opcional `valid` permite
sobrescrever isso:

| `valid`   | parâmetro *opcional* permite sobrescrever a validade da entrada em cache   |
|-----------|----------------------------------------------------------------------------|
```nginx
resolver 127.0.0.53 [::1]:5353 valid=30s;
```

Por padrão, o Angie procurará endereços IPv4 e IPv6 durante a resolução.

| `ipv4=off`    | desabilita a busca de endereços IPv4                                                                                      |
|---------------|---------------------------------------------------------------------------------------------------------------------------|
| `ipv6=off`    | desabilita a busca de endereços IPv6                                                                                      |
| `status_zone` | parâmetro *opcional*, habilita a coleta de informações sobre requisições e respostas do servidor DNS na zona especificada |

<a id="index-6"></a>

<a id="m-resolver-timeout"></a>

### resolver_timeout

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `resolver_timeout` tempo;   |
|-------------------------------------------------------------------------------------------|-----------------------------|
| Padrão                                                                                    | `resolver_timeout 30s;`     |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | mail, server                |

Define um timeout para resolução de nomes, por exemplo:

```nginx
resolver_timeout 5s;
```

<a id="index-7"></a>

<a id="m-server"></a>

### server

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `server` { ... }   |
|-------------------------------------------------------------------------------------------|--------------------|
| Padrão                                                                                    | —                  |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | mail               |

Define a configuração para um servidor.

<a id="index-8"></a>

<a id="m-server-name"></a>

### server_name

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `server_name` nome;     |
|-------------------------------------------------------------------------------------------|-------------------------|
| Padrão                                                                                    | `server_name hostname`; |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | mail, server            |

Define o nome do servidor que é usado:

* na saudação inicial do servidor POP3/SMTP;
* no salt durante a autenticação SASL CRAM-MD5;
* no comando EHLO ao conectar ao backend SMTP, se a passagem do comando [XCLIENT](https://pt.angie.software//angie/docs/configuration/modules/mail/mail_proxy.md#m-xclient) estiver habilitada.

Se a diretiva não for especificada, o hostname da máquina é usado.

<a id="index-9"></a>

<a id="m-timeout"></a>

### timeout

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `timeout` tempo;   |
|-------------------------------------------------------------------------------------------|--------------------|
| Padrão                                                                                    | `timeout 60s;`     |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | mail, server       |

Define o timeout que é usado antes que o proxy para o backend seja iniciado.
