Roundcube提示SMTP错误,500认证失败

目录

从你提供的 Stalwart 日志来看,现在的现象是:

Roundcube 连接了服务器,打了个招呼 (EHLO),然后立即退出了 (QUIT),根本没有尝试发送用户名和密码 (AUTH)。

问题分析

日志显示:

  1. SMTP EHLO command: 服务器收到了 EHLO,说明连接建立成功且是明文的(如果 Roundcube 此时强制加密,服务器是无法识别 EHLO 文本命令的)。

  2. SMTP QUIT command: Roundcube 收到服务器的回复后,主动断开了连接。

原因判定:

Roundcube 看到服务器支持 STARTTLS(587 端口的标准流程),准备进行加密升级,但加密握手失败了。因为在 Docker 内部网络中,主机名不匹配(证书是给域名的,你用的是 stalwart 容器名),Roundcube 觉得连接不安全,所以直接“挂电话”了。

即使我们在上一步设置了“忽略证书错误”,但如果协议前缀不对,依然会导致握手卡住或失败。


解决方案

请尝试以下两种方案之一(推荐方案 A)。

方案 A:使用隐式 SSL (端口 465) —— 最推荐

端口 465 是“即插即用”的加密模式,不需要“先明文再升级”的复杂过程,在容器间通信中最稳定。

修改 config/config.inc.php

// 1. 将前缀改为 ssl://,端口改为 465
$config['smtp_host'] = 'ssl://stalwart:465';

// 2. 保持之前添加的证书忽略设置
$config['smtp_conn_options'] = array(
    'ssl' => array(
        'verify_peer'       => false,
        'verify_peer_name'  => false,
        'allow_self_signed' => true
    ),
);

// 3. 强制认证方式 (保持这个,防止 Invalid challenge)
$config['smtp_auth_type'] = 'LOGIN';

注意:请确保 Stalwart 的 Docker 容器开放了 465 端口(在 docker-compose.yml 中检查 ports 映射或内部暴露)。


方案 B:修正 587 端口配置

如果你必须使用 587 端口,Roundcube 对 587 的配置有时候不需要 tls:// 前缀。它会先用明文连接,检测到服务器支持 STARTTLS 后自动升级。加了前缀反而可能导致逻辑冲突。

修改 config/config.inc.php

// 1. 去掉 tls:// 前缀,直接写主机名和端口
$config['smtp_host'] = 'stalwart:587';

// 2. 依然需要证书忽略设置(因为自动升级 STARTTLS 也会校验名为 stalwart 的证书)
$config['smtp_conn_options'] = array(
    'ssl' => array(
        'verify_peer'       => false,
        'verify_peer_name'  => false,
        'allow_self_signed' => true
    ),
);

// 3. 强制认证方式
$config['smtp_auth_type'] = 'LOGIN';

总结

你现在的日志表明网络是通的,只是加密协商没谈拢。

请优先尝试 方案 A (ssl://stalwart:465),这通常能直接绕过 587 端口复杂的 STARTTLS 握手问题。