docker-postfix 是一个基于 Alpine Linux 的轻量级 Postfix 中继主机镜像,专为 Docker 容器环境设计。它允许在 Docker 云/ swarm 部署中集中管理出站邮件发送,支持直接发送邮件或通过公司主服务器中继邮件。
MYNETWORKS 限制允许发送邮件的网络范围ALLOWED_SENDER_DOMAINS 限制允许的发件人域名bashdocker run --rm --name postfix -e "ALLOWED_SENDER_DOMAINS=example.com" -p 1587:587 boky/postfix
启动后,可使用 localhost:1587 作为 SMTP 服务器地址发送邮件。注意:需确保 example.com 域名已正确配置 SPF 记录(参见 openspf),否则邮件可能被标记为垃圾邮件。
重要:镜像默认使用提交端口(587),不暴露端口 25(因常被 ISP 封锁或被其他服务占用)。
| 环境变量 | 描述 |
|---|---|
HOSTNAME | Postfix 服务器标识主机名(默认使用 Docker 容器 ID) |
RELAYHOST | 中继主机地址(格式:host 或 host:port 或 [ipv6]:port) |
RELAYHOST_USERNAME | 中继主机认证用户名(可选) |
RELAYHOST_PASSWORD | 中继主机认证密码(可选) |
MYNETWORKS | 允许发送邮件的网络范围(默认:127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16) |
ALLOWED_SENDER_DOMAINS | 允许的发件人域名(空格分隔多个域名,必填,除非设置 ALLOW_EMPTY_SENDER_DOMAINS) |
ALLOW_EMPTY_SENDER_DOMAINS | 允许空发件人域名(设置为非空值如 "true" 时,ALLOWED_SENDER_DOMAINS 可省略) |
MASQUERADED_DOMAINS | 地址伪装域名(重写发件人地址,如 *** → ***) |
RELAYHOST_TLS_LEVEL | 中继主机 TLS 安全级别(默认:may,详见 Postfix 文档) |
MESSAGE_SIZE_LIMIT | 最大邮件大小(字节,默认 0 表示无限制) |
INBOUND_DEBUGGING | 启用来自 MYNETWORKS 的连接调试(设置为非空值如 "1" 启用) |
SMTP_HEADER_CHECKS | SMTP 头检查配置(格式:type:path,设置为 "1" 时使用默认配置) |
HOSTNAME设置 Postfix 服务器标识主机名,默认使用容器 ID(如 f73792d540a5)。建议显式设置以方便日志追踪:
bashdocker run --rm --name postfix -e HOSTNAME=postfix-docker -e "ALLOWED_SENDER_DOMAINS=example.com" -p 1587:587 boky/postfix
RELAYHOST, RELAYHOST_USERNAME, RELAYHOST_PASSWORD配置中继主机,用于通过外部服务器发送邮件(如公司邮件服务器或第三方 SMTP 服务):
基本中继(默认端口 25):
bashdocker run --rm --name postfix -e "RELAYHOST=192.168.115.215" -e "ALLOWED_SENDER_DOMAINS=example.com" -p 1587:587 boky/postfix
指定端口:
bashdocker run --rm --name postfix -e "RELAYHOST=192.168.115.215:587" -e "ALLOWED_SENDER_DOMAINS=example.com" -p 1587:587 boky/postfix
IPv6 地址:
bashdocker run --rm --name postfix -e 'RELAYHOST=[2001:db8::1]:587' -e "ALLOWED_SENDER_DOMAINS=example.com" -p 1587:587 boky/postfix
带认证的中继:
bashdocker run --rm --name postfix \ -e "RELAYHOST=mail.google.com:587" \ -e "RELAYHOST_USERNAME=***" \ -e "RELAYHOST_PASSWORD=your-password" \ -e "ALLOWED_SENDER_DOMAINS=example.com" \ -p 1587:587 boky/postfix
MYNETWORKS限制允许发送邮件的网络范围(CIDR 格式,逗号分隔)。默认包含私有网络,如需收紧限制:
bashdocker run --rm --name postfix -e "MYNETWORKS=10.1.2.0/24" -e "ALLOWED_SENDER_DOMAINS=example.com" -p 1587:587 boky/postfix
ALLOWED_SENDER_DOMAINS必填项,指定允许的发件人域名(空格分隔多个域名),用于 Postfix 中继限制:
bashdocker run --rm --name postfix -e "ALLOWED_SENDER_DOMAINS=example.com example.org" -p 1587:587 boky/postfix
若需仅限制收件人而非发件人,设置 ALLOW_EMPTY_SENDER_DOMAINS=true 并将 ALLOWED_SENDER_DOMAINS 设为空,然后通过自定义脚本扩展配置。
MASQUERADED_DOMAINS启用地址伪装,重写发件人地址(如 *** → ***):
bashdocker run --rm --name postfix \ -e "ALLOWED_SENDER_DOMAINS=example.com example.org" \ -e "MASQUERADED_DOMAINS=example.com" \ -p 1587:587 boky/postfix
SMTP_HEADER_CHECKS配置 SMTP 头检查(用于过滤或修改邮件头)。设置为 "1" 时使用默认配置(regexp:/etc/postfix/smtp_header_checks):
bashdocker run --rm --name postfix \ -e "SMTP_HEADER_CHECKS=regexp:/etc/postfix/smtp_header_checks" \ -e "ALLOWED_SENDER_DOMAINS=example.com" \ -p 1587:587 boky/postfix
opendkim-tools 或 opendkim-utils(根据系统)bashmkdir -p /host/keys && cd /host/keys for DOMAIN in example.com example.org; do # 生成 selector 为 "mail" 的密钥 opendkim-genkey -b 2048 -h rsa-sha256 -r -v --subdomains -s mail -d $DOMAIN # 修复哈希算法标识 sed -i 's/h=rsa-sha256/h=sha256/' mail.txt # 重命名文件 mv mail.private $DOMAIN.private mv mail.txt $DOMAIN.txt done
将 <domain>.txt 文件中的内容添加到对应域名的 DNS TXT 记录(如 mail._domainkey.example.com)。
bashdocker run --rm --name postfix \ -e "ALLOWED_SENDER_DOMAINS=example.com example.org" \ -v /host/keys:/etc/opendkim/keys \ -p 1587:587 boky/postfix
通过自定义脚本扩展 Postfix 配置,脚本需放在 /docker-init.db/ 目录(.sh 扩展名),启动时自动执行。
dockerfileFROM boky/postfix LABEL maintainer="Jack Sparrow <***>" ADD additional-config.sh /docker-init.db/
bash#!/bin/sh # 添加自定义 Postfix 配置 postconf -e "address_verify_negative_cache=yes"
yamlversion: '3' services: postfix: image: boky/postfix container_name: postfix environment: - ALLOWED_SENDER_DOMAINS=example.com example.org - HOSTNAME=postfix.example.com - RELAYHOST=smtp.example.com:587 - RELAYHOST_USERNAME=*** - RELAYHOST_PASSWORD=smtp-password - MYNETWORKS=10.0.0.0/8,172.16.0.0/12 ports: - "1587:587" volumes: - ./dkim-keys:/etc/opendkim/keys - ./custom-scripts:/docker-init.db restart: unless-stopped
root 运行(Postfix 设计如此),子进程以 postfix 用户(UID:GID 100:101)运行opendkim 用户(UID:GID 102:103)运行MYNETWORKS 范围,避免未授权网络发送邮件来自真实用户的反馈,见证轩辕镜像的优质服务
免费版仅支持 Docker Hub 加速,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
免费版仅支持 docker.io;专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像加速服务
在 Docker Desktop 配置镜像加速
Docker Compose 项目配置加速
Kubernetes 集群配置 Containerd
在宝塔面板一键配置镜像加速
Synology 群晖 NAS 配置加速
飞牛 fnOS 系统配置镜像加速
极空间 NAS 系统配置加速服务
爱快 iKuai 路由系统配置加速
绿联 NAS 系统配置镜像加速
QNAP 威联通 NAS 配置加速
Podman 容器引擎配置加速
HPC 科学计算容器配置加速
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名加速
需要其他帮助?请查看我们的 常见问题 或 官方QQ群: 13763429