如何使用mailx发送zip附件并在邮件正文列出压缩包内文件名
原代码失效原因
原代码存在4个语法和逻辑错误,导致命令无法正常执行:
- 附件参数写法错误:
${zip_final.zip}是Shell读取变量的语法,代码中从未定义名为zip_final.zip的变量,实际文件名是固定字符串,不需要套${}符号。 - 缺失必填参数:
mailx命令末尾必须指定收件人邮箱地址,原代码没有填写收件人,命令无法确认发送目标,会一直挂起等待输入,不会执行发送动作也不会抛出错误。 - here-doc结束标记格式错误:here-doc的结束标记
EOM必须顶格书写,前面不能有缩进空格,否则Shell无法识别输入结束位置,会持续等待用户输入。 - 文件列表输出异常:直接用反引号捕获
unzip -Zl的输出时,如果不给变量加双引号引用,输出内容里的换行会被自动替换为空格,最终邮件正文里的文件列表会挤成一行,可读性极差;同时-Zl参数会输出多余的压缩包属性、统计信息,不是纯文件列表。
可直接运行的修正代码
# 提取压缩包内文件列表,过滤掉unzip输出的头部说明、尾部统计冗余行,只保留文件条目 files_list=$(unzip -l zip_final.zip | sed '1,3d;$d' | sed '$d') # 发送邮件,将下方your_team@example.com替换为实际收件人邮箱,EOM必须顶格写 mailx -a zip_final.zip -s "Files list | Zip file" your_team@example.com << EOM Hi team, sent zip file. Files inside it are: $files_list Thank you. EOM
额外注意事项
- 如果执行时提示
-a参数无效,说明当前系统安装的是精简版mailx,需要替换为支持附件的版本:Debian/Ubuntu执行apt install -y heirloom-mailx,CentOS/RHEL执行yum install -y mailx即可。 - 发送外部公网邮箱前,需要提前在
/etc/mail.rc配置文件中填写SMTP服务器地址、发件人账号、授权码信息,否则邮件会被拒收。 - 如果压缩文件不在当前脚本执行目录,
-a后面要写文件的完整绝对路径,比如/opt/backup/zip_final.zip,避免出现找不到附件的问题。 - 引用
$files_list变量时不要去掉双引号,否则会丢失换行格式,导致文件列表排版错乱。
内容的提问来源于stack exchange,提问作者Venkatesha Prasad S
相关产品推荐
相关产品推荐

