You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 16.04中Mutt/mail命令发带附件邮件失败问题求助

解决Ubuntu 16.04邮件脚本失效问题

从Ubuntu 10.04升级到16.04后,不少命令行工具的语法和默认行为都发生了变化,我帮你逐个排查这两个脚本的问题:

一、Mutt脚本无法运行的问题

你这段脚本存在几个明显的语法和逻辑错误,导致在新服务器上无法正常执行:

  1. awk命令未闭合:mail=$(awk -F ',' -v var="$text" '$1==var {print $2,$3}这行末尾缺少闭合的),脚本解析到此处会直接报错中断。
  2. 临时文件赋值无效:mail_body_file=$(sed -n '9,$p' mail.txt > va.null)完全没必要——>会把sed的输出写入va.null,而$(...)捕获的是命令的标准输出,这里标准输出被重定向后,mail_body_file会变成空变量,直接执行sed -n '9,$p' mail.txt > va.null即可,或者更高效地把邮件正文存到变量里,省去临时文件。
  3. 变量未定义/匹配问题:脚本里没看到$text的赋值,这会导致awk找不到匹配项,mail变量为空,Mutt自然无法发送邮件。另外print $2,$3如果输出的是两个字段(比如姓名+邮箱),会导致收件人地址无效。

修正后的Mutt脚本

# 先给text变量赋值,比如匹配CSV里的目标关键字
text="target_keyword"
# 直接提取邮件正文到变量,省去临时文件
mail_body=$(sed -n '9,$p' mail.txt)

for fullname in HOTFOLDER/*.xlsx; do
    filename="${fullname##*/}"
    # 修复awk的括号闭合,只提取邮箱字段(根据你的CSV格式调整$2或$3)
    mail=$(awk -F ',' -v var="$text" '$1==var {print $3}' your_data.csv)
    
    # 检查收件人邮箱是否有效,避免无效发送
    if [ -n "$mail" ]; then
        mutt -s "Subject" -a "$fullname" -- "$mail" <<< "$mail_body"
    fi
done

二、mail命令在Ubuntu 16.04无附件的问题

Ubuntu 10.04默认的mail是heirloom-mailx,而16.04换成了bsd-mailx,两者的附件参数规则不同:旧版本用-a添加附件,新版本的-a是用来设置邮件头的,添加附件需要改用-A参数。

修正后的mail脚本(如果坚持使用mail)

text="target_keyword"
mail_body=$(sed -n '9,$p' mail.txt)

for fullname in HOTFOLDER/*.xlsx; do
    filename="${fullname##*/}"
    mail=$(awk -F ',' -v var="$text" '$1==var {print $3}' your_data.csv)
    
    if [ -n "$mail" ]; then
        # 用-A参数添加附件,适配bsd-mailx的规则
        echo "$mail_body" | mail -s "Subject" -A "$fullname" -- "$mail"
    fi
done

不过更稳妥的方案是直接用Mutt,毕竟你在终端里直接执行Mutt命令是正常的,Mutt的参数在不同Ubuntu版本中一致性更高,不容易出现兼容性问题。

内容的提问来源于stack exchange,提问作者pasaico

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:29:19