onesystems/mailrelay本镜像提供一个轻量级、现代化且可调试的基于Postfix的SMTP中继,打包为Docker容器。它设计作为可靠的基础设施组件,通过TLS和SASL认证将内部系统邮件中继到上游SMTP服务器。镜像专注于正确性、清晰的日志记录(通过docker logs)、可预测的发件人处理及零开放中继风险,还包含内置的交付失败和身份问题告警,并可选集成Zammad创建工单而非发送告警邮件。
docker logs查看)适用于需要将内部系统(如应用服务器、监控工具、自动化脚本等)产生的邮件可靠中继至外部SMTP服务的场景。特别适合企业内部环境,需确保邮件安全传递、避免因发件人不匹配导致的上游拒绝,并需要对邮件交付状态进行监控和告警的场景。
yamlversion: "3.9" services: mailrelay: build: . container_name: mailrelay restart: unless-stopped ports: - "25:25" # 仅在可信/内部网络暴露 environment: HOSTNAME_FQDN: "mailrelay.example.local" # 固定发件人处理 DEFAULT_FROM: "user@example.local" FORCE_DEFAULT_FROM: "1" # 中继目标 RELAY_HOST: "smtp.example.local" RELAY_PORT: "587" RELAY_TLS: "required" # 允许的客户端网络 MYNETWORKS: "127.0.0.0/8,10.0.0.0/8,192.168.0.0/16" # SASL认证 RELAY_SASL_USER: "loginuser@example.local" RELAY_SASL_PASS_FILE: "/run/secrets/relay_sasl_pass" # 告警配置 ALERT_ENABLED: "1" ALERT_MATCH: "invalid_user,sendas_denied,postfix_bounced,postfix_deferred" # Zammad集成 ALERT_ZAMMAD_ENABLED: "1" ZAMMAD_BASE_URL: "https://zammad.example.com" ZAMMAD_TOKEN_FILE: "/run/secrets/zammad_token" ZAMMAD_GROUP: "Support" ZAMMAD_STATE: "new" ZAMMAD_PRIORITY_ID: "2" # 1=低, 2=正常, 3=高 ZAMMAD_CUSTOMER_EMAIL: "mailrelay@example.local" ZAMMAD_TAGS: "mailrelay,postfix,alert" # 调试模式 DEBUG: "1" secrets: - relay_sasl_pass - zammad_token volumes: - postfix_spool:/var/spool/postfix - postfix_state:/var/lib/postfix - /etc/ssl/certs:/etc/ssl/certs:ro secrets: relay_sasl_pass: file: ./secrets/relay_sasl_pass.txt zammad_token: file: ./secrets/zammad_token.txt volumes: postfix_spool: postfix_state:
| 环境变量 | 描述 |
|---|---|
HOSTNAME_FQDN | 容器的完全限定域名 |
DEFAULT_FROM | 默认发件人地址,用于重写本地发件人 |
FORCE_DEFAULT_FROM | 是否强制使用默认发件人(1=启用,0=禁用) |
RELAY_HOST | 上游SMTP服务器地址 |
RELAY_PORT | 上游SMTP服务器端口(通常为587) |
RELAY_TLS | TLS要求("required"表示强制TLS) |
MYNETWORKS | 允许连接的客户端网络(CIDR格式,逗号分隔) |
RELAY_SASL_USER | 上游SMTP服务器的SASL认证用户名 |
RELAY_SASL_PASS_FILE | 存储SASL密码的secret文件路径 |
ALERT_ENABLED | 是否启用告警(1=启用,0=禁用) |
ALERT_MATCH | 触发告警的错误类型(逗号分隔) |
ALERT_ZAMMAD_ENABLED | 是否启用Zammad工单集成(1=启用,0=禁用) |
ZAMMAD_BASE_URL | Zammad实例的基础URL |
ZAMMAD_TOKEN_FILE | 存储Zammad API令牌的secret文件路径 |
ZAMMAD_GROUP | 创建工单的Zammad组 |
ZAMMAD_STATE | 工单初始状态 |
ZAMMAD_PRIORITY_ID | 工单优先级ID(1=低,2=正常,3=高) |
ZAMMAD_CUSTOMER_EMAIL | 工单创建者*** |
ZAMMAD_TAGS | 工单标签(逗号分隔) |
DEBUG | 是否启用调试模式(1=启用,0=禁用) |
relay_sasl_pass.txt该secret文件仅包含密码(不含用户名):
textsuper-secret-password
用户名通过RELAY_SASL_USER配置。
zammad_token.txt包含具有创建工单权限的Zammad API令牌:
textzammad-api-token-here
许多SMTP中继会拒绝发件人与认证用户不匹配的邮件。本镜像通过以下机制避免此问题:
DEFAULT_FROM → 本地发件人将被重写为此地址RELAY_SASL_USER这可避免类似以下错误:
553 5.7.1 Sender address rejected: not owned by user
发件人重写仅适用于本地/基础设施发件人(如root、daemon、基于主机的发件人)。
容器持续监控Postfix日志,对可操作失败触发告警,包括:
invalid_user - 上游***或身份不存在sendas_denied - 发件人不允许使用此地址发送postfix_bounced - 交付永久失败postfix_deferred - 交付暂时失败告警检测基于正则表达式,直接作用于Postfix日志流。
告警会限流以避免重复失败时的告警泛滥。
每个告警创建的内部Zammad工单包含:
postfix_bounced、ErrorInvalidUser)这使中继适合生产环境使用,避免邮件无声丢失。
swaks(推荐)bashdocker exec -it mailrelay swaks \ --to admin@example.com \ --from test@example.com \ --server 127.0.0.1 \ --port 25 \ --header "Subject: Relay test" \ --data "Hello from mailrelay"
sendmailbashdocker exec -i mailrelay sendmail admin@example.com <<EOF From: test@example.com To: admin@example.com Subject: Relay test Hello from mailrelay EOF
⚠️ 除非需要接收交付状态通知,否则不要使用sendmail -v。
所有Postfix日志写入文件并流式输出到stdout:
bashdocker logs -f mailrelay
这使得仅通过Docker日志即可审计交付和告警情况。
MYNETWORKS配置探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务