web-dev-qa-db-fra.com

Script Shell pour envoyer un email

Je suis sur une machine Linux et je surveille l'utilisation d'un processus. La plupart du temps, je serai loin de mon système et j'aurai accès à Internet sur mon appareil. J'ai donc prévu d'écrire un script shell capable de m'envoyer par mail la sortie du processus.

C'est possible?

Si oui, comment faire en sorte qu'un script shell m'envoie un courrier?

S'il vous plaît fournir un extrait pour commencer. 

84
user517400

Oui, cela fonctionne bien et est couramment utilisé:

$ echo "hello world" | mail -s "a subject" [email protected]
129
trojanfoe

Fondamentalement, il existe un programme pour accomplir cela, appelé "courrier". L'objet de l'e-mail peut être spécifié avec un -s et une liste d'adresses avec -t. Vous pouvez écrire le texte vous-même avec la commande echo:

echo "This will go into the body of the mail." | mail -s "Hello world" [email protected]

ou l'obtenir à partir d'autres fichiers aussi:

mail -s "Hello world" [email protected] < /home/calvin/application.log

mail ne supporte pas l'envoi de pièces jointes, mais Mutt:

echo "Sending an attachment." | mutt -a file.Zip -s "attachment" [email protected]

Notez que Mutt est beaucoup plus complet que le courrier ... Vous pouvez trouver une meilleure explication ici

PS: merci à @slhck qui a souligné que ma réponse précédente était affreuse. ;)

22
BlackBear

sendmail fonctionne pour moi sur mac (10.6.8)

echo "Hello" | sendmail -f [email protected] [email protected]
7
zcaudate
#!/bin/sh
#set -x
LANG=fr_FR

# ARG
FROM="[email protected]"
TO="[email protected]"
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
3
david
mail -s "Your Subject" [email protected] < /file/with/mail/content

(/file/with/mail/content devrait être un fichier texte, pas une pièce jointe ni une image, etc.)

1
slhck
top -b -n 1 | mail -s "any subject" [email protected]
0
ajreal

Bien sûr, la solution la plus simple serait bien sûr de diriger la sortie dans le courrier:

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'

Je suppose que sh test.sh & fera aussi bien normalement.

0
ShiDoiSi