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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:55:34