Ubuntu 16.04中Mutt/mail命令发带附件邮件失败问题求助
解决Ubuntu 16.04邮件脚本失效问题
从Ubuntu 10.04升级到16.04后,不少命令行工具的语法和默认行为都发生了变化,我帮你逐个排查这两个脚本的问题:
一、Mutt脚本无法运行的问题
你这段脚本存在几个明显的语法和逻辑错误,导致在新服务器上无法正常执行:
- awk命令未闭合:
mail=$(awk -F ',' -v var="$text" '$1==var {print $2,$3}这行末尾缺少闭合的),脚本解析到此处会直接报错中断。 - 临时文件赋值无效:
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即可,或者更高效地把邮件正文存到变量里,省去临时文件。 - 变量未定义/匹配问题:脚本里没看到
$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
相关产品推荐
相关产品推荐

