Jak wysłać plik jako załącznik e-mail za pomocą wiersza poleceń Linuksa?

Stworzyłem skrypt, który działa co noc na moim serwerze Linux, który używa mysqldump do tworzenia kopii zapasowych każdej z moich baz danych MySQL .pliki sql i pakuje je razem jako skompresowane .plik tar. Następnym krokiem, który chcę wykonać, jest wysłanie tego pliku TAR pocztą e-mail do zdalnego serwera poczty e-mail w celu zabezpieczenia. Udało mi się wysłać do skryptu raw wiadomość e-mail, przesyłając plik tekstowy kopii zapasowej do mailx w następujący sposób:

$ cat mysqldbbackup.sql | mailx [email protected]

cat odczytuje tekst pliku kopii zapasowej, który jest przesyłany do mailx program z adresem e-mail odbiorcy przekazanym jako argument.

Chociaż to spełnia to, czego potrzebuję, myślę, że może być o krok lepiej, Czy Jest jakiś sposób, używając skryptów powłoki lub w inny sposób, aby wysłać skompresowany .plik tar do wychodzącej wiadomości e-mail jako załącznik ? to byłoby lepsze niż radzenie sobie z bardzo długimi wiadomościami e-mail, które zawierają dane nagłówka i często mają problemy z zawijaniem słów itp.

Author: Braiam, 2008-08-20

25 answers

Żaden z tych Kundli nie pracował dla mnie. Myślałem, że adres e-mail jest częścią załącznika. Musiałem zrobić:

echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- [email protected]
 279
Author: rynop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-01 21:26:21

Lub, w przypadku braku kundla:

gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz  | mail -s "MySQL DB" [email protected]
 78
Author: Daniel Fone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-20 04:48:25

Patrząc na man mailx, program mailx nie ma opcji dołączania pliku. Możesz użyć innego programu, takiego jak mutt.

echo "This is the message body" | mutt -a file.to.attach -s "subject of message" [email protected]

Opcje wiersza poleceń dla mutt mogą być wyświetlane za pomocą mutt -h.

 40
Author: Chris N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-03 13:27:40

W zależności od wersji Linuksa może się ona nazywać mail. Cytuję @Dawid wyżej:

mail -s "Backup" -a mysqldbbackup.sql [email protected] < message.txt

Lub też:

cat message.txt | mail -s "Backup" -a mysqldbbackup.sql [email protected] 
 38
Author: Nathan Fellman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-29 07:56:25

Używam mpacka.

mpack -s subject file [email protected]

Niestety mpack nie rozpoznaje ' - ' jako aliasu dla stdin. Ale następująca praca i może być łatwo owinięta w alias (powłokę) lub skrypt:

mpack -s subject /dev/stdin [email protected] < file
 28
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-24 07:00:08

Używam SendEmail, który został stworzony do tego scenariusza. Jest pakowany Dla Ubuntu, więc zakładam, że jest dostępny

sendemail -f [email protected] -t [email protected] -m "Here are your files!" -a file1.jpg file2.zip

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

 26
Author: Fredrik Wendt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-18 19:44:27
 echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log [email protected]
 22
Author: Sourabh Potnis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-22 09:52:27

Napisałem kiedyś tę funkcję dla ksh na Solarisie (używa Perla do kodowania 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
}
 11
Author: glenn jackman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-03 14:48:42

Możesz użyć mutt Aby wysłać e-mail z załącznikiem

mutt -s "Backup" -a mysqldbbackup.sql [email protected] < message.txt
 10
Author: David Schlosnagle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-15 08:12:45

Wyślij wiadomość tekstową z jednym załącznikiem tekstowym za pomocą mailx:

(
  /usr/bin/uuencode attachfile.txt myattachedfilename.txt; 
  /usr/bin/echo "Body of text"
) | mailx -s 'Subject' [email protected]

Poniżej jest to samo polecenie jak powyżej, bez nowych linii

( /usr/bin/uuencode /home/el/attachfile.txt myattachedfilename.txt; /usr/bin/echo "Body of text" ) | mailx -s 'Subject' [email protected]

Upewnij się, że masz plik /home/el/attachfile.txt zdefiniowany z tą zawartością:

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

Jeśli nie masz uuencode przeczytaj to: https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work

W Linuksie Wyślij wiadomość e-mail w formacie HTML z załącznikiem PDF za pomocą sendmail:

Upewnij się, że masz ksh zainstalowane: yum info ksh

Upewnij się, że masz zainstalowany i skonfigurowany sendmail.

Upewnij się, że masz zainstalowany i dostępny uuencode: https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work

Utwórz nowy plik o nazwie test.sh i umieść go w katalogu domowym: /home/el

Wpisz w test.sh następujący kod:

#!/usr/bin/ksh
export MAILFROM="[email protected]"
export MAILTO="[email protected]"
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

Zmień zmienne eksportu na górze test.sh, aby odzwierciedlały Twój adres i nazwy plików.

Pobierz a przetestuj dokument pdf i umieść go w /home/el o nazwie pdf-test.pdf

Utwórz plik o nazwie / home / el / email_body.htm i umieścić w nim tę linię:

<html><body><b>this is some bold text</b></body></html>

Upewnij się, że plik pdf ma wystarczające uprawnienia 755.

Uruchom skrypt ./test.sh

Sprawdź swoją skrzynkę odbiorczą e-mail, tekst powinien być w formacie HTML, a plik pdf automatycznie interpretowany jako plik binarny. Uważaj, aby nie używać tej funkcji więcej niż powiedzmy 15 razy dziennie, nawet jeśli wysyłasz e-maile do siebie, spam filtry w Gmailu mogą umieszczać na czarnej liście domeny wysyłające e-maile bez możliwości ich przepuszczenia. I przekonasz się, że to już nie działa, albo przepuszcza tylko załącznik, albo e-mail w ogóle nie dociera. Jeśli musisz zrobić wiele testów na ten temat, rozłóż je na kilka dni lub zostaniesz oznaczony jako spamer i ta funkcja nie będzie już działać.

 9
Author: user1651561,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:36:30

Jest tu kilka odpowiedzi sugerujących mail lub mailx, więc jest to bardziej tło, które pomoże Ci zinterpretować je w kontekście.

Zapiski Historyczne

Początki Uniksa mail wróć do mgieł wczesnej historii Bell Labs Unix™ (1969?), i prawdopodobnie nie możemy mieć tu nadziei, że wejdziemy w jego pełną genealogię. Wystarczy powiedzieć, że istnieje wiele programów, które dziedziczą kod z reimplement (lub dziedziczą kod z reimplementacji) mail i że nie ma jednej bazy kodu, która może być jednoznacznie określona jako " the " mail.

Jednak jednym z pretendentów do tego stanowiska jest z pewnością "Berkeley Mail", który był pierwotnie nazywany Mail z wielką literą M W 2BSD (1978); ale w 3BSD (1979), zastąpił również małe litery mail, co doprowadziło do nowego zamieszania. SVR3 (1986) zawierał pochodną o nazwie mailx. x został prawdopodobnie dodany, aby uczynić go wyjątkowym i odrębnym; ale to również zostało kopiowane, reimplementowane i okaleczone tak, że nie ma jednej indywidualnej wersji, która jest ostateczna.

Kiedyś, de facto standard wysyłania binariów przez pocztę elektroniczną był uuencode. Pomimo tego, że MIME nadal istnieje, ma wiele problemów z użytecznością; jeśli w ogóle jest to możliwe, powinieneś wysyłać załączniki MIME, chyba że starasz się być w stanie komunikować się z późnymi latami 80.]}

MIME został wprowadzony na początku lat 90. do rozwiąż kilka problemów z pocztą e-mail, w tym obsługę różnych rodzajów treści innych niż zwykły tekst w jednym zestawie znaków, który naprawdę nadaje się tylko do podzbioru języka angielskiego (i, mówi się, Hawai'ian). W 1990 roku wprowadzono obsługę wiadomości wieloczęściowych, internacjonalizację, bogate typy treści itp.]}

(The Heirloom mail/mailx notatki historyczne były najbardziej pomocne przy komponowaniu tego, a na pewno warto je przeczytać, jeśli lubisz takie rzeczy.)

Aktualne Oferty

Od 2018 roku Debian posiada trzy pakiety zawierające polecenie mail lub mailx. (Możesz wyszukać 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

(nie wymieniam Debiana jako rekomendacji; używam go, więc jestem z nim zaznajomiony; i dostarcza on sposobu na jednoznaczne odróżnienie różnych alternatyw poprzez odniesienie się do ich nazw pakietów. Jest to oczywiście również distro z którego Ubuntu dostaje te paczki.)

  • bsd-mailx jest stosunkowo prostym mailx, który wydaje się , a nie wspierać wysyłanie załączników MIME. Zajrzyj na stronę podręcznika i zauważ, że jest to ta, którą domyślnie można znaleźć w systemie *BSD, w tym MacOS.
  • {[18] } jest teraz wywoływany s-nail i obsługuje wysyłanie załączników MIME za pomocą -a. Zobacz jego strona podręcznika i bardziej ogólnie projekt Heirloom
  • mailutils aka GNU Mailutils zawiera mail/mailx compatibility wrapper, który obsługuje wysyłanie załączników MIME za pomocą -A

Z tymi problemami, jeśli potrzebujesz, aby Twój kod był przenośny i mógł zależeć od nieco złożonego pakietu, prostym sposobem na przenośne wysyłanie załączników MIME jest użycie mutt.

 6
Author: tripleee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-02 17:35:21

Inna alternatywa - Swaks (szwajcarski nóż wojskowy do 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
 4
Author: Alexander Yancharuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-05 09:57:15

Metamail ma narzędzie metasend

metasend -f mysqlbackup.sql.gz -t [email protected] -s Backup -m application/x-gzip -b
 2
Author: Gunstick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 15:18:03

Użyłem

echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "[email protected]" 
I to zadziałało dobrze dla mnie....
 2
Author: poncho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-04 15:17:06

mailx posiada teraz opcję -a dla załączników.

 1
Author: Allan Pinto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-28 19:40:50

Zwykle używam tylko polecenia mail na RHEL. Próbowałem mailx i jest dość wydajny.

mailx -s "Sending Files" -a First_LocalConfig.conf -a
Second_LocalConfig.conf [email protected]

This is the content of my msg.

.
 1
Author: Alejandro Santillan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-28 16:22:20

Najkrótsza droga dla mnie jest

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

Więc dla Twojego przykładu będzie to

file=your_sql.log;gzip -c $file;uuencode ${file}.gz ${file}|mail -s "file with magnets" [email protected]

Dobre jest to, że mogę go przywołać za pomocą Ctrl + r, aby wysłać kolejny plik...

 1
Author: Pipo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-14 22:37:55

From source machine

mysqldump --defaults-extra-file=sql.cnf database | gzip | base64 | mail [email protected]

na maszynie docelowej. Zapisz otrzymaną treść wiadomości jako db.sql.gz.b64 ; wtedy..

base64 -D -i db.sql.gz.b64 | gzip -d | mysql --defaults-extra-file=sql.cnf
 1
Author: Konchog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-22 13:23:24

Żeby dodać moje 2 grosze, napisałbym własny skrypt PHP:

Http://php.net/manual/en/function.mail.php

Istnieje wiele sposobów wykonania załącznika w przykładach na tej stronie.

 0
Author: Mike Graf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-24 18:34:06

Nie jest to metoda wysyłania e-maili, ale możesz do tego użyć internetowego serwera Git (np. Bitbucket lub podobnej usługi).

W ten sposób można używać poleceń git push, a wszystkie wersje będą przechowywane w skompresowany i zorganizowany sposób.

 0
Author: Ben-Uri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-28 16:22:35

Tak robię z jednym dużym plikiem dziennika w CentOS:

MAIL="`whereis mail | awk '{print $2}'`"
WHOAMI="`whoami`"
HOSTNAME="`hostname`"
EMAIL"[email protected]"
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
 0
Author: dagorv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-06 11:23:29

Jeśli plik jest tekstowy, możesz go przesłać w treści jako:

sendmail [email protected] < message.txt
 0
Author: nurp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-23 11:33:39

Użycie polecenia mailx

 echo "Message Body Here" | mailx -s "Subject Here" -a file_name [email protected]

Korzystanie z sendmaila

#!/bin/ksh

fileToAttach=data.txt

`(echo "To: [email protected]"
  echo "Cc: [email protected]"
  echo "From: Application"
  echo "Subject: your subject"
  echo  your body
  uuencode $fileToAttach $fileToAttach
  )| eval /usr/sbin/sendmail -t `;
 0
Author: Girdhar Singh Rathore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-19 11:21:07

Jeszcze jedna rzecz o mutt: domyślnie używa Twojego adresu i nazwy w polu " From:". Jeśli to nie jest to, czego potrzebujesz, możesz utworzyć alternatywny plik muttrc zawierający taki ciąg znaków jak ten: set from = "My mail daemon"

Użyj tego pliku z opcją linii poleceń -F.

 -1
Author: arilou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-09 16:35:39

Jeśli mutt nie działa lub nie jest zainstalowany, spróbuj tego -

*#!/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*
 -1
Author: Paras Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-16 09:47:22