一、问题现象

前面的邮件系统已经完成了这些功能:

  • Postfix 本地投递正常
  • Dovecot IMAPS 收信正常
  • Roundcube 图形界面可以正常打开
  • 用户可以登录并查看收件箱中的邮件

但在 Roundcube 页面中尝试发送邮件时,系统会提示 SMTP 认证失败,或者提示必须先执行 STARTTLS。
这说明收信链路已经正常,但发信链路还没有打通。

Roundcube 发信并不是自己直接把邮件写进邮箱,而是通过 SMTP 提交给 Postfix。
如果 Postfix 的 587 Submission 端口没有正确启用 TLS 和 SMTP 认证,Roundcube 就只能登录成功,却无法真正把邮件提交出去。


二、修复思路

修复的核心思路很简单:

让 Postfix 的 587 Submission 端口通过 Dovecot 完成 SMTP AUTH 认证。

链路可以理解为:

Roundcube → 587 Submission → TLS → SMTP AUTH → Postfix → Dovecot 认证

因此需要完成三件事:

  1. Dovecot 提供认证 socket 给 Postfix
  2. Postfix 在 587 端口启用 SMTP AUTH
  3. Roundcube 改为使用 587 + TLS + 用户名密码发信

三、配置 Dovecot 认证接口

先编辑 Dovecot 主服务配置:

sudo nano /etc/dovecot/conf.d/10-master.conf

把 service auth 这一段改成下面这样:

service auth {
unix_listener auth-userdb {
mode = 0666
} unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}

这里最关键的是 /var/spool/postfix/private/auth。


它是 Dovecot 暴露给 Postfix 的认证 socket,后面 Postfix 会通过这个接口验证用户名和密码。

接着检查 Dovecot 的认证方式:

sudo nano /etc/dovecot/conf.d/10-auth.conf

确认至少有下面两行:

disable_plaintext_auth = yes
auth_mechanisms = plain login

这表示:

  • 不允许在未加密连接上直接明文认证
  • 允许常见的 PLAIN 和 LOGIN 认证方式

保存后重启 Dovecot:

sudo systemctl restart dovecot
sudo systemctl status dovecot --no-pager
sudo ls -l /var/spool/postfix/private/auth

如果最后一条命令能看到 socket 文件,就说明 Dovecot 认证接口已经准备好了。



四、让 Postfix 使用 Dovecot 做 SMTP 认证

先编辑 Postfix 主配置文件:

sudo nano /etc/postfix/main.cf

在文件末尾加入以下内容:

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_tls_auth_only = yes

这一段的作用是:

  • 指定 Postfix 使用 Dovecot 作为 SASL 认证后端
  • 指定认证 socket 路径
  • 开启 SMTP AUTH
  • 禁止匿名认证
  • 要求认证只能在 TLS 上进行

接着编辑 Submission 服务配置:

sudo nano /etc/postfix/master.cf

submission 这一段改成:

submission inet n       -       y       -       -       smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_tls_auth_only=yes
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

配置完成后检查并重启 Postfix:

sudo postfix check
sudo systemctl restart postfix
sudo systemctl status postfix --no-pager

五、验证 587 端口是否已经支持 AUTH

要确认配置是否真正生效,不能只看服务状态,还要看 587 是否已经对外宣告认证能力。

执行:

openssl s_client -starttls smtp -connect 127.0.0.1:587 -crlf

连接成功后手动输入:

ehlo test
quit

如果返回内容里出现:

250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN

就说明 Postfix 的 SMTP AUTH 已经开启成功。

这一点非常关键。
只要这里能看到 AUTH,就说明 Roundcube 终于有了可以登录发信的 Submission 端口。



六、修改 Roundcube 的发信配置

完成 Postfix 和 Dovecot 的认证链路后,最后一步是把 Roundcube 改成标准发信方式。

编辑 Roundcube 配置文件:

sudo nano /etc/roundcube/config.inc.php

将 SMTP 相关部分改为:

$config['smtp_host'] = 'tls://mail.ad.yxwa.info';
$config['smtp_port'] = 587;
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';

这几项的含义分别是:

smtp_host:指定使用 TLS 连接邮件服务器

smtp_port:指定 587 Submission 端口

smtp_user:使用当前登录用户作为 SMTP 用户名

smtp_pass:使用当前登录用户输入的密码作为 SMTP 密码

修改完成后重载 Apache:

sudo systemctl reload apache2

然后退出当前 Roundcube 页面,重新登录一次。
这样可以避免旧会话继续沿用之前的 SMTP 配置。


七、测试发信是否恢复正常

重新登录 Roundcube 后,用已经存在的本地邮箱账户进行测试。

例如:登录用户:alice 收件人:bob@ad.yxwa.info

然后点击发送。

为了同步观察后端行为,可以在服务器上查看日志:

sudo tail -f /var/log/mail.log

如果发信成功,日志中通常会看到:

  • SMTP 认证成功
  • 邮件进入队列
  • 本地投递完成
  • status=sent

这样就说明 Webmail 的发信链路已经被彻底修复。



八、结果说明

修复完成后,系统达到的状态如下:

Roundcube 可以正常登录

用户可以查看收件箱邮件

Roundcube 可以通过 587 端口发信

Postfix 能通过 Dovecot 完成 SMTP 认证

发信过程经过 TLS 加密

本地测试用户之间可以通过 Webmail 正常互发邮件


九、总结

这个问题的本质,并不是 Roundcube 页面本身有问题,而是 SMTP Submission 链路没有补完整。
收信依赖 IMAP,发信依赖 SMTP,两者必须分别验证。

在这次修复中,最关键的工作只有一句话:

把 Postfix 的 587 Submission 认证交给 Dovecot 来完成。

只要 Dovecot 认证 socket 正确创建,Postfix 正确启用 SASL,Roundcube 再改回标准的 587 + TLS + 用户认证方式,发信功能就可以恢复正常。

至此,终于完成了邮件系统的搭建,做之前没想到这么的确复杂。

此作者没有提供个人介绍。
最后更新于 2026-04-02