Linux下mailx/mpack无法发送多附件,寻求可行替代方案
Linux下发送带多附件邮件的可行方案
问题分析
你当前的mailx脚本存在两处关键错误:
-d不是指定邮件正文的参数,需通过输入重定向<读取正文文件- 多数
mailx版本中,每个附件都需要单独用-a选项声明,不能将多个附件文件名放在同一个-a后
另外mpack本身不支持多附件,且易出现进程挂起问题,不适合多附件场景。
可行解决方案
方案1:修正mailx脚本
针对你的需求,修正后的脚本如下:
#!/bin/bash fileName1="/tst/test.xls" fileName2="/tst2/test1.csv" mailBodyFile="/tmp/test.tmp" MailTo="xyz@test.com" TodayDate=$(date) recordCount=$(wc -l < "${fileName1}") # 优化写法,避免无用的cat进程 mailSubject="Test ${TodayDate}" if [[ ${recordCount} -gt 1 ]] then echo -e "Test,\n\nTest123" > "${mailBodyFile}" # 每个附件单独用-a选项,通过<重定向读取正文 mailx -s "${mailSubject}" -a "${fileName1}" -a "${fileName2}" "${MailTo}" < "${mailBodyFile}" else echo -e "xyz" > "${mailBodyFile}" fi
注:部分发行版的
mailx为heirloom-mailx,若仍有问题,可尝试添加-S sendmail=/usr/sbin/sendmail参数指定发送后端。
方案2:使用mutt工具
mutt是专业邮件客户端,对多附件支持更稳定,先确保已安装:
# Debian/Ubuntu系统 apt-get install mutt # RHEL/CentOS系统 yum install mutt
修改后的脚本示例:
#!/bin/bash fileName1="/tst/test.xls" fileName2="/tst2/test1.csv" mailBodyFile="/tmp/test.tmp" MailTo="xyz@test.com" TodayDate=$(date) recordCount=$(wc -l < "${fileName1}") mailSubject="Test ${TodayDate}" if [[ ${recordCount} -gt 1 ]] then echo -e "Test,\n\nTest123" > "${mailBodyFile}" # -a 指定附件,-- 分隔收件人与附件参数,< 读取正文 mutt -s "${mailSubject}" -a "${fileName1}" -a "${fileName2}" -- "${MailTo}" < "${mailBodyFile}" else echo -e "xyz" > "${mailBodyFile}" fi
方案3:使用uuencode结合mailx(兼容老旧系统)
如果系统没有mutt且mailx版本过旧,可通过uuencode编码附件后发送:
#!/bin/bash fileName1="/tst/test.xls" fileName2="/tst2/test1.csv" MailTo="xyz@test.com" TodayDate=$(date) recordCount=$(wc -l < "${fileName1}") mailSubject="Test ${TodayDate}" if [[ ${recordCount} -gt 1 ]] then ( echo -e "Test,\n\nTest123" uuencode "${fileName1}" "$(basename ${fileName1})" uuencode "${fileName2}" "$(basename ${fileName2})" ) | mailx -s "${mailSubject}" "${MailTo}" else echo -e "xyz" > /tmp/test.tmp fi
内容的提问来源于stack exchange,提问作者slider
相关产品推荐
相关产品推荐

