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.
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]
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]
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
.
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]
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
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
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]
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
}
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
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ć.
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 prostymmailx
, 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 zawieramail
/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
.
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
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
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....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.
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.
.
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...
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
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.
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.
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
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
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 `;
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
.
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*
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