Configurar Postfix no Ubuntu para Enviar Email da sua Aplicação
Guia técnico para configurar Postfix no Ubuntu como relay SMTP, com SPF, DKIM e DMARC para entregar emails transacionais da sua aplicação.
Enviar email da sua aplicação parece simples até a primeira mensagem cair no spam do Gmail ou ser rejeitada pelo Outlook. O Postfix é o servidor SMTP mais usado no Ubuntu por ser estável, performático e bem documentado, mas a configuração default não chega nem perto do que provedores modernos exigem para aceitar suas mensagens.
Este guia é para desenvolvedores que precisam configurar Postfix em uma VPS Ubuntu 24.04 LTS para enviar emails transacionais — confirmação de cadastro, recuperação de senha, notificações de pedido. Vamos configurar o Postfix como relay autenticado, com SPF, DKIM e DMARC ajustados no DNS, e validar a entrega real. Tempo estimado: 40 a 60 minutos, dependendo do tempo de propagação DNS.
A abordagem aqui é a de “null client” enviando via relay autenticado externo. É a configuração correta para 95% dos casos de aplicações web: mais simples, mais segura, e com taxa de entrega significativamente melhor do que tentar enviar direto da VPS.
Pré-requisitos
Antes de começar, garanta que você tem o ambiente preparado e as credenciais do relay em mãos.
Ubuntu 24.04 LTS com acesso sudo, domínio próprio com controle de DNS (Cloudflare, Registro.br, etc), e credenciais de um relay SMTP externo (Amazon SES, Mailgun, SendGrid ou similar). O relay precisa ter o domínio remetente validado.
Ubuntu 24.04 LTS postfix, libsasl2-modules, opendkim 587 (submission) ou 465 (smtps) Acesso para criar TXT e CNAME Verifique também se o hostname da VPS está configurado corretamente — Postfix usa o hostname para identificar-se no HELO/EHLO, e se for genérico tipo ubuntu-vps os relays podem rejeitar.
hostnamectl set-hostname mail.seudominio.com
echo "127.0.1.1 mail.seudominio.com mail" | sudo tee -a /etc/hosts
Instalação do Postfix
A instalação padrão do Postfix no Ubuntu já cobre quase tudo que precisamos, mas a configuração inicial via debconf pede algumas escolhas importantes.
Atualize o índice de pacotes e instale o Postfix junto com os módulos SASL necessários para autenticação no relay externo:
sudo apt update
sudo apt install -y postfix libsasl2-modules mailutilsDurante a instalação, o debconf vai abrir uma tela azul perguntando o tipo de configuração. Escolha Internet Site with smarthost. Em seguida, configure o “system mail name” como seudominio.com (sem subdomínio).
Se você passou da tela de configuração sem prestar atenção, rode novamente o assistente:
sudo dpkg-reconfigure postfixSelecione Internet Site with smarthost, defina o mail name como seudominio.com, e o SMTP relay host como [smtp.seuprovedor.com]:587 (com os colchetes, que desabilitam lookup MX).
Configuração do relay autenticado
O Postfix precisa saber para onde enviar e como autenticar. Isso vive em dois arquivos: main.cf (configuração principal) e sasl_passwd (credenciais).
Edite /etc/postfix/main.cf e adicione ou ajuste as seguintes diretivas no final do arquivo:
sudo nano /etc/postfix/main.cfrelayhost = [smtp.seuprovedor.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtp_sasl_tls_security_options = noanonymous
header_size_limit = 4096000A diretiva smtp_tls_security_level = encrypt força TLS na saída — sem isso, suas credenciais SASL podem ir em texto claro caso o relay aceite plaintext.
Crie o arquivo de credenciais com usuário e senha do relay:
sudo nano /etc/postfix/sasl_passwdAdicione uma única linha no formato:
[smtp.seuprovedor.com]:587 USUARIO_API:SENHA_APISalve, compile para hash binário e proteja o arquivo — ele contém credenciais em texto claro:
sudo postmap /etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
sudo systemctl restart postfixLembre-se de excluir /etc/postfix/sasl_passwd (texto claro) dos backups públicos ou versionamento. Mantenha apenas o arquivo .db se precisar restaurar — ele contém o hash usado pelo Postfix.
Configurando SPF, DKIM e DMARC no DNS
Sem autenticação DNS, nenhum provedor sério aceita seus emails consistentemente. Vamos configurar os três registros essenciais.
SPF (Sender Policy Framework)
SPF declara quais servidores podem enviar email com seu domínio como remetente. Crie um registro TXT no DNS do seu domínio:
Tipo: TXT
Nome: @
Valor: v=spf1 include:_spf.seuprovedor.com -all
O -all no final é um hard fail — qualquer servidor fora do include é rejeitado. Em produção, use ~all (soft fail) nos primeiros dias e migre para -all depois de validar a entrega.
DKIM (DomainKeys Identified Mail)
DKIM assina criptograficamente cada email enviado. A maioria dos relays fornece a chave pública pronta para colar no DNS — normalmente como CNAME ou TXT. Pegue os valores no painel do seu provedor de relay e crie os registros conforme indicado.
Se você precisa que o próprio Postfix assine (raro em null client), instale o opendkim:
Instale e configure o OpenDKIM apenas se o seu relay não assina automaticamente:
sudo apt install -y opendkim opendkim-tools
sudo mkdir -p /etc/opendkim/keys/seudominio.com
cd /etc/opendkim/keys/seudominio.com
sudo opendkim-genkey -s default -d seudominio.com
sudo chown opendkim:opendkim default.privateO arquivo default.txt gerado contém o registro TXT que você precisa publicar no DNS em default._domainkey.seudominio.com.
DMARC
DMARC instrui o servidor receptor sobre o que fazer com emails que falham SPF ou DKIM. Comece em modo monitoramento:
Tipo: TXT
Nome: _dmarc
Valor: v=DMARC1; p=none; rua=mailto:[email protected]; pct=100
Após uma semana coletando relatórios e confirmando que SPF e DKIM passam consistentemente, migre p=none para p=quarantine e depois p=reject.
Verificação da configuração
Antes de plugar isso na aplicação, valide com testes manuais que tudo funciona.
Envie um email de teste para um endereço Gmail (que oferece relatório detalhado de autenticação):
echo "Conteúdo do email de teste" | mail -s "Teste Postfix Relay" \
-a "From: [email protected]" [email protected]Acompanhe o log em tempo real em outra sessão SSH para ver a conversa SMTP completa:
sudo tail -f /var/log/mail.logVocê deve ver linhas como status=sent (250 2.0.0 OK). Qualquer deferred ou bounced indica problema.
Abra o email no Gmail, clique nos três pontos e selecione “Mostrar original”. Procure pelas linhas de cabeçalho:
SPF: PASS
DKIM: PASS
DMARC: PASSOs três precisam estar PASS. Se algum estiver FAIL ou NEUTRAL, revise o registro DNS correspondente e aguarde propagação (até 24 horas em alguns provedores).
Para testes mais detalhados, envie um email para [email protected] ou use o site mail-tester.com. Ambos retornam um relatório completo com SPF, DKIM, DMARC, reverse DNS e pontuação de spam.
Integrando com sua aplicação
Com Postfix funcionando como null client autenticado, sua aplicação envia emails via SMTP localhost na porta 25 sem precisar conhecer credenciais do relay.
Exemplo de configuração em variáveis de ambiente
SMTP_HOST=127.0.0.1
SMTP_PORT=25
SMTP_USER=
SMTP_PASS=
MAIL_FROM=[email protected]
Frameworks como Laravel, Django, Rails e Node.js (nodemailer) conseguem enviar emails apontando para 127.0.0.1:25 sem autenticação local — o Postfix se encarrega de relé autenticado com o provedor externo.
Resolução de problemas
Mensagens travadas em deferred
Se postqueue -p mostra mensagens com status deferred, normalmente é problema de autenticação SASL ou TLS:
sudo postqueue -p
sudo postcat -vq <ID_DA_MENSAGEM>
Veja /var/log/mail.log para a mensagem de erro específica. Os casos mais comuns: senha do relay errada (535 Authentication failed), TLS rejeitado pelo relay (STARTTLS failed), ou IP da VPS bloqueado pelo relay (verifique no painel do provedor).
Erro “Relay access denied”
Significa que você está tentando enviar com um endereço de remetente fora do domínio autorizado no relay. Confirme que o From: da aplicação usa exatamente o domínio configurado no provedor — e que o domínio está validado no painel.
Postfix não escuta na porta 25
Se sua aplicação não consegue conectar em 127.0.0.1:25, confirme que o Postfix está escutando:
sudo ss -tlnp | grep :25
Se nada aparecer, edite /etc/postfix/main.cf e confirme que inet_interfaces = loopback-only ou inet_interfaces = all (para null client, loopback-only é o correto e mais seguro). Reinicie com sudo systemctl restart postfix.
Próximos passos
Com Postfix configurado, vale explorar configurações de produção mais robustas:
- Configure
postfix-pflogsummpara receber relatórios diários por email sobre volume enviado, bounces e tentativas suspeitas. - Implemente rate limiting via
smtpd_client_connection_rate_limitpara proteger contra aplicações com loop infinito de envio. - Use uma fila de jobs (Sidekiq, Celery, Laravel Queue) para enfileirar envios em vez de chamar
sendmailsincronamente — isso evita travar requisições HTTP quando o relay está lento. - Monitore a reputação do seu domínio mensalmente em ferramentas como Google Postmaster Tools e Microsoft SNDS.
Se você está colocando email transacional em produção, uma VPS Hostini já vem com IPv4 dedicado e reverse DNS configurável pelo painel — dois requisitos básicos para que qualquer provedor de email leve seus envios a sério.
Perguntas frequentes
Posso enviar emails diretamente da VPS sem usar um relay externo?
Tecnicamente sim, mas a entrega vai sofrer. A maioria dos provedores de IPs cloud está em listas de reputação baixa por default, e Gmail/Outlook frequentemente jogam direto no spam ou rejeitam. Para volumes baixos transacionais (até algumas centenas por dia), use um relay autenticado como Amazon SES, Mailgun ou SendGrid. O Postfix local fica apenas como gateway.
Qual a diferença entre Postfix como MTA completo e como null client?
MTA completo aceita email de fora e entrega para usuários locais ou outros domínios — você precisa disso se hospeda caixas postais. Null client (ou send-only) só envia email gerado localmente para um relay externo. Para aplicações web que disparam emails transacionais, null client é o padrão correto: menor superfície de ataque, configuração mais simples.
Por que meus emails vão para spam mesmo com SPF, DKIM e DMARC válidos?
Autenticação resolve identidade, não reputação. Se o IP da VPS está em blacklists (Spamhaus, Barracuda) ou tem histórico ruim, mesmo emails autenticados vão para spam. Verifique reputação em mxtoolbox.com e considere usar um relay autenticado com IP dedicado, especialmente nos primeiros 30 dias de envio.
O Postfix está rodando mas mail não envia. Como debugar?
Comece por journalctl -u postfix -n 100 e /var/log/mail.log para mensagens recentes. Use postqueue -p para ver fila travada e postcat -vq ID para inspecionar uma mensagem específica. Se vê deferred com connection refused, o relay externo está bloqueando ou suas credenciais SASL estão erradas — confira /etc/postfix/sasl_passwd.
Preciso abrir a porta 25 no firewall?
Se você usa relay externo (porta 587 ou 465 outbound), a porta 25 não precisa estar aberta no firewall — apenas saída autenticada importa. Se você roda MTA completo recebendo emails, então 25 inbound é necessária. Para null client em VPS, mantenha 25 fechada na entrada e libere apenas 587/465 na saída.
Como rodar o teste de envio sem precisar de cliente SMTP completo?
Use o comando sendmail diretamente: echo 'Subject: teste' | sendmail -v [email protected]. A flag -v mostra a conversa SMTP completa em tempo real, útil para identificar handshake, autenticação e resposta do servidor remoto. Alternativa: swaks --to [email protected] --from [email protected].