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.

War es hilfreich?

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

http://caspian.dotconf.net/menu/Software/SendEmail/

 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 einfach mailx 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 aufgerufen s-nail Und tut Unterstützt das Senden von MIME-Anhängen mit -a.Sehen Sie es Handbuchseite und allgemeiner die Erbstückprojekt
  • mailutils aka GNU Mailutils beinhaltet a mail/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*
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top