解决sendmail无法监听25端口报告daemon MSP-v4: problem creating SMTP socket问题

问题

大概1周之前,我的一台Debian 11的机器,上面的邮件转发服务无法正常工作了。经过检查,监听25端口的sendmail服务不见了,只剩下我做的邮件验证服务和nginx对外监听的587和465端口。

这个问题该如何解决?

排查

从报错信息入手

首先查看sendmail的服务的报错信息

通过systemctl查看服务状态

似乎是sm-mta服务无法启动,但是为什么是报告MSP-v4无法监听端口呢?
使用netstat -ntlp 查看, 没有其他服务占据25端口,所以应该不是25端口被其他服务占用的问题。

使用搜索引擎搜索相关问题

这次我搜先搜索了下google,真的没有发现什么有效的信息。

从端口配置入手

那还是继续排查下,看一下关于sendmail的配置文件。
经过搜索,sendmail的有效配置文件是/etc/mail/sendmail.cf

从上往下看,有一个写着监听地址的位置引起了我的注意

我看到了关键词MSP-v4,前面一行是MTA-v4,Port=smtp和Port=submission,会不会是这里有问题呢?

使用GPT-4o助理

这次为了确定端口是什么,我选择使用GPT-4o来询问下

O DaemonPortOptions=Family=inet, Name=MTA-v4, Port=smtp, Addr=127.0.0.1
O DaemonPortOptions=Family=inet, Name=MSP-v4, Port=submission, M=Ea, Addr=127.0.0.1

sendmail的这两个配置项会冲突么,会导致服务无法启动么

回复

您提到的 sendmail 配置项 DaemonPortOptions 中的两个条目:

O DaemonPortOptions=Family=inet, Name=MTA-v4, Port=smtp, > Addr=127.0.0.1
O DaemonPortOptions=Family=inet, Name=MSP-v4, Port=submission, M=Ea, Addr=127.0.0.1

配置项说明

• DaemonPortOptions 用于定义 sendmail 的侦听端口及其相关属性。
• 这两个配置项分别用于以下目的:
1. MTA 端口 (smtp):
• Name=MTA-v4: 指定该端口为 MTA(Mail Transfer Agent),即邮件传输代理。
• Port=smtp: 指定端口为 SMTP(一般是 25 端口)。
• Addr=127.0.0.1: 指定地址为仅限本地访问。
2. MSP 端口 (submission):
• Name=MSP-v4: 指定该端口为 MSP(Mail Submission Program),用于邮件提交。
• Port=submission: 一般为 587 或 465 端口(或根据配置设定的其他端口)。
• Addr=127.0.0.1: 同样指定为本地访问。

冲突与服务启动

这两个配置本质上是定义了两个不同的服务端口。以下是几个关键点:

  1. 不同功能: smtp 端口主要用于邮件的发送和接收,而 submission 端口用于客户端发送邮件(提交邮件)。因此,二者的功能是不同的。
  2. 不同端口:如果 submission 端口是 587(或其他未被使用的端口),与 smtp(25 端口)不会冲突。确保这两个端口没有被其他服务占用。
  3. 服务启动:在没有其他配置问题或端口占用(冲突)的情况下,这两个端口应当可以正常启动,二者不会互相冲突。

检查与建议

• 端口占用:使用命令行工具(如 netstat 或 ss)检查端口是否已被其他服务占用。例如:
netstat -tuln | grep :25
netstat -tuln | grep :587

• 错误日志:如果 sendmail 无法启动,检查系统日志或 sendmail 的错误日志,通常能够提供更多的错误信息。
• 配置文件:确保没有其他的 DaemonPortOptions 配置项可能导致冲突。

综合以上分析,这两个配置项在正常情况下不会导致服务冲突或无法启动。

回答中包含了submission默认是587,MSP服务是用于接收邮件提交的服务,这个部分原来我是交给nginx来承担的,为什么这个部分也被sendmail接管了呢?

尝试解决

到这里基本就清楚了。我把MSP这一行直接加#注释掉了,然后重启服务

等待了一会儿,再次使用netstat -ntlp | grep 25
发现确实看到有监听了。

然后尝试发了一封邮件,也能正常收到了。

至此问题解决。

后记

那这个问题是怎么造成的呢?

回想了一下,似乎上周我apt更新了所有服务,其中似乎包含sendmail的软件包,然后默认配置文件也一起更新了,于是就不能启动了。。。

如此说来,问题就在于sendmail的软件包的默认配置文件默认增加了MSP的配置文件,多监听了587端口。然后如此一来,587被nginx占用,于是sendmail就把自己的服务结束了,于是连25端口也不监听了。

感觉这种配置文件的更新实在是有点太坑了。。。

发表评论

为防机器,验证码请直接输入4个数字1

*