Skip to content

Stack de E-mail Self-Hosted: Stalwart + Brevo + SnappyMail

Documentação completa de instalação, configuração e operação da stack de e-mail self-hosted em Oracle Cloud (VPS ARM64), onde a porta 25 é bloqueada pelo provedor e o envio de e-mails externos é feito via relay SMTP do Brevo.


Visão Geral da Arquitetura

Usuário (Webmail)
      │
      ▼
 SnappyMail (porta 8888)
      │ IMAP/SMTP (interno)
      ▼
 Stalwart Mail Server
      │
      ├─ E-mails locais ──────────────► Entrega local (RocksDB)
      │
      └─ E-mails externos ────────────► smtp-relay.brevo.com:587
                                         (relay SMTP autenticado)

Por que relay SMTP? A Oracle Cloud bloqueia a porta 25 em todas as instâncias por padrão, impedindo envio direto de e-mails via MX. O Brevo atua como relay autenticado na porta 587, contornando essa limitação.

A API key REST do Brevo não é utilizada nessa stack. Somente a senha SMTP (formato xsmtpsib-...) é necessária. O e-mail de aviso do Brevo sobre inatividade de API key pode ser ignorado ou a chave mantida ativa com um envio de teste via SMTP (ver seção de manutenção).


Pré-requisitos

  • VPS Oracle Cloud (ARM64 Ampere, mínimo 1 vCPU / 1GB RAM)
  • Docker + Docker Compose instalados
  • Portainer (opcional, recomendado para gerenciamento)
  • Domínio próprio com acesso ao DNS
  • Conta no Brevo (gratuita — até 300 e-mails/dia)
  • Nginx Proxy Manager (NPM) para SSL/TLS

1. Configuração de DNS

2.1 Zonefile completo (exemplo: ruiogawa.net)

O Stalwart gera automaticamente os registros DNS recomendados no painel em Settings → DNS Records. Abaixo o zonefile completo usado na configuração de referência:

; MX — recebimento de e-mails
@                  IN MX    10 stalwart.ruiogawa.net.

; CNAMEs de serviço
mail               IN CNAME stalwart.ruiogawa.net.
autoconfig         IN CNAME stalwart.ruiogawa.net.
autodiscover       IN CNAME stalwart.ruiogawa.net.
mta-sts            IN CNAME stalwart.ruiogawa.net.

; DKIM (gerados automaticamente pelo Stalwart — dois algoritmos)
202602e._domainkey IN TXT   "v=DKIM1; k=ed25519; h=sha256; p=CHAVE_ED25519"
202602r._domainkey IN TXT   "v=DKIM1; k=rsa; h=sha256; p=CHAVE_RSA_PARTE1" "CHAVE_RSA_PARTE2"

; SPF
stalwart           IN TXT   "v=spf1 a ra=postmaster -all"
@                  IN TXT   "v=spf1 mx ra=postmaster -all"

; DMARC
_dmarc             IN TXT   "v=DMARC1; p=reject; rua=mailto:postmaster@ruiogawa.net; ruf=mailto:postmaster@ruiogawa.net"

; MTA-STS e TLS-RPT
_mta-sts           IN TXT   "v=STSv1; id=ID_GERADO_PELO_STALWART"
_smtp._tls         IN TXT   "v=TLSRPTv1; rua=mailto:postmaster@ruiogawa.net"

; SRV — autodiscovery de clientes de e-mail
_jmap._tcp         IN SRV   0 1 443 stalwart.ruiogawa.net.
_caldavs._tcp      IN SRV   0 1 443 stalwart.ruiogawa.net.
_carddavs._tcp     IN SRV   0 1 443 stalwart.ruiogawa.net.
_imaps._tcp        IN SRV   0 1 993 stalwart.ruiogawa.net.
_imap._tcp         IN SRV   0 1 143 stalwart.ruiogawa.net.
_pop3s._tcp        IN SRV   0 1 995 stalwart.ruiogawa.net.
_submissions._tcp  IN SRV   0 1 465 stalwart.ruiogawa.net.
_submission._tcp   IN SRV   0 1 587 stalwart.ruiogawa.net.

; DANE/TLSA — autenticação do certificado TLS na porta 25
; (valores gerados automaticamente pelo Stalwart — copiar do painel DNS Records)
_25._tcp.stalwart  IN TLSA  3 0 1 HASH1
_25._tcp.stalwart  IN TLSA  3 0 2 HASH2
_25._tcp.stalwart  IN TLSA  3 1 1 HASH3
_25._tcp.stalwart  IN TLSA  3 1 2 HASH4
_25._tcp.stalwart  IN TLSA  2 0 1 HASH5
_25._tcp.stalwart  IN TLSA  2 0 2 HASH6
_25._tcp.stalwart  IN TLSA  2 1 1 HASH7
_25._tcp.stalwart  IN TLSA  2 1 2 HASH8

Dica: Após configurar o Stalwart, acesse Settings → DNS Records no painel — ele exibe o zonefile completo com todos os valores corretos já preenchidos (DKIM, TLSA, MTA-STS ID), prontos para copiar.

2.2 Adicionar domínio no Stalwart

  1. No painel → Accounts → Domains → + Create domain
  2. Informe o nome do domínio (ex: ruiogawa.net)
  3. Salve e acesse Settings → DNS Records para obter o zonefile completo gerado

O Stalwart suporta múltiplos domínios. Cada domínio tem seu próprio conjunto de chaves DKIM geradas automaticamente.


3. Configuração do Brevo

2.1 Criação da conta e verificação de domínio

  1. Acesse app.brevo.com e crie uma conta gratuita
  2. Vá em Senders & IPs → Domains
  3. Clique em Add a domain e siga o processo de verificação DNS
  4. Após verificação, vá em Senders & IPs → SMTP & API

2.2 Obtenção das credenciais SMTP

Em SMTP & API → SMTP:

Campo Valor
Servidor SMTP smtp-relay.brevo.com
Porta 587
Login seulogin@smtp-brevo.com (ex: a192bc001@smtp-brevo.com)
Senha (Master password) xsmtpsib-... (senha longa gerada pelo Brevo)

Importante: Guarde essas credenciais em um gerenciador de senhas. A senha SMTP (xsmtpsib-...) é diferente da API key REST (xkeysib-...).

2.3 Manutenção da chave ativa

O Brevo inativa credenciais SMTP após 3 meses sem uso. Para manter ativa, envie um e-mail de teste:

curl --url "smtps://smtp-relay.brevo.com:465" \
  --ssl-reqd \
  --mail-from "seulogin@smtp-brevo.com" \
  --mail-rcpt "seuemail@gmail.com" \
  --user "seulogin@smtp-brevo.com:xsmtpsib-SUA_SENHA" \
  --upload-file - <<EOF
From: Teste <seulogin@smtp-brevo.com>
To: seuemail@gmail.com
Subject: Teste atividade Brevo

Mantendo a chave ativa.
EOF

3. Instalação do Stalwart

3.1 Estrutura de diretórios

mkdir -p ~/stacks/stalwart/stalwart
cd ~/stacks/stalwart

3.2 docker-compose.yml

version: '3.8'
services:
  stalwart-mail:
    image: stalwartlabs/stalwart:latest
    container_name: stalwart-mail
    restart: always
    networks:
      - stalwart
    ports:
      - "25:25"     # SMTP (recebimento — pode estar bloqueado no Oracle)
      - "465:465"   # SMTPS
      - "587:587"   # Submission
      - "993:993"   # IMAPS
      - "995:995"   # POP3S
      - "8081:8080" # Admin Web UI
    volumes:
      - ./stalwart:/opt/stalwart-mail
    environment:
      - STALWART_URL=https://stalwart.seudominio.com

networks:
  stalwart:
    driver: bridge
docker compose up -d

3.3 Configuração inicial

O Stalwart gera uma senha de admin temporária nos logs na primeira inicialização:

docker logs stalwart-mail | grep -i "admin\|password\|secret"

Acesse o painel em https://stalwart.seudominio.com (via NPM) ou http://IP:8081.


4. Configuração do Stalwart

4.1 Arquivo config.toml

Localizado em /opt/stalwart/etc/config.toml dentro do container (mapeado para ./stalwart/etc/config.toml no host):

authentication.fallback-admin.secret = "$6$HASH_SHA512_AQUI"
authentication.fallback-admin.user = "admin"

certificate.npm-cert.cert = "%{file:/etc/stalwart/certs/fullchain.pem}%"
certificate.npm-cert.default = true
certificate.npm-cert.private-key = "%{file:/etc/stalwart/certs/privkey.pem}%"

directory.internal.store = "rocksdb"
directory.internal.type = "internal"

server.hostname = "stalwart.seudominio.com"
server.listener.http.bind = "[::]:8080"
server.listener.http.protocol = "http"
server.listener.https.bind = "[::]:443"
server.listener.https.protocol = "http"
server.listener.https.tls.implicit = true
server.listener.imap.bind = "[::]:143"
server.listener.imap.protocol = "imap"
server.listener.imaptls.bind = "[::]:993"
server.listener.imaptls.protocol = "imap"
server.listener.imaptls.tls.certificate = "npm-cert"
server.listener.imaptls.tls.implicit = true
server.listener.pop3.bind = "[::]:110"
server.listener.pop3.protocol = "pop3"
server.listener.pop3s.bind = "[::]:995"
server.listener.pop3s.protocol = "pop3"
server.listener.pop3s.tls.implicit = true
server.listener.sieve.bind = "[::]:4190"
server.listener.sieve.protocol = "managesieve"
server.listener.smtp.bind = "[::]:25"
server.listener.smtp.protocol = "smtp"
server.listener.submission.bind = "[::]:587"
server.listener.submission.protocol = "smtp"
server.listener.submission.tls.certificate = "npm-cert"
server.listener.submissions.bind = "[::]:465"
server.listener.submissions.protocol = "smtp"
server.listener.submissions.tls.implicit = true

server.max-connections = 8192
server.socket.backlog = 1024
server.socket.nodelay = true
server.socket.reuse-addr = true
server.socket.reuse-port = true

storage.blob = "rocksdb"
storage.data = "rocksdb"
storage.directory = "internal"
storage.fts = "rocksdb"
storage.lookup = "rocksdb"

store.rocksdb.compression = "lz4"
store.rocksdb.path = "/opt/stalwart/data"
store.rocksdb.type = "rocksdb"

tracer.log.ansi = false
tracer.log.enable = true
tracer.log.level = "info"
tracer.log.path = "/opt/stalwart/logs"
tracer.log.prefix = "stalwart.log"
tracer.log.rotate = "daily"
tracer.log.type = "log"

Nota: As configurações de relay, roteamento e contas são armazenadas no RocksDB e gerenciadas pelo painel web — não ficam no config.toml.

4.2 Configurar o relay Brevo (painel web)

  1. Acesse o painel → SMTP → Outbound → Routing
  2. Clique em + Create route
  3. Preencha:
Campo Valor
ID brevo
Type Relay Host
Address smtp-relay.brevo.com
Port 587
Protocol SMTP
Implicit TLS Desligado
Username a192bc001@smtp-brevo.com
Secret xsmtpsib-SUA_SENHA_AQUI
  1. Clique em Save & Reload

4.3 Configurar estratégia de roteamento (painel web)

Em SMTP → Outbound → Strategies, configure o campo Routing:

Condição Rota
is_local_domain("*", rcpt_domain) 'local'
(padrão — sem condição) 'brevo'

Isso garante que e-mails para domínios locais são entregues internamente e todos os demais são roteados pelo Brevo.

4.4 Gerar hash de senha para o admin

Quando precisar redefinir a senha do fallback-admin diretamente no config.toml:

# Gerar hash SHA-512
openssl passwd -6 'SUA_SENHA_AQUI'

Substituir no config usando awk (evita problemas de escape com caracteres especiais):

awk '/fallback-admin.secret/{
  print "authentication.fallback-admin.secret = \"$6$HASH_GERADO\""; next
}1' /opt/stalwart/etc/config.toml > /tmp/config.toml \
  && mv /tmp/config.toml /opt/stalwart/etc/config.toml

Atenção: O fallback-admin só funciona quando não existe nenhum admin cadastrado no diretório interno (RocksDB). Se já houver um admin no banco, ele tem precedência. Em caso de emergência, use senha em texto plano temporariamente e redefina pelo painel assim que logar.


5. Configurações Detalhadas do Stalwart

5.1 Network (Settings → Network)

Campo Valor
Hostname stalwart.ruiogawa.net
Max connections 8192
Proxy networks (vazio)
Backlog 1024
No delay On
Reuse Address On
Reuse port On

5.2 System (Settings → System)

Local configuration keys — define quais chaves são gerenciadas pelo config.toml local (não pelo banco RocksDB):

store.*
directory.*
tracer.*
!server.blocked-ip.*
!server.allowed-ip.*
server.*
config.local-keys.*
certificate.*
cluster.*
storage.data
storage.blob
storage.lookup
storage.fts
storage.directory
authentication.fallback-admin.*
enterprise.license-key

As entradas com ! (como !server.blocked-ip.*) são excluídas do controle local — ou seja, IPs bloqueados/permitidos são gerenciados pelo banco de dados (painel web), não pelo config.toml.

Thread pool size: 8

5.3 Listeners (Settings → Listeners)

Listener ID Protocolo Bind Implicit TLS
http HTTP [::]:8080 No
https HTTP [::]:443 Yes
imap IMAP4 [::]:143 No
imaptls IMAP4 [::]:993 Yes
pop3 POP3 [::]:110 Yes
pop3s POP3 [::]:995 Yes
sieve ManageSieve [::]:4190 No
smtp SMTP [::]:25 No
submission SMTP [::]:587 No
submissions SMTP [::]:465 Yes

5.4 TLS — Certificados

O Stalwart usa um certificado configurado como npm-cert, que aponta para os arquivos gerados pelo Nginx Proxy Manager e montados via volume no container:

Campo Valor
Certificate ID npm-cert
Certificate %{file:/etc/stalwart/certs/fullchain.pem}%
Private Key %{file:/etc/stalwart/certs/privkey.pem}%
Default certificate Yes

Nota: Embora o tráfego web (https://stalwart.ruiogawa.net) passe pelo NPM antes de chegar ao Stalwart, o Stalwart ainda precisa dos certificados para os listeners IMAP/POP3/SMTP com TLS implícito (portas 993, 995, 465), que são acessados diretamente sem passar pelo NPM.

Configuração do volume no docker-compose:

volumes:
  - ./stalwart:/opt/stalwart-mail
  - /path/to/npm/certs/stalwart.ruiogawa.net:/etc/stalwart/certs:ro

5.5 TLS — Opções padrão

Campo Valor
Disabled Protocols Nenhum (TLS 1.2 e 1.3 habilitados)
Disabled Ciphersuites Nenhum
Handshake Timeout 1 minuto
Ignore client order On

5.6 Cache (Settings → Cache)

Data Cache:

Tipo Tamanho
Emails 50 MB
Calendars 10 MB
Contacts 10 MB
Files 10 MB

Authorization Cache:

Tipo Tamanho
Access Tokens 10 MB
HTTP Authorization 1 MB
Permissions 5 MB

Spam Filter Cache:

Tipo Tamanho
RBL Records 5 MB

DNS Record Cache:

Tipo Tamanho
TXT Records 5 MB
MX Records 5 MB
IPv4 Records 5 MB
IPv6 Records 5 MB
PTR Records 1 MB
TLSA Records 1 MB
MTA-STS Records 1 MB

5.7 Storage — Configurações (Settings → Storage)

Campo Valor
Data Store RocksDB
Enable encryption at rest On
Encrypt on append Off
Blob Store RocksDB
Un-delete period None
Search Store RocksDB
Default Language en
Indexing Batch Size 100
Enable Email Searching On
Enable Calendar Searching On
Enable Contacts Searching On
Enable Tracing Searching Off
In-Memory Store RocksDB
Cleanup Frequency Every day at hour 0, minute 0
Changes history 10000
Trash auto-expunge 30 days

5.8 Storage — Store RocksDB

Campo Valor
Store ID rocksdb
Type RocksDB
Path /opt/stalwart/data
Compression LZ4
Purge Frequency Every day at hour 3, minute 0
Thread Pool Size 8

5.9 Storage — HTTP Lists (Listas anti-spam)

O Stalwart mantém listas externas atualizadas automaticamente para filtragem de spam:

List ID URL Ativo
stwt_disposable_domains https://disposable.github.io/disposable-email-domains/domains_mx.txt Yes
stwt_free_domains https://gist.githubusercontent.com/okutbay/.../free_email_provider_domains.txt Yes
stwt_openphish https://openphish.com/feed.txt Yes
stwt_phishtank https://data.phishtank.com/data/online-valid.csv.gz Yes

Essas listas são baixadas e atualizadas periodicamente pelo Stalwart. Não é necessário configuração adicional — vêm ativas por padrão.


6. SnappyMail — Instalação e Configuração

6.1 docker-compose.yml

version: '3'
services:
  snappymail:
    container_name: snappymail
    image: djmaze/snappymail:latest
    restart: unless-stopped
    volumes:
      - ./data/:/snappymail/data/
    ports:
      - 8888:8888

Atenção: O volume real dos dados fica em /var/lib/snappymail/_data_ dentro do container, não em /snappymail/data. Isso é um comportamento da imagem djmaze/snappymail.

mkdir -p ~/stacks/snappymail/data
cd ~/stacks/snappymail
docker compose up -d

6.2 Painel administrativo

Acesse em: https://webmail.ruiogawa.net/?admin

Credenciais padrão na primeira instalação — login admin, senha gerada nos logs:

docker logs snappymail | grep -i password

6.3 Geral — Interface

Campo Valor
Idioma (webmail) English
Idioma (admin) Português (Brasil)
Tema Padrão Squares Dark
Permitir escolha de idioma Sim
Permitir escolha de tema Sim
Permitir imagem de fundo Sim
Mostrar miniatura de anexos Sim
Tamanho limite de anexo 25 MB
Permitir contas adicionais Sim
Permitir identidades múltiplas Sim

PHP: upload_max_filesize = 25M; post_max_size = 25M — deve estar configurado no container.


6.4 Login — Tela de entrada

Campo Valor
Domínio padrão (vazio — determinado automaticamente)
Tentar determinar o domínio do usuário Sim
Permitir escolha do idioma na tela de entrada Sim
Tentar determinar o idioma do usuário Sim

6.5 Domínios configurados

O SnappyMail permite acesso de usuários dos seguintes domínios. Cada domínio tem sua configuração própria de IMAP/SMTP:

Domínio Ativo
ruiogawa.net
evolua.ai
weathermesh.com.br
minhaenergia.solar
gmail.com
aluno.unb.br
binariosistemas.com.br
ifmt.edu.br
rui.ogawa (alias)
* (curinga)

O domínio curinga * permite login de qualquer endereço — útil para acessar contas externas pelo webmail.


6.6 Configurar IMAP/SMTP para um domínio

No painel admin → Domínios → clique no domínio (ex: ruiogawa.net) → + Adicionar Domínio:

IMAP:

Campo Valor
Host stalwart.ruiogawa.net
Port 993
Secure SSL/TLS

SMTP:

Campo Valor
Host stalwart.ruiogawa.net
Port 465
Secure SSL/TLS

Para domínios externos (ex: gmail.com), usar os servidores IMAP/SMTP do respectivo provedor.


6.7 Principais configurações (application.ini)

Localizado em /var/lib/snappymail/_data_/_default_/configs/application.ini:

[webmail]
title = "Webmail - Rui Ogawa"
loading_description = "Webmail - Rui Ogawa"
theme = "SquaresDark"
language = "pt-BR"
allow_themes = On
allow_languages_on_settings = On
allow_additional_accounts = On
allow_additional_identities = On
messages_per_page = 20
message_read_delay = 5
min_refresh_interval = 5
attachment_size_limit = 25

[security]
admin_login = "admin"
admin_password = "$2y$10$HASH_BCRYPT"  ; gerado automaticamente
allow_admin_panel = On
gnupg = On
openpgp = On
auto_verify_signatures = On
force_https = Off
encrypt_cipher = "camellia-192-ofb"
cookie_samesite = "Strict"

[login]
default_domain = ""
determine_user_domain = On
allow_languages_on_login = On
determine_user_language = On
sign_me_auto = "DefaultOff"
fault_delay = 5

[plugins]
enable = On
enabled_list = "avatars,backup,snowfall-on-login-screen,cache-redis,imap-contacts-suggestions"

[defaults]
view_editor_type = "Html"
view_layout = 1
autologout = 120
view_html = On
show_images = On
view_images = "always"
mail_use_threads = On

[logs]
enable = On
level = 4
time_zone = "America/Sao_Paulo"
filename = "stderr"
auth_logging = On
auth_logging_filename = "auth.log"

[cache]
enable = On
index = "v1"
http = On
http_expires = 3600
server_uids = On

6. SnappyMail — Proxy no NPM

Configure o proxy host para webmail.ruiogawa.net:

Campo Valor
Scheme http
Forward Hostname / IP IP do VPS
Forward Port 8888
Websockets Support On
SSL Let's Encrypt

7. Gerenciamento de Contas

7.1 Criar conta de usuário

No painel → Accounts → + Create account:

Campo Descrição
Login name Identificador interno (ex: ruiogawa)
Name Nome de exibição (ex: Rui Ogawa)
Email Endereço principal (ex: ruiogawa@ruiogawa.net)
Aliases E-mails alternativos (+ Add Email)
Locale Portuguese

Em Authentication, defina a senha do usuário.

Em Permissions, o role padrão é user — suficiente para uso normal de e-mail.

7.2 Domínios ativos na configuração de referência

Domínio Contas
ruiogawa.net ruiogawa@ruiogawa.net, postmaster@ruiogawa.net
evolua.ai rui.ogawa@evolua.ai, contato@evolua.ai, postmaster@evolua.ai
weathermesh.com.br adm@weathermesh.com.br, contato@weathermesh.com.br, postmaster@weathermesh.com.br
minhaenergia.solar contato@minhaenergia.solar

Boa prática: Sempre crie uma conta postmaster@seudominio.com para cada domínio — é exigido pelos registros DMARC e MTA-STS.

7.3 Redefinir senha de um usuário

No painel → Accounts → clique nos ... da conta → Edit → aba Authentication → campo Password → salve.


8. Nginx Proxy Manager — Configuração e Troubleshooting

8.1 Proxy host do Stalwart

No NPM, configure o proxy host para stalwart.ruiogawa.net:

Campo Valor
Scheme http
Forward Hostname / IP IP do VPS (ex: 164.152.249.16)
Forward Port 8081
Websockets Support On

Problema comum: O Stalwart pode bloquear o IP do VPS automaticamente se detectar muitas requisições sem autenticação (o NPM fazendo health checks, por exemplo). Se o acesso HTTPS parar de funcionar com erro 502, acesse o painel via http://IP:8081 diretamente e vá em Security → Blocked IPs para remover o IP bloqueado.

8.2 SSL

Configure Let's Encrypt no NPM para stalwart.ruiogawa.net e webmail.ruiogawa.net. Os certificados gerados precisam ser montados no container do Stalwart:

/etc/stalwart/certs/fullchain.pem
/etc/stalwart/certs/privkey.pem

10. Manutenção e Troubleshooting

Logs do Stalwart

# Logs em tempo real (via Docker)
docker logs -f stalwart-mail

# Logs em arquivo (dentro do container)
ls /opt/stalwart/logs/
tail -100 /opt/stalwart/logs/stalwart.log.$(date +%Y-%m-%d)

Redefinir senha do admin (emergência)

  1. Acessar o terminal do container via Portainer → >_ Console
  2. Colocar senha em texto plano temporariamente:
awk '/fallback-admin.secret/{print "authentication.fallback-admin.secret = \"SenhaTemp123\""; next}1' \
  /opt/stalwart/etc/config.toml > /tmp/c.toml && mv /tmp/c.toml /opt/stalwart/etc/config.toml
  1. Reiniciar o container pelo Portainer
  2. Logar e redefinir a senha pelo painel web
  3. Substituir por hash permanente (ver seção 4.4)

Testar envio via Brevo (SMTP)

curl --url "smtps://smtp-relay.brevo.com:465" \
  --ssl-reqd \
  --mail-from "seulogin@smtp-brevo.com" \
  --mail-rcpt "destinatario@exemplo.com" \
  --user "seulogin@smtp-brevo.com:xsmtpsib-SUA_SENHA" \
  --upload-file - <<EOF
From: Teste <seulogin@smtp-brevo.com>
To: destinatario@exemplo.com
Subject: Teste

Corpo do e-mail.
EOF

Verificar configuração do relay no Stalwart

# Acessar o console do container
docker exec -it stalwart-mail sh

# Verificar config local
cat /opt/stalwart/etc/config.toml | grep -i brevo

11. Referências de Credenciais

Serviço URL Usuário Onde fica a senha
Stalwart Admin https://stalwart.seudominio.com admin config.toml (hash SHA-512)
SnappyMail Admin https://webmail.seudominio.com/?admin admin application.ini (hash bcrypt)
Brevo SMTP smtp-relay.brevo.com:587 login@smtp-brevo.com Painel Brevo → SMTP & API
Brevo Painel app.brevo.com e-mail cadastrado Gerenciador de senhas

Documentado em maio/2026 — Stalwart v0.15.4 / SnappyMail v2.38.2