使用Slim框架的PHP脚本无法向Mailhog发送邮件求助
解决思路
1. 核心问题:PHP容器内未安装mhsendmail
你的PHP配置指定了sendmail_path="mhsendmail --smtp-addr=mailhog:1025",但当前Dockerfile未安装mhsendmail工具,容器内找不到该命令,导致mail()函数执行失败。
解决方法:修改Dockerfile添加mhsendmail安装步骤
在Dockerfile中RUN groupadd -g 1000 www之前插入以下代码:
# 安装mhsendmail RUN wget https://github.com/mailhog/mhsendmail/releases/download/v0.2.0/mhsendmail_linux_amd64 -O /usr/bin/mhsendmail \ && chmod +x /usr/bin/mhsendmail
重新构建并启动PHP容器:
docker-compose build php docker-compose up -d php
2. 验证mhsendmail安装状态
进入PHP容器执行命令,确认工具存在:
docker exec -it php which mhsendmail
返回/usr/bin/mhsendmail即为安装成功。
3. 测试容器间网络连通性
确认PHP容器能访问Mailhog服务:
docker exec -it php ping mailhog -c 3
能收到响应说明网络正常;若不通,检查docker-compose的app-network配置(你的配置中两个服务已加入该网络,理论无问题)。
4. 手动测试mhsendmail发送邮件
在PHP容器内执行以下命令,直接测试邮件发送:
echo "测试邮件内容" | mhsendmail --smtp-addr=mailhog:1025 test@example.com
打开Mailhog Web界面(http://localhost:8025),查看是否收到邮件。若成功,说明mhsendmail与Mailhog连接正常。
5. 查看PHP错误日志定位具体问题
若上述步骤均正常,查看PHP错误日志获取失败原因:
- 进入PHP容器查看FPM日志:
docker exec -it php tail -f /var/log/php-fpm.log
- 或在PHP脚本中添加错误输出:
error_reporting(E_ALL); ini_set('display_errors', 1); echo "sendmail_path: " . ini_get('sendmail_path') . "<br>"; $to = 'recipients@email-address.com'; $subject = 'Hello from Ubuntu!'; $message = 'This is a Mailhog test'; $headers = "From: your@email-address.com\r\n"; if (mail($to, $subject, $message, $headers)) { echo "SUCCESS"; } else { echo "ERROR"; echo "<br>Error info: " . error_get_last()['message']; }
6. 无关操作说明
你在本地安装sendmail的操作无效,PHP运行在Docker容器内,容器环境独立于本地系统,无需在本地安装sendmail。
内容的提问来源于stack exchange,提问作者cookie
相关产品推荐
相关产品推荐

