2011-01-11 2 views
76

Ich bin auf Linux-Rechner und ich überwache eine Prozessverwendung. Die meiste Zeit werde ich von meinem System weg sein und ich habe Zugang zu Internet auf meinem Gerät. Also plante ich, ein Shell-Skript zu schreiben, das mir die Ausgabe des Prozesses mailen kann.Shell-Skript zum Senden von E-Mails

Ist es möglich?

Wenn ja, wie schreibe ich mir ein Shell-Skript?

Bitte geben Sie ein Snippet ein, um loszulegen.

Antwort

114

Ja, es funktioniert gut und häufig verwendet wird:

$ echo "hello world" | mail -s "a subject" [email protected] 
+23

$ echo "Hallo Welt" | mail -s "ein Betreff" -eine "Anhangsdatei" [email protected] zum Senden von Dateien –

+3

Wo finde ich das voreingestellte Lernprogramm für diesen Befehl? Um diesen Befehl auszuführen, muss ich etwas konfigurieren. – Zen

+0

@Zen Nun, Sie müssen Ihren lokalen MTA konfiguriert haben. – trojanfoe

21

Grundsätzlich gibt es ein Programm, das "Mail" genannt wird. Der Betreff der E-Mail kann mit einem -s und einer Adressliste mit -t angegeben werden. Sie können den Text auf eigene Faust mit dem Echo-Befehl schreiben:

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

oder es aus anderen Dateien erhalten zu:

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

Mail nicht das Senden von Anhängen nicht unterstützt, aber Mutt tut:

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

Beachten Sie, dass Mutt ist viel vollständiger als Mail. Sie können eine bessere Erklärung finden here

PS: Danke an @slhck, die darauf hingewiesen, dass meine vorherige Antwort schrecklich war. ;)

+2

Stackoverflow selbst enthalten sollte - es gibt Ihnen die gleiche Menge an Zeit genommen haben, würde die URL zu kopieren/einfügen von dieser Seite und zum Kopieren/Einfügen des One-Liner @Ashwin gefragt. – slhck

+0

@slhck: Wahrscheinlich ist die ganze Seite besser als ein oder zwei Zeilen und es wird besser erklärt, als ich es tun würde. Meins ist sicherlich nicht die beste Antwort, aber es ist ziemlich ungerecht, da es die gleiche Information von jeder anderen Antwort zur Verfügung stellt. – BlackBear

+0

Dies war eine lange Diskussion: http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers- Auch wenn es die gleichen Informationen zur Verfügung stellt, Du hättest es verdauen und deine Quelle zitieren können. – slhck

1
mail -s "Your Subject" [email protected] < /file/with/mail/content 

(/file/with/mail/content sollte eine Klartextdatei, kein Dateianhang oder ein Bild sein, usw.)

+1

Funktioniert das mit Binärdateien? Ich denke, ich musste früher schon mal mit mutt arbeiten, um die ganze binäre Dateicodierung in der Vergangenheit zu machen. – Marcin

+0

Sie meinen, wenn Sie versuchen, eine Datei als Mail-Anhang zu senden? Damit hast du natürlich Recht. Ich meinte nur Textdateien. – slhck

+0

Ja! @slhck bedeutete nur Textdateien. 'mail' kann keine Anhänge an den Benutzer senden. –

0

Nun, die einfachste Lösung wäre Rohr natürlich die Ausgabe in mail:

[email protected]:~$ cat test.sh 
sleep 3 && echo test | mail -s test [email protected] 
[email protected]:~$ nohup sh test.sh 
nohup: ignoring input and appending output to `nohup.out' 

Ierraten 210 wird normalerweise genauso gut sein.

3
#!/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