Docker部署Mailcow后SMTP无法连接PHP:问题排查求助
Docker部署Mailcow后SMTP连接异常排查
问题描述
通过Docker部署Mailcow邮件服务器,已配置DNS记录,服务器Nginx、Docker运行正常,但PHP连接SMTP时出现长时间等待或无法连接的情况。
已做测试
本地telnet测试
执行命令:
telnet 127.0.0.1 587
返回结果:
Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. 220 mail.domain.com ESMTP Postcow
外部IP telnet测试
执行命令:
telnet 1xx.xxx.x5x.x0x 587
返回结果:
Trying xxx.xxx.xx.xx... Connected to xxx.xx.xxx.xx. Escape character is '^]'. 220 mail.domain.com ESMTP Postcow
当前Nginx配置
server { listen 80; listen [::]:80; server_name mail.domain.com location / { # auth_basic "Restricted Content"; # auth_basic_user_file /etc/nginx/passwords/.htpasswd; proxy_pass http://1xx.xxx.xx.xx:8080/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_cache_bypass $http_upgrade; } }
Cloudflare已配置对应DNS记录。
排查方向及解决方案
Cloudflare代理模式问题
若mail.domain.com的DNS记录设置为橙色云(代理模式),Cloudflare默认不会转发SMTP端口(587、465、25)的流量,会导致外部通过域名连接SMTP时被阻断。- 解决:将
mail.domain.com的DNS记录改为灰色云(仅DNS解析,不代理),确保SMTP流量直接指向服务器IP。
- 解决:将
PHP连接配置错误
检查PHP代码中的SMTP配置:- 确认使用
mail.domain.com作为SMTP服务器地址,而非服务器IP(若域名被Cloudflare代理,IP访问可能正常但域名访问被拦截); - 确认端口为587,且开启了STARTTLS加密(Mailcow的587端口通常需要此配置);
- 检查认证信息是否正确(用户名应为完整邮箱地址,密码对应邮箱的登录密码)。
- 确认使用
Mailcow容器端口映射问题
检查Docker容器的端口映射,确保587端口已正确映射到主机:
执行命令查看端口映射:docker ps | grep postfix确认输出中包含
0.0.0.0:587->587/tcp或:::587->587/tcp,若映射异常,重启Mailcow服务:cd /path/to/mailcow-dockerized docker-compose down docker-compose up -d防火墙/安全组规则
虽然外部telnet能连接,但需确认服务器防火墙(如ufw、iptables)和云服务商安全组是否允许587端口的双向流量,尤其是出站流量(Mailcow发送邮件需要出站端口25、587等)。Nginx配置说明
当前Nginx配置仅代理80端口的Web管理界面,和SMTP服务无关,无需修改此配置解决SMTP连接问题。
内容的提问来源于stack exchange,提问作者Tural Rzaxanov
相关产品推荐
相关产品推荐

