如何实现Docker应用容器通过Postfix SMTP中继容器发送邮件
无需SSH!让应用容器通过Postfix中继容器发邮件的正确姿势
其实你完全没必要用SSH来连接Postfix容器——Docker容器之间有原生、高效的通信机制,直接通过自定义网络就能实现应用容器调用Postfix的SMTP服务。下面是具体的实现步骤:
1. 创建专属Docker网络(关键!)
首先创建一个自定义Docker网络,这样两个容器之间可以通过容器名称直接解析通信(默认桥接网络可能存在DNS解析问题):
docker network create mail-relay-network
2. 配置并启动Postfix中继容器
你需要确保Postfix容器允许来自应用容器的中继请求,同时把它加入刚才创建的网络。这里推荐使用现成的boky/postfix镜像(配置简单,适合快速搭建中继):
docker run -d \ --name postfix-relay \ --network mail-relay-network \ -e MYHOSTNAME=mail.yourdomain.com \ # 设置你的邮件服务器域名 -e MYNETWORKS=172.18.0.0/16 \ # 这里填自定义网络的子网(可通过`docker network inspect mail-relay-network`查看),允许该子网内的容器中继 -e RELAYHOST= \ # 如果需要转发到外部SMTP服务(比如Gmail),这里填`smtp.gmail.com:587`,不需要则留空 boky/postfix
如果是自定义Postfix镜像,记得修改main.cf配置文件,确保:
inet_interfaces = all:允许外部容器连接Postfix的25端口mynetworks = 应用容器IP/32 或者你的自定义子网:明确允许应用容器的IP进行邮件中继
3. 启动应用容器并加入同一网络
启动你的应用容器时,指定加入刚才创建的mail-relay-network:
docker run -d \ --name my-app-container \ --network mail-relay-network \ # 这里填你的应用镜像和其他启动参数 your-app-image:latest
4. 在应用容器的脚本中调用Postfix中继发邮件
现在你的应用容器可以直接通过Postfix容器的名称postfix-relay(或者它的IP)作为SMTP服务器来发邮件了。举几个常见的脚本例子:
用mail命令发送
# 发送简单文本邮件 echo "这是邮件的正文内容" | mail \ -s "测试邮件主题" \ -r "sender@yourdomain.com" \ # 发件人地址 recipient@example.com \ # 收件人地址 -S smtp=postfix-relay:25 # 指定SMTP服务器为Postfix容器
用sendmail命令发送
sendmail -S postfix-relay:25 recipient@example.com <<EOF From: sender@yourdomain.com To: recipient@example.com Subject: 测试邮件 这是邮件的正文内容,支持多行文本 EOF
排查问题小技巧
如果发邮件失败,可以按以下步骤排查:
- 在应用容器里ping
postfix-relay,看是否能解析到IP(验证网络连通性) - 用
telnet postfix-relay 25测试25端口是否能正常连接 - 查看Postfix容器的日志:
docker logs postfix-relay,看是否有中继被拒绝的错误信息(比如mynetworks配置不正确)
内容的提问来源于stack exchange,提问作者Aurelien




