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
- No painel → Accounts → Domains → + Create domain
- Informe o nome do domínio (ex:
ruiogawa.net) - 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
- Acesse app.brevo.com e crie uma conta gratuita
- Vá em Senders & IPs → Domains
- Clique em Add a domain e siga o processo de verificação DNS
- 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)
- Acesse o painel → SMTP → Outbound → Routing
- Clique em + Create route
- 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 |
- 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-adminsó 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 peloconfig.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 imagemdjmaze/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) |
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.compara 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:8081diretamente 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)
- Acessar o terminal do container via Portainer → >_ Console
- 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
- Reiniciar o container pelo Portainer
- Logar e redefinir a senha pelo painel web
- 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