2011-01-11 25 views
76

Sono sulla macchina Linux e controllo un utilizzo del processo. La maggior parte delle volte vado via dal mio sistema e ho accesso a Internet sul mio dispositivo. Quindi ho pianificato di scrivere uno script di shell che possa inviarmi l'output del processo.Script di shell per inviare e-mail

È possibile?

Se sì, come fare uno script di shell mandarmi una mail?

Si prega di fornire uno snippet per iniziare.

risposta

114

Sì funziona benissimo ed è comunemente usato:

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

$ echo "ciao mondo" | mail -s "un oggetto" -a "allegato file" [email protected] per l'invio di file –

+3

Dove posso trovare il tutorial preimpostato per questo comando? Per eseguire questo comando, ho bisogno di configurare qualcosa. – Zen

+0

@Zen Bene, è necessario configurare l'MTA locale. – trojanfoe

21

Fondamentalmente c'è un programma per farlo, chiamato "mail". L'oggetto dell'e-mail può essere specificato con un -s e un elenco di indirizzo con -t. È possibile scrivere il testo sul proprio con il comando echo:

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

o scarica da altri file troppo:

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

di posta non supporta l'invio di allegati, ma Mutt fa:

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

Si noti che Mutt è molto più completo della posta. È possibile trovare una spiegazione migliore here

PS: grazie a @slhck che ha sottolineato che la mia risposta precedente era orribile. ;)

+2

StackOverflow dovrebbe essere autonomo - avrebbe preso la stessa quantità di tempo per copiare/incollare l'URL di quel sito e per copiare/incollare il one-liner @Ashwin richiesto. – slhck

+0

@slhck: Probabilmente la pagina intera è migliore di una o due righe e c'è una spiegazione migliore di quella che farei. La mia non è sicuramente la migliore risposta, ma downvote è abbastanza ingiusta dal momento che fornisce le stesse informazioni di qualsiasi altra risposta. – BlackBear

+0

Questa è stata una lunga discussione: http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers - Anche se fornisce le stesse informazioni, avresti potuto digerirlo e citato la tua fonte. – slhck

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

(/file/with/mail/content dovrebbe essere un file di testo in chiaro, non è un file allegato o un'immagine, ecc)

+1

Funziona con i file binari? Penso di aver dovuto usare mutt prima di fare tutte le codifiche di file binari in passato. – Marcin

+0

Vuoi dire quando provi ad inviare un file come allegato? Hai ragione su questo, ovviamente. Intendevo solo i file di testo. – slhck

+0

Sì! @slhck significava solo file di testo. 'mail' non può creare allegati all'utente. –

0

Ebbene, il soluzione più semplice sarebbe ovviamente quello di inviare l'output in mail:

[email protected]lambda:~$ 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' 

immagino sh test.sh & andrà altrettanto bene normalmente.

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