【Linux】mail命令发送报错“mail: cannot send message: Process exited with a non-zero status”

背景

在文章【Linux】shell脚本+cron定时任务实现“当程序报错时,发送邮件”中,我实现了定时将日志文件发送到邮件的脚本。但是突然有一天脚本报错了(日志文件路径/var/mail/root):

mail: cannot send message: Process exited with a non-zero status

问题排查

进一步去/var/log/mail.log中查看了日志的报错完整信息:

在这里插入图片描述
意思是说我发送的文件太大了。但是我看了一下,文件才8M。我直接满脸问号???我估计就是什么配置让限制了这个传输文件的大小。于是就给chatgpt一顿折磨。

最终发现这个限制是postfix导致的。(这里解释一下,mail命令给他人发送邮件的时候,会用到postfix(一种邮件传输代理软件)。在postfix中,会有各种配置,其中也包括了发送文件的大小配置)

chatgpt说是message_size_limit配置,但是我在postfix的配置文件/etc/postfix/main.cf中没有看到这个配置。然后又搜到个命令postconf,这个命令显示的配置比/etc/postfix/main.cf更完整,其中也有message_size_limit=10240000。我寻思这不是9M左右吗?为什么我8M还发送不了?但是确实找不到其他可能导致这个问题的配置了。于是尝试修改了一下这个字段,在/etc/postfix/main.cf中加了一行message_size_limit=20480000。为了避免可能存在主副配置,导致配置失效的问题,我重新用postconf输出了配置信息,发现确实修改成功了:

【Linux】mail命令发送报错“mail: cannot send message: Process exited with a non-zero status”_第1张图片

然后输入以下命令重启postfix:

sudo service postfix reload

# 或者

sudo systemctl reload postfix

再次用mail命令发送8M的文件,发现能发送了。那说明这个配置确实会限制邮件发送文件的大小。但是暂时还没搞懂,为什么8M明明比message_size_limit=10240000(B)=9.7656(MB)要小,还是会报这个错。

解决方案

既然找到了问题,那么解决方案也比较容易了。可以用到之前学过的logrotate工具(【Linux】logrotate实现“日志文件定时分割“)对日志文件进行分割。这里可以按文件大小对文件进行分割。既然8M也不行的话,那我就设置为7M,即:当文件大小为7M时,对文件进行一次轮转。

总结

  • mail命令日志文件路径:本文提到的有关mail命令的日志文件主要有两个:/var/mail/root/var/log/mail.log。我感觉这两个日志文件的区别主要是,第一个文件中只会告诉你报错了或者没报错。但是第二个文件会详细地告诉你什么原因报错了
  • mail命令给他人发送邮件地流程(来自chatgpt):
    • 使用 mail 命令编写邮件
    • mail 命令将邮件提交给本地的邮件传输代理(MTA),比如postfix、Sendmail
    • 本地的 MTA 接收邮件,并处理进一步的传输
    • MTA 可能使用 SMTP 协议与目标邮件服务器通信,将邮件传递给目标邮件服务器
    • 目标邮件服务器接收邮件,并将其投递到接收者的邮箱
  • postfix配置信息:修改postfix配置信息可以通过修改/etc/postfix/main.cf实现,查看完整的postfix配置信息可以使用postconf命令查看

你可能感兴趣的:(Linux,linux,运维,服务器)