Shell脚本无法给多收件人发送带附件邮件问题排查请求
问题排查:Shell脚本批量发邮件失败及附件添加问题
问题描述
- 脚本可正常生成收件人列表文件,但无法发送邮件
- 需要为邮件添加附件
用户提供的脚本片段
if [ -s dataStnd_viol_addr.log ]; then if [ ${update_instance} == "BPROD" ] then ##########echo | mailx -s "***** Data Standard Violation - Address *****" -S "from=noreply@gsu.edu" -a "dataStnd_viol_addr.log" ${BPROD_LIST}; while read dest; do echo | mailx -s "***** Data Standard Violation - Address *****" -S "from=noreply@gsu.edu" $dest < $REPORT/dataStnd_viol_addr.log done < $REPORT/Email_PRODlist.lst elif [ ${update_instance} == "B8QA" ] then while read dest1; do echo | mailx -s "***** Data Standard Violation - Address *****" -S "from=noreply@gsu.edu" $dest1 < $REPORT/dataStnd_viol_addr.log done < $REPORT/Email_QAlist.lst else while read dest2; do echo | mailx -s "***** Data Standard Violation - Address *****" -S "from=noreply@gsu.edu" $dest2 < $REPORT/dataStnd_viol_addr.log done < $REPORT/Email_DEVlist.lst fi fi cd ${working_dir} working_dir=""; export working_dir working_sql_dir=""; export working_sql_dir update_instance=""; export update_instance days_back=""; export days_back
问题分析与修复方案
1. 核心错误点
- mailx参数格式错误:
-S选项的正确格式为-S from="noreply@gsu.edu",原脚本用引号包裹整个from=xxx会导致参数解析失败,mailx无法识别发件人配置。 - echo与输入重定向冲突:
echo | mailx ... < 文件会让mailx优先读取echo的空内容,忽略后续的文件正文,需直接移除echo |。 - 附件参数缺失:循环发送的邮件未添加
-a参数,无法携带指定附件。 - 变量未加引号:未用双引号包裹变量,若收件人地址或路径含空格会导致命令执行失败。
2. 修复后的脚本
if [ -s "dataStnd_viol_addr.log" ]; then # 统一定义邮件配置,减少重复代码 SUBJECT="***** Data Standard Violation - Address *****" FROM_ADDR="noreply@gsu.edu" ATTACH_FILE="${REPORT}/dataStnd_viol_addr.log" BODY_FILE="${REPORT}/dataStnd_viol_addr.log" if [ "${update_instance}" = "BPROD" ]; then while read -r dest; do # 跳过空行,避免无效发送 [ -z "$dest" ] && continue mailx -s "$SUBJECT" -S from="$FROM_ADDR" -a "$ATTACH_FILE" "$dest" < "$BODY_FILE" # 可选:添加发送状态日志 # [ $? -eq 0 ] && echo "邮件发送成功至 $dest" || echo "邮件发送失败至 $dest" done < "${REPORT}/Email_PRODlist.lst" elif [ "${update_instance}" = "B8QA" ]; then while read -r dest1; do [ -z "$dest1" ] && continue mailx -s "$SUBJECT" -S from="$FROM_ADDR" -a "$ATTACH_FILE" "$dest1" < "$BODY_FILE" done < "${REPORT}/Email_QAlist.lst" else while read -r dest2; do [ -z "$dest2" ] && continue mailx -s "$SUBJECT" -S from="$FROM_ADDR" -a "$ATTACH_FILE" "$dest2" < "$BODY_FILE" done < "${REPORT}/Email_DEVlist.lst" fi fi cd "${working_dir}" # 清空变量(建议放在脚本末尾,避免提前清空影响逻辑) working_dir=""; export working_dir working_sql_dir=""; export working_sql_dir update_instance=""; export update_instance days_back=""; export days_back
3. 额外验证建议
- 先手动测试mailx基础功能:执行
echo "测试内容" | mailx -s "测试邮件" -S from="noreply@gsu.edu" your-test-email@example.com,确认服务器mailx配置正常。 - 检查收件人列表文件:确保文件无特殊字符、空行已处理,每行仅一个有效邮箱地址。
内容的提问来源于stack exchange,提问作者Naveed
相关产品推荐
相关产品推荐

