M1 Mac下PHP与Docker部署的MailHog集成失败求助
解决方案:M1 Mac 本地PHP 对接 Docker MailHog 邮件拦截问题
1. 确认Docker MailHog端口映射正确
先确保MailHog容器的SMTP端口(1025)已正确映射到本地主机:
- 停止现有MailHog容器(如果运行):
docker stop mailhog && docker rm mailhog - 重新启动容器,明确映射端口:
docker run -d --name mailhog -p 127.0.0.1:1025:1025 -p 127.0.0.1:8025:8025 mailhog/mailhog - 测试SMTP端口连通性:
输出显示nc -zv localhost 1025succeeded!则端口正常。
2. 配置PHP直接对接MailHog SMTP
不需要依赖系统sendmail或Postfix,直接让PHP把邮件发去MailHog的SMTP服务:
- 编辑你的PHP配置文件
/opt/homebrew/etc/php/7.4/php.ini,修改以下参数:# 注释掉原有的sendmail_path,或设为空 ; sendmail_path = "/usr/sbin/sendmail -t -i" sendmail_path = "" # 配置SMTP参数指向MailHog SMTP = localhost smtp_port = 1025 - 重启PHP-FPM服务:
brew services restart php@7.4
3. (可选)如果依赖Postfix转发
如果你需要保留Postfix作为邮件中转,配置Postfix将所有邮件转发到MailHog:
- 编辑Postfix配置文件
/etc/postfix/main.cf,添加/修改:relayhost = [localhost]:1025 - 重启Postfix:
sudo postfix reload - 此时PHP的
sendmail_path可以保留默认值,Postfix会自动将邮件转发到MailHog。
4. 测试邮件发送
创建最小测试脚本test.php:
<?php $to = 'test@example.local'; $subject = 'MailHog Test'; $message = 'This is a test email for MailHog'; $headers = 'From: dev@example.local' . "\r\n"; $result = mail($to, $subject, $message, $headers); echo $result ? '邮件发送成功,请查看MailHog界面' : '邮件发送失败'; ?>
访问该脚本后,打开http://localhost:8025检查是否收到邮件。
5. 排查日志定位问题
- 查看MailHog容器日志,确认是否接收到请求:
docker logs mailhog - 查看PHP-FPM日志,排查发送错误:
tail -f /opt/homebrew/var/log/php-fpm.log - 若使用Postfix,查看Postfix日志:
tail -f /var/log/mail.log
关于mhsendmail的说明
Docker部署的MailHog不需要本地安装mhsendmail,只要确保PHP能将邮件投递到MailHog的1025 SMTP端口即可,mhsendmail是替代系统sendmail的轻量工具,仅在你不想用系统sendmail/Postfix时才需要安装。
内容的提问来源于stack exchange,提问作者Tomas Baranauskas
相关产品推荐
相关产品推荐

