aprendendolinux/exim-relay

By aprendendolinux

Updated 9 months ago

Exim-Relay: Um Relay SMTP Simples com Docker e Exim4

Image
Networking
0

9.9K

aprendendolinux/exim-relay repository overview

Imagem Docker aprendendolinux/exim-relay

Exim Logo Docker Pulls Docker Image Size

Visão Geral

A imagem Docker aprendendolinux/exim-relay oferece uma solução leve, segura e altamente configurável para relay de e-mails baseado no Exim. Projetada para aplicações ou serviços internos, ela permite o envio de e-mails através de servidores SMTP externos, como Gmail, SendGrid ou Amazon SES. Construída sobre o Alpine Linux, a imagem mantém um tamanho reduzido (~20-30 MB), tornando-a ideal para ambientes de desenvolvimento, teste ou produção com recursos limitados.

Com suporte a autenticação SASL, configuração via variáveis de ambiente, atrasos configuráveis no envio de e-mails, desabilitação de IPv6, logs persistentes mapeados para o host, decodificação de assuntos MIME e configuração de fuso horário, esta imagem é perfeita para quem busca um relay SMTP eficiente sem a complexidade de um servidor de e-mail completo.

Imagem no Docker Hub: aprendendolinux/exim-relay:latest
Repositório GitHub: github.com/clubenaval/docker-postfix-relay
Autor: Henrique Fagundes, Analista de Infraestrutura GNU/Linux, Clube Naval

Recursos Principais

  • Relay SMTP Simples: Encaminha e-mails para servidores SMTP externos com suporte a TLS/STARTTLS para maior segurança.
  • Autenticação SASL: Compatível com autenticação por usuário e senha para a maioria dos provedores SMTP.
  • Configuração Flexível: Todas as opções principais são configuráveis via variáveis de ambiente, eliminando a necessidade de editar arquivos manualmente.
  • Atraso Configurável: Adiciona um atraso (ex.: 10s) entre envios de e-mails para o mesmo destino, evitando sobrecarga ou limites de taxa; desative com false.
  • Desabilitação de IPv6: Permite operar apenas em IPv4, ideal para redes com restrições de IPv6.
  • Gerenciamento de Logs: Logs são salvos em um arquivo mapeado no host, com opção de decodificação de assuntos MIME para facilitar a leitura.
  • Suporte a Fuso Horário: Configurável via TZ (ex.: America/Sao_Paulo) para timestamps precisos nos logs.
  • Redes Personalizáveis: Restringe o relay a redes específicas via mynetworks, com suporte a IPv4 e IPv6.
  • Funcionalidades Avançadas: Inclui adição de headers, logging de assuntos, sobrescrita de remetentes, limites de tamanho de mensagens e suporte a UTF-8.
  • Segurança: Suporta leitura de credenciais de arquivos para evitar exposição de dados sensíveis.
  • Compatibilidade: Funciona com Docker Compose, Kubernetes ou standalone, testado em Linux, macOS e Windows (via WSL).

Requisitos

  • Docker: Versão 20.10 ou superior.
  • Docker Compose: Versão 1.29 ou superior (recomendado para setups multi-container).
  • Servidor SMTP Externo: Endereço, porta e credenciais válidas (ex.: smtp.gmail.com:587 com App Password para Gmail).
  • Portas: Porta 25 (SMTP) deve ser exposta; configure firewalls para permitir tráfego.
  • Volumes: Mapeie /var/log/exim para persistência de logs no host.
  • Fuso Horário: Pacote tzdata incluído para suporte a configurações de timezone.

Como Usar

1. Puxar a Imagem do Docker Hub

Para começar, puxe a imagem pré-construída:

docker pull aprendendolinux/exim-relay:latest
2. Executar o Container Standalone

Execute o container com configurações comuns, substituindo os valores pelos seus:

docker run -d \
  --name exim-relay \
  -p 25:25 \
  -e SMTP_SERVER=smtp.gmail.com \
  -e SMTP_PORT=587 \
  -e [email protected] \
  -e SMTP_PASSWORD=seu_app_password \
  -e SERVER_HOSTNAME=mail.seudominio.com \
  -e EXIM_DESTINATION_RATE_DELAY=10s \
  -e EXIM_INET_PROTOCOLS=ipv4 \
  -e EXIM_MAILLOG_FILE=/var/log/exim/mail.log \
  -e DEBUG=yes \
  -e LOG_SUBJECT=yes \
  -e DECODE_SUBJECT=yes \
  -e TZ=America/Sao_Paulo \
  -v /srv/exim/logs:/var/log/exim \
  aprendendolinux/exim-relay:latest
  • Monitoramento de Logs: Verifique os logs com tail -f /srv/exim/logs/mail.log no host.
  • Teste de Envio: Consulte a seção "Testando o Relay" abaixo.
  • Fuso Horário: O parâmetro -e TZ=America/Sao_Paulo garante que os timestamps nos logs reflitam o horário de São Paulo.
3. Usando Docker Compose

Crie um arquivo docker-compose.yml para gerenciar o serviço (evite incluir credenciais sensíveis em repositórios públicos):

services:
  exim-relay:
    image: aprendendolinux/exim-relay:latest
    container_name: exim-relay
    restart: unless-stopped
    ports:
      - "25:25"
    environment:
      # Servidor SMTP externo (ex.: smtp.gmail.com)
      - SMTP_SERVER=smtp.gmail.com
      # Porta do servidor SMTP (587 para TLS, 465 para SSL)
      - SMTP_PORT=587
      # Usuário para autenticação SASL (ex.: seu e-mail)
      - [email protected]
      # Senha ou App Password para autenticação
      - SMTP_PASSWORD=seu_app_password
      # Hostname do servidor Exim (ex.: mail.seudominio.com)
      - SERVER_HOSTNAME=mail.seudominio.com
      # Atraso entre envios para o mesmo destino (ex.: 10s); use 'false' para desativar
      - EXIM_DESTINATION_RATE_DELAY=false
      # Protocolos de rede (ex.: ipv4 para desabilitar IPv6)
      - EXIM_INET_PROTOCOLS=ipv4
      # Caminho do arquivo de log no container
      - EXIM_MAILLOG_FILE=/var/log/exim/mail.log
      # Ativa logs de depuração (yes/no)
      - DEBUG=no
      # Registra o campo Subject nos logs (yes/no)
      - LOG_SUBJECT=no
      # Decodifica assuntos MIME nos logs (yes/no)
      - DECODE_SUBJECT=no
      # Fuso horário do container (ex.: America/Sao_Paulo)
      - TZ=America/Sao_Paulo
    volumes:
      - /srv/exim/logs:/var/log/exim
networks:
  default:
    driver: bridge

Inicie o serviço:

docker-compose up -d

Para parar:

docker-compose down

Nota: Ajuste o caminho /srv/exim/logs para um diretório válido no seu host. Para maior segurança, use Docker Secrets para credenciais em ambientes de produção.

Opções de Configuração

As configurações são feitas via variáveis de ambiente no docker run ou docker-compose.yml. Veja a lista completa:

  • SMTP_SERVER (obrigatório): Endereço do servidor SMTP externo (ex.: smtp.gmail.com).
  • SMTP_PORT (opcional, padrão: 587): Porta do servidor SMTP (587 para STARTTLS, 465 para SSL).
  • SMTP_USERNAME (opcional): Nome de usuário para autenticação SASL.
  • SMTP_PASSWORD (opcional): Senha ou App Password; use arquivos para maior segurança.
  • SMTP_USERNAME_FILE (opcional): Caminho para arquivo com o nome de usuário.
  • SMTP_PASSWORD_FILE (opcional): Caminho para arquivo com a senha.
  • SERVER_HOSTNAME (obrigatório): Hostname do Exim (ex.: mail.seudominio.com).
  • DOMAIN (opcional): Derivado de SERVER_HOSTNAME se não especificado.
  • EXIM_DESTINATION_RATE_DELAY (opcional, padrão: 1s): Atraso entre envios para o mesmo destino; use false para desativar.
  • EXIM_INET_PROTOCOLS (opcional, padrão: all): Protocolos de rede (ipv4 para desabilitar IPv6).
  • EXIM_MAILLOG_FILE (opcional, padrão: /dev/stdout): Caminho do arquivo de log (ex.: /var/log/exim/mail.log).
  • DEBUG (opcional, padrão: no): Ativa logs de depuração com yes.
  • SMTP_NETWORKS (opcional): Redes permitidas para relay (ex.: 192.168.0.0/16).
  • ALWAYS_ADD_MISSING_HEADERS (opcional, padrão: no): Adiciona headers faltantes (ex.: Date) com yes.
  • SMTP_HEADER_TAG (opcional): Tag personalizada em headers (ex.: RelayTag: mytag).
  • LOG_SUBJECT (opcional, padrão: no): Registra o campo Subject nos logs com yes.
  • DECODE_SUBJECT (opcional, padrão: no): Decodifica assuntos MIME para legibilidade; requer LOG_SUBJECT=yes.
  • OVERWRITE_FROM (opcional): Sobrescreve o campo From: (ex.: [email protected]).
  • MESSAGE_SIZE_LIMIT (opcional): Limite de tamanho das mensagens em bytes (ex.: 10485760 para 10MB).
  • SMTPUTF8_ENABLE (opcional): Habilita suporte a UTF-8 com yes.
  • TZ (opcional, padrão: UTC): Fuso horário para logs (ex.: America/Sao_Paulo).

Testando o Relay

  1. Iniciar o Container:

    docker-compose up -d
    
  2. Enviar um E-mail de Teste: Use mailx de outro container ou host na mesma rede:

    echo "Corpo do e-mail de teste" | mail -s "Assunto de Teste" -r [email protected] [email protected]
    

    Substitua [email protected] e [email protected] por endereços válidos. Certifique-se de que a porta 25 está acessível.

  3. Verificar os Logs: No host, execute:

    tail -f /srv/exim/logs/mail.log
    

    Procure por status=sent para confirmar o envio. Se DECODE_SUBJECT=yes, os assuntos codificados aparecerão legíveis. Verifique se os timestamps refletem o fuso horário configurado (ex.: America/Sao_Paulo).

  4. Confirmar o Fuso Horário: Verifique no container:

    docker exec -it exim-relay date
    

    O resultado deve mostrar a data/hora no fuso horário definido (ex.: Dom Out 12 18:30:00 -03 2025 para America/Sao_Paulo).

Depuração e Logs

  • Localização dos Logs: Armazenados em /var/log/exim/mail.log no container e mapeados para o host. Se EXIM_MAILLOG_FILE não for definido, os logs vão para stdout (visível com docker logs exim-relay).

  • Modo Debug: Ative DEBUG=yes para logs detalhados, mostrando configurações aplicadas.

  • Verificar Configurações do Exim: Execute:

    docker exec -it exim-relay exim -bP
    

    Verifique configurações como primary_hostname, relay_to_domains e outras.

  • Confirmar Fuso Horário: Verifique com:

    docker exec -it exim-relay cat /etc/timezone
    

    Ou confira os timestamps nos logs.

  • Decodificação de Assuntos: Com DECODE_SUBJECT=yes e LOG_SUBJECT=yes, os assuntos codificados (ex.: MIME Quoted-Printable) são decodificados para facilitar a leitura.

Solução de Problemas

  • Falha na Autenticação: Verifique SMTP_USERNAME, SMTP_PASSWORD e SMTP_PORT. Para Gmail, use um App Password.
  • IPv6 Não Funciona: Defina EXIM_INET_PROTOCOLS=ipv4 se a rede não suportar IPv6.
  • Logs Não Aparecem: Confirme o mapeamento de volume /var/log/exim e permissões no diretório do host.
  • Atraso Não Aplicado: Verifique com docker exec -it exim-relay exim -bP. Se EXIM_DESTINATION_RATE_DELAY=false, o atraso não será configurado.
  • Erros de TLS: Certifique-se de que o servidor SMTP suporta STARTTLS (porta 587) ou SMTPS (porta 465).
  • Decodificação Não Funciona: Confirme que LOG_SUBJECT=yes e DECODE_SUBJECT=yes. Verifique erros no docker logs.
  • Horário Errado nos Logs: Certifique-se de que TZ está definido (ex.: America/Sao_Paulo) e que tzdata está instalado. Verifique com docker exec -it exim-relay date.
  • Container Não Inicia: Inspecione logs com docker logs exim-relay para erros de configuração ou variáveis obrigatórias ausentes (SMTP_SERVER, SERVER_HOSTNAME).

Reporte problemas em GitHub Issues.

Monitoramento e Manutenção

  • Monitoramento de Logs: Use ferramentas como tail, less ou sistemas de monitoramento (ex.: ELK, Prometheus) para analisar /srv/exim/logs/mail.log. Procure por status=sent (sucesso) ou status=bounced (falhas).

  • Rotação de Logs: Configure rotação de logs no host (ex.: logrotate) para evitar consumo excessivo de disco.

  • Saúde do Container: Verifique o status com:

    docker ps -f name=exim-relay
    
  • Atualizações: Monitore o Docker Hub para novas versões da imagem. Para atualizar:

    docker pull aprendendolinux/exim-relay:latest
    docker-compose down
    docker-compose up -d
    
  • Backup dos Logs: Faça backup regular do diretório /srv/exim/logs para preservar históricos de envio.

Suporte e Comunidade

Se você encontrar problemas ou tiver sugestões, abra um issue no GitHub. Para dúvidas gerais, confira a documentação completa no repositório ou entre em contato com a comunidade no Docker Hub.

Se esta imagem foi útil, considere dar uma ⭐ no repositório GitHub e compartilhar com outros! Sua contribuição ajuda a manter o projeto ativo e a melhorar a experiência para todos os usuários.

Tag summary

Content type

Image

Digest

sha256:74ca9efc1

Size

154.2 MB

Last updated

9 months ago

docker pull aprendendolinux/exim-relay