Wie sende ich eine Datei als E-Mail-Anhang über die Linux-Befehlszeile?


289

Ich habe ein Skript erstellt, das jeden Abend auf meinem Linux-Server ausgeführt wird und mysqldumpmit dem jede meiner MySQL-Datenbanken in SQL-Dateien gesichert und als komprimierte TAR-Datei zusammengefasst wird. Der nächste Schritt, den ich ausführen möchte, besteht darin, diese TAR-Datei zur sicheren Aufbewahrung per E-Mail an einen Remote-E-Mail-Server zu senden. Ich konnte dem Rohskript im Text eine E-Mail senden, indem ich die Sicherungstextdatei mailxwie folgt weiterleitete :

$ cat mysqldbbackup.sql | mailx backup@email.com

catgibt den Text der Sicherungsdatei wieder, der mailxmit der als Argument übergebenen E-Mail-Adresse des Empfängers an das Programm weitergeleitet wird.

Während dies das erreicht, was ich brauche, denke ich, dass es einen Schritt besser sein könnte. Gibt es eine Möglichkeit, mithilfe von Shell-Skripten oder auf andere Weise die komprimierte .tar-Datei als Anhang an eine ausgehende E-Mail-Nachricht zu senden ? Dies würde es übertreffen, sich mit sehr langen E-Mail-Nachrichten befassen zu müssen, die Header-Daten enthalten und häufig Probleme mit dem Zeilenumbruch usw. haben.


1
Können Sie das Skript freigeben, mit dem Ihre MySQL-Datenbanken gesichert werden?
Almino Melo

Entschuldigung, ich mache das schon eine Weile nicht mehr. Ich weiß, dass es mysqldumpdarum ging, die Ausgabe aufzurufen und dann an eine E-Mail anzuhängen (mit mutt). Möglicherweise hatte ich sogar einen Schritt, der die Ausgabe ebenfalls auf zip / tar.gz komprimierte ...
Kit Roed

1
Rein neugierig, warum senden Sie Ihre Backups per E-Mail gegen scp oder rsync sie?
Jchook

Antworten:


298

Keiner der Köter hat für mich gearbeitet. Es wurde angenommen, dass die E-Mail-Adresse Teil des Anhangs war. Musste tun:

echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- recipient@domain.com

1
Ich benutze mutt 1.5.21 (2010-09-15) und es erfordert -a Parameter, um nach Empfänger-E-Mail zu sein
nurettin

Arbeitete für mich mit Mutt 1.5.24 (30.08.2015) auf openSUSE Leap 42.1.
Antonio Vinicius Menezes Medei

3
@fugitive bedeutet "Ende der Optionen". Werfen
Rynop

Gibt es eine Möglichkeit, nach Ausnahmen zu suchen und das Senden erneut zu versuchen?
ti034

79

Oder fehlgeschlagener Köter:

gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz  | mail -s "MySQL DB" backup@email.com

26
Dadurch wird das nicht codierte Teil inline und nicht als Anhang gesendet . Viele Mail-Clients erkennen dies jedoch und zeigen den nicht codierten Teil als Anhang an.
FuePi

4
Verwenden Sie heutzutage keinen Uuencode mehr. MIME ist etwas komplexer, aber viel benutzerfreundlicher.
Tripleee

@DavidGiven: Sehen Sie zum Beispiel (auf einen Blick) alle anderen Antworten auf diese Frage.
Tripleee

6
Keiner von ihnen benutzt Post!
David gegeben

Dann zB stackoverflow.com/questions/3317174/… und durch einen text/htmlbeliebigen MIME-Typ ersetzen, der für Ihren Anhang sinnvoll ist. (Für dieses konkrete Beispiel, denke ich application/gzip.)
Tripleee

43

Abhängig von Ihrer Linux-Version kann es als Mail bezeichnet werden. 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 

@ KarelBílek: Wie wäre es mit der anderen Option?
Nathan Fellman

Beide Lösungen funktionieren bei mir nicht. Ich habe die E-Mail mit Outlook 2013 erhalten und die E-Mail enthält nur den Dateinamen
nickel715

2
Meine Manpage lautet:-a, --append=HEADER: VALUE append given header to the message being sent
Exhuma

2
Nathan, es sieht so aus, als ob dein Zitat von David falsch ist - er hat den muttBefehl benutzt, nicht mail. Wie andere bereits betont haben, scheint Mutt nun ein --Argument vor der Adresse zu benötigen . Und ich sehe, dass @exhuma und ich uns tatsächlich einig sind, was die -aOption in mailbewirkt - ich war dort für eine Minute verwirrt;)
nealmcb

7
anstelle von -a sollten Sie -A verwenden: -a, --append=HEADER: VALUE append given header to the message being sent -A, --attach=FILE attach FILE
Victor Perov

41

Vom Blick auf man mailx, wird das mailx keine Option , eine Datei anzubringen. 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.


Vielen Dank! Das hat den Trick gemacht, ich hatte Probleme, Köter dazu zu bringen, die Aktion still zu machen.
Kit Roed

10
Siehe Antwort unten ( stackoverflow.com/a/9524359/10608 ), da anscheinend die Syntax für mutt geändert wurde, für die jetzt a erforderlich ist --.
Alexander Bird

29

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/


Ich glaube, in Ihrem Beispiel sollte es "sendEmail" anstelle von "sendemail" sein.
Davit

1
Ja und Nein - die Quelle (Kaspisch) verwendet ein Großbuchstaben E, während dies eine ungewöhnliche Benennungsstrategie für Befehlszeilentools (in der Unix-Welt) ist, bietet zumindest die Ubuntu-Verpackung dieser Software sowohl sendemailals auch sendEmailin /usr/bin/.
Fredrik Wendt

Mein Xubuntu 14.04.3 nicht installiertSendEmail
Vitaly Zdanevich

3
"sudo apt install sendemail", um sendemail zu installieren und "-f obligatorisch@email.com" hinzuzufügen, ein obligatorisches from-Feld, damit der Befehl funktioniert. sendemail -f mandatory@email.com-t to@some.one -m "Here are your files!" -a file1.jpg file2.zip
Sailendra Pinupolu

28

Ich benutze mpack.

mpack -s subject file user@example.com

Leider erkennt mpack '-' nicht als Alias ​​für stdin. Aber die folgende Arbeit, und kann leicht in einen (Shell-) Alias ​​oder ein Skript eingeschlossen werden:

mpack -s subject /dev/stdin loser@example.com < file

Dies könnte in Bash für stdin funktionieren. Ich habe kein Mpack, also habe ich es nicht versucht:mpack -s subject /dev/stdin loser@example.com <(stdout_generating_program)
thomasa88

23
 echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log email_id@example.com

4
Dies sollte die akzeptierte Antwort sein. Verwendet Standard-Mailx und funktioniert einwandfrei. Mutt v1.5.21 weigert sich,> 1 MB Anhänge zu senden, wenn cron verwendet wird.
Joseph

Ich habe nach etwas gesucht, das in EC2 funktioniert, und das hat gut funktioniert.
Singularität

6
mailxist nicht richtig standardisiert. Jede Antwort, die dies empfiehlt, sollte auf diese Einschränkung hinweisen. Es werden mindestens drei inkompatible Varianten verwendet.
Tripleee

13

Ich habe diese Funktion einmal für ksh unter Solaris geschrieben (verwendet Perl für die Base64-Codierung):

# 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
}

8
Unter GNU / Linux kann man base64anstelle von Perl einen Befehl zum Codieren verwenden
MestreLion

12

Sie können mutt verwenden , um die E-Mail mit Anhang zu senden

mutt -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt

2
Zumindest ab Mutt 1.5.21 (Ubuntu Trusty) müssen Sie die -aOption nach dem Empfänger setzen: mutt -s "Backup" backup@email.com -a mysqldbbackup.sql < message.txtoder die --Option vor dem Empfänger verwenden, wie in der Antwort von rynop gezeigt.
Nealmcb

10

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 der gleiche 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 /home/el/attachfile.txtmit folgendem Inhalt definiert haben :

<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 Uuencode haben, lesen Sie diesen: /unix/16277/how-do-i-get-uuencode-to-work

Senden Sie unter Linux HTML-Text-E-Mails mit einem PDF-Anhang mit sendmail:

Stellen Sie sicher, dass Sie ksh installiert haben: yum info ksh

Stellen Sie sicher, dass sendmail installiert und konfiguriert ist.

Stellen Sie sicher, dass Sie uuencode installiert und verfügbar haben: /unix/16277/how-do-i-get-uuencode-to-work

Erstellen Sie eine neue Datei mit dem Namen test.sh und legen Sie sie 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 auf test.sh , um Ihre Adresse und Dateinamen wiederzugeben.

Laden Sie ein Test-PDF-Dokument herunter und /home/elfügen Sie es in die Datei pdf-test.pdf ein

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 ausreichend 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 wird automatisch als Binärdatei interpretiert. Achten Sie darauf, diese Funktion nicht mehr als 15 Mal am Tag zu verwenden. Selbst wenn Sie die E-Mails an sich selbst senden, können Spam-Filter in Google Mail eine Domain auf die schwarze Liste setzen, ohne dass Sie die Möglichkeit haben, sie durchzulassen. Und Sie werden feststellen, dass dies nicht mehr funktioniert oder nur den Anhang durchlässt oder die E-Mail überhaupt nicht durchkommt. Wenn Sie diesbezüglich viele Tests durchführen müssen, verteilen Sie diese auf mehrere Tage, oder Sie werden als Spammer bezeichnet, und diese Funktion funktioniert nicht mehr.


1
Bei mir hat es umgekehrt funktioniert. (echo 'Email Body'; uuencode filename filename) | mailx -s 'Subject' user@domain.com
Vicky

uuencodeist nicht richtig ein Anhang. Es wird einfach ein vom Computer lesbarer Textklumpen in die Mitte eines anderen Textes eingebettet. Früher hat es gut funktioniert, als es keinen besseren Mechanismus gab, aber das war vor über 20 Jahren.
Tripleee

9

Es gibt mehrere Antworten hier was darauf hindeutet , mailoder mailxso ist dies eher ein Hintergrund ist, damit Sie diese in Zusammenhang interpretieren.

Historische Notizen

Die Ursprünge von Unix mailreichen bis in die Nebel der frühen Geschichte von Bell Labs Unix ™ (1969?) Zurück, und wir können wahrscheinlich nicht hoffen, hier auf die vollständige Genealogie einzugehen. Es genügt zu sagen, dass es viele Programme gibt, die Code von oder Neuimplementierung erben (oder Code von einer Neuimplementierung von erben), mailund dass es keine einzige Codebasis gibt, die eindeutig als "the" identifiziert werden kann mail.

Einer der Anwärter auf diese Position ist jedoch sicherlich "Berkeley Mail", das ursprünglich Mailin 2BSD (1978) mit einem Großbuchstaben M bezeichnet wurde; In 3BSD (1979) wurde jedoch auch der Kleinbuchstabenbefehl ersetzt mail, was zu neuer Verwirrung führte. SVR3 (1986) enthielt ein Derivat, das genannt wurde mailx. Das xwurde vermutlich hinzugefügt, um es einzigartig und unverwechselbar zu machen; Aber auch dies wurde jetzt kopiert, neu implementiert und verstümmelt, so dass es keine einzige Einzelversion gibt, die endgültig ist.

Früher war der De-facto- Standard für das Versenden von Binärdateien über E-Mail uuencode. Es existiert immer noch, hat aber zahlreiche Usability-Probleme; Wenn möglich, sollten Sie stattdessen MIME-Anhänge senden, es sei denn, Sie möchten ausdrücklich mit den späten 1980er Jahren kommunizieren können.

MIME wurde Anfang der neunziger Jahre eingeführt, um verschiedene Probleme mit E-Mails zu lösen, einschließlich der Unterstützung verschiedener Arten von Inhalten außer einfachem Text in einem einzigen Zeichensatz, der nur für eine Teilmenge von Englisch (und, wie wir wissen, Hawaiianisch) wirklich geeignet ist ). Dies führte die Unterstützung für mehrteilige Nachrichten, Internationalisierung, umfangreiche Inhaltstypen usw. ein und gewann in den neunziger Jahren schnell an Bedeutung.

(Die Heirloom- mail/ mailxGeschichtsnotizen waren beim Verfassen dieses Artikels am hilfreichsten und sind auf jeden Fall eine Lektüre wert, wenn Sie sich für solche Dinge interessieren .)

Aktuelle Angebote

Ab 2018 verfügt Debian über drei Pakete, die einen mailoder mailx-Befehl enthalten. (Sie können suchen 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 nehme Debian nicht als Empfehlung heraus; es ist das, was ich verwende, daher bin ich damit vertraut; und es bietet eine Möglichkeit, die verschiedenen Alternativen eindeutig zu unterscheiden, indem auf ihre jeweiligen Paketnamen Bezug genommen wird. Es ist offensichtlich auch die Distribution von welches Ubuntu diese Pakete bekommt.)

  • bsd-mailxist relativ einfach mailxund scheint das Senden von MIME-Anhängen nicht zu unterstützen. Lesen Sie die Handbuchseite und beachten Sie, dass dies diejenige ist, die Sie standardmäßig auf einem * BSD-System, einschließlich MacOS, erwarten würden.
  • heirloom-mailxgenannt wird jetzt s-nailund tut Unterstützung sendet MIME - Anhänge mit -a. Siehe die Handbuchseite und allgemein das Heirloom-Projekt
  • mailutilsaka GNU Mailutils enthält einen mail/ mailxkompatiblen Wrapper, der das Senden von MIME-Anhängen mit unterstützt-A

Mit diesen Bedenken, wenn Sie Ihren Code müssen tragbar sein und auf einem etwas komplexen Paket abhängen kann, ist die einfache Art und Weise zu portably Anlagen senden MIME ist die Verwendung mutt.


Ich habe dies ursprünglich als Antwort auf eine mäßig beliebte doppelte Frage gestapelt stackoverflow.com/questions/902591/…
Tripleee

4

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

2

metamail hat das Tool metasend

metasend -f mysqlbackup.sql.gz -t backup@email.com -s Backup -m application/x-gzip -b

Dies wurde früher fast überall installiert, aber fast nie benutzt. Da es lange Zeit nicht gewartet wurde (und immer noch AFAIK ist), wurde es auf vielen Plattformen aus dem De-facto- Standard-Toolset entfernt.
Tripleee

2

ich benutzte

echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "a@b.c" 

und das hat bei mir gut funktioniert ....


1

Ich benutze normalerweise nur den Mail-Befehl auf 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.

.

1

Der kürzeste Weg für mich ist

file=filename_or_filepath;uuencode $file $file|mail -s "optional subject" email_address

Also für dein Beispiel wird es 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 mit Strg + r daran erinnern kann , eine weitere Datei zu senden ...


Die geschweiften Klammern nützen Ihnen nicht viel, aber um vollständig portabel zu sein, sollten Sie die Variablen in doppelte Anführungszeichen setzen. Siehe auch stackoverflow.com/questions/10067266/…
Tripleee

1

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 als db.sql.gz.b64 . dann..

base64 -D -i db.sql.gz.b64 | gzip -d | mysql --defaults-extra-file=sql.cnf

0

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.


2
Möglicherweise ist nicht auf jedem Server PHP installiert. Wenn Sie wirklich den Pfad "Schreiben Sie Ihr eigenes Skript" einschlagen möchten, sind Perl oder Python viel besser geeignet, da sie normalerweise standardmäßig verfügbar sind.
Exhuma

shist noch allgegenwärtiger. Es gibt doppelte Fragen mit Antworten mit guten Beispielen; hier ist mein.
Tripleee

0

mailxhat jetzt eine -aOption für Anhänge.


2
Die "-a" Option ist für Header
Yves Martin

man mail [x], Version 12.5 vom 09.10.10 (vor einigen Jahren) sagt eindeutig -a Datei Hänge die angegebene Datei an die Nachricht an.`
fche

4
Einige Versionen von mailxdo. Ich glaube, es gibt zwei Implementierungen. Zum einen -afür Anhänge, zum anderen für Header.
Exhuma

1
Die Version von mailx in Ubuntu stammt von GNU und bedeutet dort einen Header hinzufügen. manpages.ubuntu.com/manpages/lucid/en/man1/mailx.1.html Welches System und welches Mailx erstellt einen Anhang?
Nealmcb

3
In der neuen Implementierung ist "-a" für Header und "-A" für Attchments
Avi Mehenwal

0

Keine Methode zum Senden von E-Mails, aber Sie können dafür einen Online-Git-Server (z. B. Bitbucket oder einen ähnlichen Dienst) verwenden.

Auf diese Weise können Sie git pushBefehle verwenden, und alle Versionen werden komprimiert und organisiert gespeichert.


0

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

Warum definieren Sie WHOAMIund HOSTNAME zweimal?
David C. Rankin

Dies hat mehrere Fehler im Shell-Codierungsstil. shellcheck.net wird auf einige, aber nicht alle hinweisen.
Tripleee

0

Wenn es sich bei der Datei um Text handelt, können Sie sie am einfachsten im Text senden:

sendmail recipient@example.com < message.txt

1
Dies sendet es nicht als Anhang oder sogar als Nachrichtentext. Sendmail erwartet, dass die Eingabe eine vollständige, wohlgeformte RFC5322-E-Mail-Nachricht ist, und kann auf interessante Weise fehlschlagen, wenn dies nicht der Fall ist.
Tripleee

0

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 `;

1
sendmail ist ein schönes Beispiel, ich bin froh, dass ich es hier gefunden habe.
Honza P.

Beachten Sie, dass Sie am Anfang von "Ihr Körper" eine leere Zeile benötigen, da sonst der Körper in den Kopfzeilen verschwindet oder die Nachricht möglicherweise vollständig unterbrochen wird. Siehe auch Hinweise an anderer Stelle zum Vermeiden uuencodezugunsten von MIME.
Tripleee

Und die monströsen evalund mysteriösen Backticks rund um die ganze Erfindung sind hier völlig unnötig.
Tripleee

0

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 Klartextkörper haben können.

Wenn noch nicht installiert, ausführen

sudo apt install mailutils

0

Abhängig von Ihren Mail-Befehlsoptionen (überprüfen Sie dies mit man mail) und der Version, die Sie ausführen können

echo yourBody|mail -s yoursubject -A /your/attachment/file john@doe.com


Dies scheint vorhandene Antworten zu duplizieren, ohne etwas Neues hinzuzufügen. Insbesondere ist die -AOption spezifisch für die GNU- mailutilsVersion von, mailwie in meiner Antwort erwähnt, sowie für @
rumpels

-1

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*
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.