You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:07:05