Come posso inviare un file come allegato e-mail utilizzando la riga di comando di Linux?
-
08-06-2019 - |
Domanda
Ho creato uno script che viene eseguito ogni notte sul mio server Linux che utilizza mysqldump
per eseguire il backup di ciascuno dei miei database MySQL in file .sql e impacchettarli insieme come file .tar compresso.Il prossimo passo che voglio compiere è inviare il file tar tramite e-mail a un server di posta remoto per tenerlo al sicuro.Sono stato in grado di inviare un'e-mail allo script non elaborato nel corpo reindirizzando il file di testo di backup a mailx
così:
$ cat mysqldbbackup.sql | mailx backup@email.com
cat
fa eco al testo del file di backup che viene convogliato nel file mailx
programma con l'indirizzo email del destinatario passato come argomento.
Anche se questo soddisfa ciò di cui ho bisogno, penso che potrebbe essere un passo migliore, Esiste un modo, utilizzando script di shell o altro, per inviare il file .tar compresso a un messaggio di posta elettronica in uscita come attaccamento? Ciò eviterebbe di dover gestire messaggi di posta elettronica molto lunghi che contengono dati di intestazione e spesso presentano problemi di a capo automatico, ecc.
Soluzione
Nessuno di quelli bastardi ha funzionato per me.Si pensava che l'indirizzo email fosse parte dell'allegato.Doveva fare:
echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- recipient@domain.com
Altri suggerimenti
Oppure, in mancanza di mutt:
gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz | mail -s "MySQL DB" backup@email.com
Dal guardare man mailx
, il programma mailx non dispone di un'opzione per allegare un file.Potresti usare un altro programma come mutt.
echo "This is the message body" | mutt -a file.to.attach -s "subject of message" recipient@domain.com
Le opzioni della riga di comando per mutt possono essere visualizzate con mutt -h
.
A seconda della versione di Linux, potrebbe essere chiamato mail.Per citare @David sopra:
mail -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt
o anche:
cat message.txt | mail -s "Backup" -a mysqldbbackup.sql backup@email.com
Io uso mpack.
mpack -s subject file user@example.com
Sfortunatamente mpack non riconosce '-' come alias per stdin.Ma il seguente funziona e può essere facilmente racchiuso in un alias (shell) o in uno script:
mpack -s subject /dev/stdin loser@example.com < file
Utilizzo SendEmail, creato per questo scenario.È confezionato per Ubuntu quindi presumo che sia disponibile
sendemail -f sender@some.where -t receiver@some.place -m "Here are your files!" -a file1.jpg file2.zip
echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log email_id@example.com
Puoi usare bastardino per inviare l'e-mail con allegato
mutt -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt
Una volta ho scritto questa funzione per ksh su Solaris (usa Perl per la codifica base64):
# usage: email_attachment to cc subject body attachment_filename
email_attachment() {
to="$1"
cc="$2"
subject="$3"
body="$4"
filename="${5:-''}"
boundary="_====_blah_====_$(date +%Y%m%d%H%M%S)_====_"
{
print -- "To: $to"
print -- "Cc: $cc"
print -- "Subject: $subject"
print -- "Content-Type: multipart/mixed; boundary=\"$boundary\""
print -- "Mime-Version: 1.0"
print -- ""
print -- "This is a multi-part message in MIME format."
print -- ""
print -- "--$boundary"
print -- "Content-Type: text/plain; charset=ISO-8859-1"
print -- ""
print -- "$body"
print -- ""
if [[ -n "$filename" && -f "$filename" && -r "$filename" ]]; then
print -- "--$boundary"
print -- "Content-Transfer-Encoding: base64"
print -- "Content-Type: application/octet-stream; name=$filename"
print -- "Content-Disposition: attachment; filename=$filename"
print -- ""
print -- "$(perl -MMIME::Base64 -e 'open F, shift; @lines=<F>; close F; print MIME::Base64::encode(join(q{}, @lines))' $filename)"
print -- ""
fi
print -- "--${boundary}--"
} | /usr/lib/sendmail -oi -t
}
Invia un'e-mail con il corpo in testo normale con un allegato in testo normale con mailx:
(
/usr/bin/uuencode attachfile.txt myattachedfilename.txt;
/usr/bin/echo "Body of text"
) | mailx -s 'Subject' youremail@gmail.com
Di seguito è riportato lo stesso comando di sopra, senza i ritorni a capo
( /usr/bin/uuencode /home/el/attachfile.txt myattachedfilename.txt; /usr/bin/echo "Body of text" ) | mailx -s 'Subject' youremail@gmail.com
Assicurati di avere un file /home/el/attachfile.txt
definito con questo contenuto:
<html><body>
Government discriminates against programmers with cruel/unusual 35 year prison
sentences for making the world's information free, while bankers that pilfer
trillions in citizens assets through systematic inflation get the nod and
walk free among us.
</body></html>
Se non hai uuencode leggi questo: https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work
Su Linux, invia un'e-mail con corpo HTML con un allegato PDF con sendmail:
Assicurati di aver installato ksh: yum info ksh
Assicurati di avere sendmail installato e configurato.
Assicurati di avere uuencode installato e disponibile: https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work
Crea un nuovo file chiamato test.sh
e inseriscilo nella tua home directory: /home/el
Inserisci il seguente codice test.sh
:
#!/usr/bin/ksh
export MAILFROM="el@defiant.com"
export MAILTO="youremail@gmail.com"
export SUBJECT="Test PDF for Email"
export BODY="/home/el/email_body.htm"
export ATTACH="/home/el/pdf-test.pdf"
export MAILPART=`uuidgen` ## Generates Unique ID
export MAILPART_BODY=`uuidgen` ## Generates Unique ID
(
echo "From: $MAILFROM"
echo "To: $MAILTO"
echo "Subject: $SUBJECT"
echo "MIME-Version: 1.0"
echo "Content-Type: multipart/mixed; boundary=\"$MAILPART\""
echo ""
echo "--$MAILPART"
echo "Content-Type: multipart/alternative; boundary=\"$MAILPART_BODY\""
echo ""
echo "--$MAILPART_BODY"
echo "Content-Type: text/plain; charset=ISO-8859-1"
echo "You need to enable HTML option for email"
echo "--$MAILPART_BODY"
echo "Content-Type: text/html; charset=ISO-8859-1"
echo "Content-Disposition: inline"
cat $BODY
echo "--$MAILPART_BODY--"
echo "--$MAILPART"
echo 'Content-Type: application/pdf; name="'$(basename $ATTACH)'"'
echo "Content-Transfer-Encoding: uuencode"
echo 'Content-Disposition: attachment; filename="'$(basename $ATTACH)'"'
echo ""
uuencode $ATTACH $(basename $ATTACH)
echo "--$MAILPART--"
) | /usr/sbin/sendmail $MAILTO
Modifica le variabili di esportazione in alto test.sh
per riflettere il tuo indirizzo e i nomi dei file.
Scarica un documento pdf di prova e inseriscilo /home/el
chiamato pdf-test.pdf
Crea un file chiamato /home/el/email_body.htm e inserisci questa riga:
<html><body><b>this is some bold text</b></body></html>
Assicurati che il file pdf disponga di autorizzazioni 755 sufficienti.
Esegui lo script ./test.sh
Controlla la tua casella di posta elettronica, il testo dovrebbe essere in formato HTML e il file pdf interpretato automaticamente come file binario.Fai attenzione a non utilizzare questa funzione più di 15 volte al giorno, anche se invii le email a te stesso, i filtri antispam in Gmail possono inserire nella lista nera un dominio che invia email senza darti la possibilità di lasciarle passare.E scoprirai che questo non funziona più, o lascia passare solo l'allegato, o l'e-mail non arriva affatto.Se devi fare molti test su questo argomento, distribuiscili su più giorni o verrai etichettato come spammer e questa funzione non funzionerà più.
Ci sono diverse risposte qui che suggeriscono mail
O mailx
quindi questo è più che altro uno sfondo per aiutarti a interpretarli nel contesto.
Note storiche
Le origini di Unix mail
torniamo indietro nelle nebbie della storia iniziale di Bell Labs Unix™ (1969?), e probabilmente non possiamo sperare di approfondire qui la sua genealogia completa.Basti dire che ci sono molti programmi che ereditano il codice da o reimplementano (o ereditano il codice da una reimplementazione di) mail
e che non esiste un'unica base di codice che possa essere identificata inequivocabilmente come "il" mail
.
Tuttavia, uno dei contendenti a quella posizione è sicuramente "Berkeley Mail", come si chiamava originariamente Mail
con una M maiuscola in 2BSD (1978);ma in 3BSD (1979), sostituì la minuscola mail
comando, creando nuova confusione.SVR3 (1986) includeva un derivato chiamato mailx
.IL x
è stato presumibilmente aggiunto per renderlo unico e distinto;ma anche questo è stato ora copiato, reimplementato e mutilato, tanto che non esiste un'unica versione individuale che sia definitiva.
In passato, il di fatto era lo standard per l'invio di file binari tramite posta elettronica uuencode
.Esiste ancora, ma presenta numerosi problemi di usabilità;se possibile, dovresti invece inviare allegati MIME, a meno che non ti sforzi specificamente di essere in grado di comunicare con la fine degli anni '80.
MIMO è stato introdotto all'inizio degli anni '90 per risolvere diversi problemi con la posta elettronica, incluso il supporto per vari tipi di contenuto diversi dal testo semplice in un singolo set di caratteri che è realmente adatto solo per un sottoinsieme dell'inglese (e, ci viene detto, hawaiano) .Ciò ha introdotto il supporto per i messaggi in più parti, l'internazionalizzazione, i tipi di contenuti avanzati, ecc., e ha rapidamente guadagnato terreno nel corso degli anni '90.
(IL Cimelio di famiglia mail
/mailx
appunti di storia sono stati molto utili durante la composizione di questo articolo e meritano sicuramente una lettura se ti piacciono questo genere di cose.)
Offerte attuali
A partire dal 2018, Debian ha tre pacchetti che includono a mail
O mailx
comando.(Puoi cercare Provides: mailx
.)
debian$ aptitude search ~Pmailx
i bsd-mailx - simple mail user agent
p heirloom-mailx - feature-rich BSD mail(1)
p mailutils - GNU mailutils utilities for handling mail
(Non sto scegliendo Debian come raccomandazione;è quello che uso, quindi lo conosco;e fornisce un mezzo per distinguere in modo inequivocabile le varie alternative facendo riferimento ai rispettivi nomi di pacchetto.Ovviamente è anche la distribuzione da cui Ubuntu ottiene questi pacchetti.)
bsd-mailx
è relativamente semplicemailx
che fa non sembrano supportare l'invio di allegati MIME.Guardalo pagina di manuale e nota che questo è quello che ti aspetteresti di trovare su un sistema *BSD, incluso MacOS, per impostazione predefinita.heirloom-mailx
ora viene chiamatos-nail
E fa supporta l'invio di allegati MIME con-a
.Guardalo pagina di manuale e più in generale il Progetto cimeliomailutils
ovvero Mailutil GNU include amail
/mailx
involucro di compatibilità Quale fa supporta l'invio di allegati MIME con-A
Con queste preoccupazioni, se hai bisogno che il tuo codice sia portabile e possa dipendere da un pacchetto piuttosto complesso, il modo semplice per inviare portabilmente allegati MIME è quello di utilizzo mutt
.
Un'altra alternativa - Swaks (Coltellino svizzero per SMTP).
swaks -tls \
--to ${MAIL_TO} \
--from ${MAIL_FROM} \
--server ${MAIL_SERVER} \
--auth LOGIN \
--auth-user ${MAIL_USER} \
--auth-password ${MAIL_PASSWORD} \
--header "Subject: $MAIL_SUBJECT" \
--header "Content-Type: text/html; charset=UTF-8" \
--body "$MESSAGE" \
--attach mysqldbbackup.sql
metamail ha lo strumento metasend
metasend -f mysqlbackup.sql.gz -t backup@email.com -s Backup -m application/x-gzip -b
ero solito
echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "a@b.c"
e questo ha funzionato bene per me....
mailx
ha un -a
opzione ora per gli allegati.
Di solito utilizzo solo il comando mail su RHEL.Ho provato mailx ed è abbastanza efficiente.
mailx -s "Sending Files" -a First_LocalConfig.conf -a
Second_LocalConfig.conf Recipient@myemail.com
This is the content of my msg.
.
la strada più breve per me è
file=filename_or_filepath;uuencode $file $file|mail -s "optional subject" email_address
quindi per il tuo esempio sarà
file=your_sql.log;gzip -c $file;uuencode ${file}.gz ${file}|mail -s "file with magnets" ph.gachoud@gmail.com
la parte buona è che posso ricordarlo con CTRL+R per inviare un altro file...
Dalla macchina di origine
mysqldump --defaults-extra-file=sql.cnf database | gzip | base64 | mail me@myemail.com
Sulla macchina di destinazione.Salva il corpo della posta ricevuta con nome db.sql.gz.b64;Poi..
base64 -D -i db.sql.gz.b64 | gzip -d | mysql --defaults-extra-file=sql.cnf
utilizzando il comando mailx
echo "Message Body Here" | mailx -s "Subject Here" -a file_name user@example.com
utilizzando sendmail
#!/bin/ksh
fileToAttach=data.txt
`(echo "To: user@company.com"
echo "Cc: user@company.com"
echo "From: Application"
echo "Subject: your subject"
echo your body
uuencode $fileToAttach $fileToAttach
)| eval /usr/sbin/sendmail -t `;
Solo per aggiungere i miei 2 centesimi, scriverei il mio script PHP:
http://php.net/manual/en/function.mail.php
Esistono molti modi per eseguire l'allegato negli esempi in quella pagina.
Non è un metodo per inviare e-mail, ma puoi utilizzare un server Git online (ad es.Bitbucket o un servizio simile) per questo.
In questo modo puoi utilizzare git push
comandi e tutte le versioni verranno archiviate in modo compresso e organizzato.
Ecco come sto facendo con un file di registro di grandi dimensioni in CentOS:
MAIL="`whereis mail | awk '{print $2}'`"
WHOAMI="`whoami`"
HOSTNAME="`hostname`"
EMAIL"your@email.address"
LOGDIR="/var/log/aide"
LOGNAME="`basename "$0"`_`date "+%Y%m%d_%H%M"`"
# Arhiveerime ning kui hästi, saadame edasi:
/bin/tar -zcvf ${LOGDIR}/${LOGNAME}.tgz "${LOGDIR}/${LOGNAME}.log" > /dev/null 2>&1
if [ $? -eq 0 ]; then
cd ${LOGDIR}
# This works too. The message content will be taken from text file below
# echo 'Hello!' >/root/scripts/audit_check.sh.txt
# echo "Arhiivifail manuses" | ${MAIL} -s "${HOSTNAME} Aide report" -q /root/scripts/audit_check.sh.txt -a ${LOGNAME}.tgz -S from=${WHOAMI}@${HOSTNAME} ${EMAIL}
echo "Arhiivifail manuses" | ${MAIL} -s "${HOSTNAME} Aide report" -a ${LOGNAME}.tgz -S from=${WHOAMI}@${HOSTNAME} ${EMAIL}
/bin/rm "${LOGDIR}/${LOGNAME}.log"
fi
Se il file è di testo, puoi inviarlo più facilmente nel corpo come:
sendmail recipient@example.com < message.txt
Mailutils rende tutto questo un gioco da ragazzi
echo "Body" | mail.mailutils -M -s "My Subject" -A attachment.pdf mail@example.org
-A file
allega un file-M
abilita MIME, in modo da poter avere un allegato e un corpo di testo normale.
Se non è ancora installato, esegui
sudo apt install mailutils
Ancora una cosa mutt
:per impostazione predefinita utilizza il tuo indirizzo e nome nel campo "Da:".Se non è quello che ti serve, puoi creare un file muttrc alternativo contenente una stringa come questa:set from="Il mio demone di posta"
Usa questo file con -F
opzione della riga di comando.
Se mutt non funziona o non è installato, prova questo-
*#!/bin/sh
FilePath=$1
FileName=$2
Message=$3
MailList=$4
cd $FilePath
Rec_count=$(wc -l < $FileName)
if [ $Rec_count -gt 0 ]
then
(echo "The attachment contains $Message" ; uuencode $FileName $FileName.csv ) | mailx -s "$Message" $MailList
fi*