100

I am on linux machine and I monitor a process usage. Most of the time I will be away from my system and I have access to internet on my device. So I planned to write a shell-script that can mail me the output of the process.

Is it possible?

If so how to make a shell-script send me mail?

Please provide a snippet to get started.

7 Answers7

155

Yes it works fine and is commonly used:

$ echo "hello world" | mail -s "a subject" someone@somewhere.com
trojanfoe
  • 120,358
  • 21
  • 212
  • 242
31

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. ;)

Oliver Salzburg
  • 21,652
  • 20
  • 93
  • 138
BlackBear
  • 22,411
  • 10
  • 48
  • 86
  • 2
    Stackoverflow should be self contained - it would have taken you the same amount of time to copy/paste the URL of that site and to copy/paste the one-liner @Ashwin asked for. – slhck Jan 11 '11 at 13:59
  • @slhck: Probably the full page is better than one or two lines and there's explained better than I would do. Mine isn't surely the best answer but downvote it is quite unfair since it provides the same information of any other answer. – BlackBear Jan 11 '11 at 14:16
  • This has been a long discussion: http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers - Even if it provides the same information, you could have digested it and cited your source. – slhck Jan 11 '11 at 14:18
  • @slhck: I agree with that, rarely I give only a link. But I thought, "a link is better than nothing", in fact I've never sent email in this way, just wanted to be helpful. ;) – BlackBear Jan 11 '11 at 14:24
  • Fair enough, I just brought it up because the answer to the original question is just a one-liner. Please edit your answer somehow, then I'll upvote again! Interestingly, the link you posted does not even load for me here. – slhck Jan 11 '11 at 14:27
  • 2
    @slhck: edited. Thanks for your comments, there's always room for improvements. ;) – BlackBear Jan 11 '11 at 14:42
  • if "mutt -s 'bla bla' -a /tmp/file target@mail.com" use -c flag in front of target@mail.com – bortunac Sep 24 '14 at 13:41
7

sendmail works for me on the mac (10.6.8)

echo "Hello" | sendmail -f my@email.com my@email.com
zcaudate
  • 13,998
  • 7
  • 64
  • 124
3
#!/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
david
  • 39
  • 1
3
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)

slhck
  • 36,575
  • 28
  • 148
  • 201
  • 1
    Does this work with binary files? I think I've had to use mutt before to do all the binary file encoding in the past. – Marcin Jan 11 '11 at 14:12
  • You mean when trying to send a file as a mail attachment? You're right about this, of course. I meant text files only. – slhck Jan 11 '11 at 14:20
  • Yes! @slhck meant text files only. 'mail' cannot make attachments to user. –  Jan 13 '11 at 11:35
0

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.

Volker Stolz
  • 7,274
  • 1
  • 32
  • 50
0
top -b -n 1 | mail -s "any subject" your_email@domain.com
ajreal
  • 46,720
  • 11
  • 89
  • 119