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

Linux Bash发送邮件时如何保留换行符?

解决邮件中保留换行符的问题

你的问题出在两个核心点:一是HTML渲染规则会把纯文本换行视为空格,二是邮件缺少明确的内容类型声明,导致客户端解析异常。以下是两种可行的解决方法:

方法一:用<pre>标签保留原始格式

<pre>标签会完全保留文本的换行、空格等原始排版,适合需要原样展示内容的场景。修改后的函数如下:

send_mail(){
    SUBJECT="test"

    cat << EOF | /usr/sbin/sendmail -t
    From: test@gmail.com
    To: $TO_LIST
    Subject: $SUBJECT
    Mime-Version: 1.0
    Content-Type: text/html; charset=utf-8
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <BODY>
        <pre>
$result
        </pre>
    </BODY>
    </HTML>
EOF
}

方法二:将换行替换为HTML换行标签<br>

如果不需要等宽字体的排版,可以把变量中的换行符替换成HTML的<br>标签,让邮件按正常段落换行:

send_mail(){
    SUBJECT="test"
    # 把每行末尾替换为<br>标签
    formatted_result=$(echo "$result" | sed 's/$/<br>/')

    cat << EOF | /usr/sbin/sendmail -t
    From: test@gmail.com
    To: $TO_LIST
    Subject: $SUBJECT
    Mime-Version: 1.0
    Content-Type: text/html; charset=utf-8
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <BODY>
        $formatted_result
    </BODY>
    </HTML>
EOF
}

关键注意点:

  • 必须添加Content-Type: text/html; charset=utf-8头,明确告诉邮件客户端这是HTML格式邮件,否则标签无法被正确解析。
  • 移除了sendmail命令后的${TO_LIST},因为-t参数会自动从邮件头的To字段读取收件人,重复传递会导致异常。
  • Here-doc中直接使用$result即可展开变量,不需要额外的echo命令。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:35:26