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
相关产品推荐
相关产品推荐

