宝塔邮件服务器第三方应用无法连接

前言

闲来无事,搭建了一个邮局玩,根据官方教程配置的都很好,在宝塔界面收发邮件也一切正常

image-20250220012356574
image-20250220012356574

当我想尝试使用第三方应用来连接协议时,问题出现了

我配置好邮件账号,密码,imap地址,还有端口号时,缺发现程序返回这个报错

2025-02-20 00:52:35,949 - INFO - 开始检查所有邮箱...
2025-02-20 00:52:35,949 - INFO - 检查邮箱: [email protected]
2025-02-20 00:52:37,115 - ERROR - 无法连接到邮箱 [email protected]: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)
2025-02-20 00:52:37,116 - INFO - 等待下一次检查...

提示ssl证书的错误,但是我明明配置好证书了,非常的奇怪

image-20250220012639433
image-20250220012639433

百思不得其解的我,开始无限的谷歌,百度,想要从搜索引擎中找到答案

但是我发现这类文章非常少,而且大多数只存在于宝塔社区

搜来搜去就那几个文章,但是官方人员也并没有解决这个问题

他们遇到的问题时,使用foxmail可以收发邮件,但是使用代码来调试就报错了

image-20250220012839428
image-20250220012839428

image-20250220012857641
image-20250220012857641

这下我没办法了,有这个问题,而且一直都有

我只能把报错发给ai,让ai分析一下了

image-20250220012940252
image-20250220012940252

ai就一直说我缺少证书链,但是没给我解决方案,我明明有ssl证书,十分的奇怪

不死心的我,又用代码进行了一次连接,然后查看了邮件服务器的log

2025-02-19T17:03:40.751466+00:00 it-pom-4yxh53 dovecot: imap-login: Disconnected: Connection closed: SSL_accept() failed: error:0A000418:SSL routines::tlsv1 alert unknown ca: SSL alert number 48 (no auth attempts in 0 secs): user=<>, rip=, lip=, TLS handshaking: SSL_accept() failed: error:0A000418:SSL routines::tlsv1 alert unknown ca: SSL alert number 48, session=<1gY8vYEuI/7ehcqM>

ai给我分析的还是缺少证书链,然后我根据ai的提示进行了下面的操作

使用openssl命令测试IMAP服务的SSL/TLS配置:

openssl s_client -connect mail.qaq.al:993 -showcerts

我把返回的内容发给了ai,说我证书缺少中间证书

image-20250220013304219
image-20250220013304219

然后我去let官网下载了中间证书然后加到了宝塔邮件服务器的ssl中

image-20250220013357337
image-20250220013357337

这时候代码的报错变了

无法连接到邮箱 [email protected]: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'mail.qaq.al'. (_ssl.c:997)

说我的证书主机名不匹配导致的报错

那这下破案了,就是宝塔根据cloud flare自动申请的ssl证书有问题

他申请的是根域证书,不是带前缀的证书!!

解决方案

本来打算是写脚本定时替换的,因为宝塔自动申请的证书有问题

但是我发现,只要再重新添加一个跟邮件域名一样的domain,就可以修复这个bug

例如:

我的a记录是 mail.qaq.al

image-20250220013731359
image-20250220013731359

我的邮件服务域名也是这个

image-20250220013822585
image-20250220013822585

我只需要再添加一个跟我邮件服务域名一样的记录即可,我们的目的不是为了用这个新加的记录,而是使用这个新记录去申请ssl证书

image-20250220013931483
image-20250220013931483

添加成功之后,我们给这个记录申请一个ssl证书

image-20250220014013650
image-20250220014013650

申请成功之后,我们原来的qaq.al 也就变成只有mail.qaq.al这个选项了,然后我们再重新申请一次即可

代码就可以正常调试邮箱了

image-20250220014127467
image-20250220014127467