如何在bash脚本中为sendmail保留换行符?

时间:2014-02-04 18:29:31

标签: bash echo sendmail

为什么以下内容不会在生成的电子邮件中保留新的换行符?

#!/bin/bash

file="/tmp/ip.txt"
address=$(curl -s http://ipecho.net/plain; echo)
ifconfig=$(ifconfig)

function build_body
{
    echo "----------------------------------------------------------------" > $file
    echo "IP Address: $address (according to http://ipecho.net/plain)" >> $file
    echo "----------------------------------------------------------------" >> $file
    echo >> $file
    echo "Result from ifconfig:" >> $file
    echo >> $file
    echo "$ifconfig" >> $file
    echo >> $file
}

build_body
msg=$(cat $file)
mail="subject:Home Server Status\nfrom:email@example.com\n$msg"
echo $mail | /usr/sbin/sendmail "email2@example.com"

我收到了这个脚本生成的电子邮件,然而,整个身体都在一条线上! /tmp/ip.txt正是我希望电子邮件的样子。

4 个答案:

答案 0 :(得分:8)

我最近碰到了这个。我能够解决它添加' -e'回声的选项。

改变这个:

  

echo $ mail | / usr / sbin / sendmail" email2@example.com"

To This:

  

echo -e" $ mail" | / usr / sbin / sendmail" email2@example.com"

希望这有帮助。

答案 1 :(得分:4)

您可以使用“here documents”(<<END),使函数输出其结果为标准输出。

#!/bin/bash

address=$(curl -s http://ipecho.net/plain; echo)

function build_body
{
cat <<END
----------------------------------------------------------------
IP Address: $address (according to http://ipecho.net/plain) 
----------------------------------------------------------------

Result from ifconfig:

END
ifconfig
echo    
}


( cat <<END; build_body) | /usr/sbin/sendmail -i -- "email2@example.com"
Subject:Home Server Status
From:email@example.com

END

答案 2 :(得分:3)

  1. 使用双引号:echo "$mail" | /usr/bin/sendmail ...
  2. 标题和消息之间不应该是两个\n
  3. 如:

    mail="subject:Home Server Status\nfrom:email@example.com\n\n$msg"
    

答案 3 :(得分:2)

{
    printf "subject:Home Server Status\nfrom:email@example.com\n\n"
    cat "$file"
} | /usr/sbin/sendmail "email2@example.com"

使用echo $mail,文件的内容出现在命令行上,bash使用word扩展处理它们。对于cat "$file",文件名出现在命令行中,但文件的内容不会出现,因此bash是安全的。