Shell 脚本发送电子邮件

我在 linux 机器上,我监视进程的使用情况。大多数时候,我将远离我的系统,我可以访问我的设备上的互联网。因此,我计划编写一个 shell 脚本,它可以将进程的输出邮件给我。

有可能吗?

如果是这样,如何让一个 shell 脚本发送我的邮件?

请提供一个片段来开始。

327401 次浏览

Basically there's a program to accomplish that, called "mail". The subject of the email can be specified with a -s and a list of address with -t. You can write the text on your own with the echo command:

echo "This will go into the body of the mail." | mail -s "Hello world" you@youremail.com

or get it from other files too:

mail -s "Hello world" you@youremailid.com < /home/calvin/application.log

mail doesn't support the sending of attachments, but Mutt does:

echo "Sending an attachment." | mutt -a file.zip -s "attachment" target@email.com

Note that Mutt's much more complete than mail. You can find better explanation here

PS: thanks to @slhck who pointed out that my previous answer was awful. ;)

Yes it works fine and is commonly used:

$ echo "hello world" | mail -s "a subject" someone@somewhere.com
mail -s "Your Subject" your@email.com < /file/with/mail/content

(/file/with/mail/content should be a plaintext file, not a file attachment or an image, etc)

Well, the easiest solution would of course be to pipe the output into mail:

vs@lambda:~$ cat test.sh
sleep 3 && echo test | mail -s test your@address
vs@lambda:~$ nohup sh test.sh
nohup: ignoring input and appending output to `nohup.out'

I guess sh test.sh & will do just as fine normally.

top -b -n 1 | mail -s "any subject" your_email@domain.com

sendmail works for me on the mac (10.6.8)

echo "Hello" | sendmail -f my@email.com my@email.com
#!/bin/sh
#set -x
LANG=fr_FR


# ARG
FROM="foo@bar.com"
TO="foo@bar.com"
SUBJECT="test é"
MSG="BODY éé"
FILES="fic1.pdf fic2.pdf"


# http://fr.wikipedia.org/wiki/Multipurpose_Internet_Mail_Extensions
SUB_CHARSET=$(echo ${SUBJECT} | file -bi - | cut -d"=" -f2)
SUB_B64=$(echo ${SUBJECT} | uuencode --base64 - | tail -n+2 | head -n+1)


NB_FILES=$(echo ${FILES} | wc -w)
NB=0
cat <<EOF | /usr/sbin/sendmail -t
From: ${FROM}
To: ${TO}
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=frontier
Subject: =?${SUB_CHARSET}?B?${SUB_B64}?=


--frontier
Content-Type: $(echo ${MSG} | file -bi -)
Content-Transfer-Encoding: 7bit


${MSG}
$(test $NB_FILES -eq 0 && echo "--frontier--" || echo "--frontier")
$(for file in ${FILES} ; do
let NB=${NB}+1
FILE_NAME="$(basename $file)"
echo "Content-Type: $(file -bi $file); name=\"${FILE_NAME}\""
echo "Content-Transfer-Encoding: base64"
echo "Content-Disposition: attachment; filename=\"${FILE_NAME}\""
#echo ""
uuencode --base64 ${file} ${FILE_NAME}
test ${NB} -eq ${NB_FILES} && echo "--frontier--" || echo
"--frontier"
done)
EOF