Wie sende ich eine Datei als E-Mail-Anhang über die Linux-Befehlszeile?
-
08-06-2019 - |
Frage
Ich habe ein Skript erstellt, das jede Nacht auf meinem Linux-Server ausgeführt wird mysqldump
um jede meiner MySQL-Datenbanken in .sql-Dateien zu sichern und sie als komprimierte .tar-Datei zusammenzupacken.Der nächste Schritt, den ich erreichen möchte, besteht darin, diese TAR-Datei zur sicheren Aufbewahrung per E-Mail an einen Remote-E-Mail-Server zu senden.Ich konnte das Rohskript im Textkörper per E-Mail senden, indem ich die Backup-Textdatei an weiterleitete mailx
etwa so:
$ cat mysqldbbackup.sql | mailx backup@email.com
cat
Gibt den Text der Sicherungsdatei wieder, der in die weitergeleitet wird mailx
Programm mit der E-Mail-Adresse des Empfängers als Argument übergeben.
Obwohl dies das erreicht, was ich brauche, denke ich, dass es noch einen Schritt besser sein könnte. Gibt es eine Möglichkeit, mithilfe von Shell-Skripten oder auf andere Weise die komprimierte TAR-Datei als E-Mail-Nachricht an eine ausgehende E-Mail-Nachricht zu senden? Anhang? Dies wäre besser, als sich mit sehr langen E-Mail-Nachrichten herumschlagen zu müssen, die Kopfdaten enthalten und oft Probleme mit dem Zeilenumbruch usw. haben.
Lösung
Keiner der Köter hat bei mir funktioniert.Es wurde angenommen, dass die E-Mail-Adresse Teil des Anhangs sei.Musste tun:
echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- recipient@domain.com
Andere Tipps
Oder, fehlgeschlagener Mutt:
gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz | mail -s "MySQL DB" backup@email.com
Vom Anschauen man mailx
, verfügt das Programm mailx nicht über die Möglichkeit, eine Datei anzuhängen.Sie könnten ein anderes Programm wie Mutt verwenden.
echo "This is the message body" | mutt -a file.to.attach -s "subject of message" recipient@domain.com
Befehlszeilenoptionen für mutt können mit angezeigt werden mutt -h
.
Abhängig von Ihrer Linux-Version heißt es möglicherweise Mail.Um @David oben zu zitieren:
mail -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt
oder auch:
cat message.txt | mail -s "Backup" -a mysqldbbackup.sql backup@email.com
Ich verwende mpack.
mpack -s subject file user@example.com
Leider erkennt mpack „-“ nicht als Alias für stdin.Aber das Folgende funktioniert und kann leicht in einen (Shell-)Alias oder ein Skript verpackt werden:
mpack -s subject /dev/stdin loser@example.com < file
Ich verwende SendEmail, das für dieses Szenario erstellt wurde.Es ist für Ubuntu gepackt, daher gehe ich davon aus, dass es verfügbar ist
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
Sie können verwenden Köter um die E-Mail mit Anhang zu versenden
mutt -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt
Ich habe diese Funktion einmal für ksh unter Solaris geschrieben (verwendet Perl für die Base64-Kodierung):
# 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
}
Senden Sie eine Klartext-E-Mail mit einem Klartext-Anhang mit mailx:
(
/usr/bin/uuencode attachfile.txt myattachedfilename.txt;
/usr/bin/echo "Body of text"
) | mailx -s 'Subject' youremail@gmail.com
Unten ist derselbe Befehl wie oben, ohne die Zeilenumbrüche
( /usr/bin/uuencode /home/el/attachfile.txt myattachedfilename.txt; /usr/bin/echo "Body of text" ) | mailx -s 'Subject' youremail@gmail.com
Stellen Sie sicher, dass Sie eine Datei haben /home/el/attachfile.txt
definiert mit diesem Inhalt:
<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>
Wenn Sie keinen UUEN-Code haben, lesen Sie Folgendes: https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work
Senden Sie unter Linux eine HTML-Text-E-Mail mit einem PDF-Anhang mit sendmail:
Stellen Sie sicher, dass ksh installiert ist: yum info ksh
Stellen Sie sicher, dass sendmail installiert und konfiguriert ist.
Stellen Sie sicher, dass uuencode installiert und verfügbar ist: https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work
Erstellen Sie eine neue Datei mit dem Namen test.sh
und legen Sie es in Ihrem Home-Verzeichnis ab: /home/el
Geben Sie den folgenden Code ein 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
Ändern Sie die Exportvariablen oben test.sh
um Ihre Adresse und Dateinamen wiederzugeben.
Laden Sie ein Test-PDF-Dokument herunter und fügen Sie es ein /home/el
namens pdf-test.pdf
Erstellen Sie eine Datei mit dem Namen /home/el/email_body.htm und fügen Sie diese Zeile ein:
<html><body><b>this is some bold text</b></body></html>
Stellen Sie sicher, dass die PDF-Datei über ausreichende 755-Berechtigungen verfügt.
Führen Sie das Skript aus ./test.sh
Überprüfen Sie Ihren E-Mail-Posteingang. Der Text sollte im HTML-Format vorliegen und die PDF-Datei sollte automatisch als Binärdatei interpretiert werden.Achten Sie darauf, diese Funktion nicht öfter als etwa 15 Mal am Tag zu verwenden, auch wenn Sie die E-Mails an sich selbst senden. Spamfilter in Gmail können eine Domain, die E-Mails ausspuckt, auf die schwarze Liste setzen, ohne dass Sie die Möglichkeit haben, diese durchzulassen.Und Sie werden feststellen, dass dies nicht mehr funktioniert, entweder nur der Anhang durchgelassen wird oder die E-Mail überhaupt nicht ankommt.Wenn Sie hierzu viele Tests durchführen müssen, verteilen Sie diese auf mehrere Tage, sonst werden Sie als Spammer eingestuft und diese Funktion funktioniert nicht mehr.
Hier gibt es mehrere Antworten, die darauf hindeuten mail
oder mailx
Dies ist also eher ein Hintergrund, der Ihnen hilft, diese im Kontext zu interpretieren.
Historische Notizen
Die Ursprünge von Unix mail
Wir blicken zurück in die frühe Geschichte von Bell Labs Unix™ (1969?), und wir können hier wahrscheinlich nicht hoffen, auf seine vollständige Genealogie einzugehen.Es genügt zu sagen, dass es viele Programme gibt, die Code erben oder neu implementieren (oder Code von einer Neuimplementierung erben) mail
und dass es keine einzelne Codebasis gibt, die eindeutig als „die“ identifiziert werden kann mail
.
Einer der Anwärter auf diese Position ist jedoch sicherlich „Berkeley Mail“, der ursprünglich hieß Mail
mit einem großen M in 2BSD (1978);aber in 3BSD (1979) ersetzte es den Kleinbuchstaben mail
Befehl auch, was zu neuer Verwirrung führt.SVR3 (1986) enthielt ein Derivat namens mailx
.Der x
wurde vermutlich hinzugefügt, um es einzigartig und unverwechselbar zu machen;Aber auch dies wurde inzwischen kopiert, neu implementiert und verstümmelt, so dass es keine einzige individuelle Version gibt, die endgültig ist.
Damals war die de facto Standard für den Versand von Binärdateien per E-Mail war uuencode
.Es existiert immer noch, weist jedoch zahlreiche Benutzerfreundlichkeitsprobleme auf.Wenn möglich, sollten Sie stattdessen MIME-Anhänge senden, es sei denn, Sie streben ausdrücklich danach, mit den späten 1980er Jahren kommunizieren zu können.
MIME wurde Anfang der 1990er Jahre eingeführt, um mehrere Probleme mit E-Mails zu lösen, einschließlich der Unterstützung verschiedener Arten von Inhalten außer reinem Text in einem einzigen Zeichensatz, der eigentlich nur für eine Teilmenge des Englischen (und, wie man uns sagt, für Hawaiisch) geeignet ist. .Dadurch wurde die Unterstützung für mehrteilige Nachrichten, Internationalisierung, Rich-Content-Typen usw. eingeführt und gewann in den 1990er Jahren schnell an Bedeutung.
(Der Erbstück mail
/mailx
Geschichtsnotizen waren beim Verfassen dieses Buches äußerst hilfreich und sind auf jeden Fall eine Lektüre wert, wenn Sie sich für so etwas interessieren.)
Aktuelle Angebote
Ab 2018 verfügt Debian über drei Pakete, darunter a mail
oder mailx
Befehl.(Sie können suchen nach 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
(Ich möchte Debian nicht als Empfehlung hervorheben;Es ist das, was ich benutze, also bin ich damit vertraut;und es bietet eine Möglichkeit, die verschiedenen Alternativen eindeutig zu unterscheiden, indem auf ihre jeweiligen Paketnamen verwiesen wird.Es ist offensichtlich auch die Distribution, von der Ubuntu diese Pakete bezieht.)
bsd-mailx
ist relativ einfachmailx
was tut nicht scheinen das Senden von MIME-Anhängen zu unterstützen.Sehen Sie es Handbuchseite und beachten Sie, dass dies die Datei ist, die Sie standardmäßig auf einem *BSD-System, einschließlich MacOS, erwarten würden.heirloom-mailx
wird jetzt aufgerufens-nail
Und tut Unterstützt das Senden von MIME-Anhängen mit-a
.Sehen Sie es Handbuchseite und allgemeiner die Erbstückprojektmailutils
aka GNU Mailutils beinhaltet amail
/mailx
Kompatibilitäts-Wrapper welche tut Unterstützt das Senden von MIME-Anhängen mit-A
Wenn Ihr Code vor diesem Hintergrund portierbar sein muss und Sie auf ein relativ komplexes Paket angewiesen sind, können Sie MIME-Anhänge auf einfache Weise portabel versenden: verwenden mutt
.
Eine weitere Alternative - Swaks (Schweizer Taschenmesser für 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 verfügt über das Tool Metasend
metasend -f mysqlbackup.sql.gz -t backup@email.com -s Backup -m application/x-gzip -b
ich benutzte
echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "a@b.c"
und das hat bei mir gut funktioniert...
mailx
hat ein -a
Option jetzt für Anhänge.
Normalerweise verwende ich den Mail-Befehl nur unter RHEL.Ich habe mailx ausprobiert und es ist ziemlich effizient.
mailx -s "Sending Files" -a First_LocalConfig.conf -a
Second_LocalConfig.conf Recipient@myemail.com
This is the content of my msg.
.
Der kürzeste Weg ist für mich
file=filename_or_filepath;uuencode $file $file|mail -s "optional subject" email_address
also für Ihr Beispiel wird es so sein
file=your_sql.log;gzip -c $file;uuencode ${file}.gz ${file}|mail -s "file with magnets" ph.gachoud@gmail.com
Das Gute daran ist, dass ich mich daran erinnern kann Strg+r um eine weitere Datei zu senden...
Von der Quellmaschine
mysqldump --defaults-extra-file=sql.cnf database | gzip | base64 | mail me@myemail.com
Auf dem Zielcomputer.Speichern Sie den empfangenen E-Mail-Text unter db.sql.gz.b64;Dann..
base64 -D -i db.sql.gz.b64 | gzip -d | mysql --defaults-extra-file=sql.cnf
mit dem Befehl mailx
echo "Message Body Here" | mailx -s "Subject Here" -a file_name user@example.com
mit 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 `;
Nur um meine 2 Cent hinzuzufügen, würde ich mein eigenes PHP-Skript schreiben:
http://php.net/manual/en/function.mail.php
In den Beispielen auf dieser Seite gibt es viele Möglichkeiten, den Anhang zu erstellen.
Keine Methode zum Senden von E-Mails, aber Sie können einen Online-Git-Server verwenden (z. B.Bitbucket oder ein ähnlicher Dienst).
Auf diese Weise können Sie verwenden git push
Befehle und alle Versionen werden komprimiert und organisiert gespeichert.
So mache ich es mit einer großen Protokolldatei 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
Wenn es sich bei der Datei um eine Textdatei handelt, können Sie sie am einfachsten im Textkörper senden:
sendmail recipient@example.com < message.txt
Mailutils macht dies zu einem Kinderspiel
echo "Body" | mail.mailutils -M -s "My Subject" -A attachment.pdf mail@example.org
-A file
hängt eine Datei an-M
Aktiviert MIME, sodass Sie einen Anhang und einen Klartexttext haben können.
Wenn noch nicht installiert, führen Sie es aus
sudo apt install mailutils
Noch etwas dazu mutt
:Standardmäßig werden Ihre Adresse und Ihr Name im Feld „Von:“ verwendet.Wenn es nicht das ist, was Sie brauchen, können Sie eine alternative muttrc-Datei erstellen, die eine Zeichenfolge wie diese enthält:set from="Mein Mail-Daemon "
Verwenden Sie diese Datei mit -F
Befehlszeilenoption.
Wenn Mutt nicht funktioniert oder nicht installiert ist, versuchen Sie Folgendes:
*#!/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*