ฉันจะส่งไฟล์เป็นไฟล์แนบอีเมลโดยใช้บรรทัดคำสั่ง Linux ได้อย่างไร


289

ฉันได้สร้างสคริปต์ที่ทำงานทุกคืนบนเซิร์ฟเวอร์ Linux ของฉันที่ใช้mysqldumpในการสำรองฐานข้อมูล MySQL ของฉันแต่ละไฟล์เป็น. sql และจัดทำแพคเกจรวมกันเป็นไฟล์. tar ที่บีบอัด ขั้นตอนต่อไปที่ฉันต้องการทำให้สำเร็จคือการส่งไฟล์ tar ผ่านอีเมลไปยังเซิร์ฟเวอร์อีเมลระยะไกลเพื่อความปลอดภัย ฉันสามารถส่งสคริปต์ดิบในอีเมลโดยการไพพ์ไฟล์ข้อความสำรองmailxให้เป็นดังนี้:

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

catechoes ข้อความของไฟล์สำรองข้อมูลซึ่งถูกส่งเข้าไปในmailxโปรแกรมโดยที่อยู่อีเมลของผู้รับถูกส่งเป็นอาร์กิวเมนต์

แม้ว่าสิ่งนี้จะบรรลุสิ่งที่ฉันต้องการ แต่ฉันคิดว่ามันน่าจะดีขึ้นไปอีกขั้นหนึ่งมีวิธีใช้เชลล์สคริปต์หรือส่งไฟล์. tar ที่บีบอัดไปยังข้อความอีเมลขาออกเป็นไฟล์แนบหรือไม่ เรื่องนี้จะต้องจัดการกับข้อความอีเมลที่ยาวมากซึ่งมีข้อมูลส่วนหัวและมักจะมีปัญหาการตัดคำ


1
คุณสามารถแชร์สคริปต์ที่สำรองฐานข้อมูล MySQL ของคุณได้หรือไม่?
Almino Melo

ขออภัยฉันไม่ได้ทำสิ่งนี้มาระยะหนึ่งแล้ว ฉันรู้ว่ามันเกี่ยวข้องกับการเรียกใช้mysqldumpแล้วแนบผลลัพธ์ไปยังอีเมล (พร้อมmutt) ฉันอาจมีขั้นตอนที่บีบอัดผลลัพธ์ไปยัง zip / tar.gz เช่นกัน ...
Kit Roed

1
อยากรู้อยากเห็นอย่างแท้จริงว่าทำไมอีเมลสำรองข้อมูลของคุณ vs scp หรือ rsync พวกเขา?
jchook

คำตอบ:


298

ไม่มี mutt อันใดที่เหมาะกับฉัน มันคิดว่าที่อยู่อีเมลเป็นส่วนหนึ่งของสิ่งที่แนบ ต้องทำ:

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

1
ฉันใช้ mutt 1.5.21 (2010-09-15) และต้องการ -a พารามิเตอร์หลังจากอีเมลผู้รับ
nurettin

ทำงานให้ฉันโดยใช้ Mutt 1.5.24 (2015-08-30) บน openSUSE Leap 42.1
Antonio Vinicius Menezes Medei

3
@fugitive หมายถึง "end of options" ดูที่unix.stackexchange.com/questions/11376/…
rynop

มีวิธีตรวจสอบข้อยกเว้นและลองส่งซ้ำหรือไม่
ti034

79

หรือล้มเหลว mutt:

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

26
นี้จะส่งส่วน uuencoded อินไลน์และไม่ได้เป็นสิ่งที่แนบมา ไคลเอนต์เมลจำนวนมากรู้จักสิ่งนี้และแสดงส่วนที่เป็น uuencoded เป็นไฟล์แนบ
FuePi

4
อย่าใช้ uuencode ในวันนี้และอายุ MIME นั้นซับซ้อนกว่าเล็กน้อย แต่ใช้งานง่ายกว่ามาก
tripleee

@DavidGiven: ดูตัวอย่าง (โดยเร็ว) คำตอบอื่น ๆ ทั้งหมดสำหรับคำถามนี้
tripleee

6
ไม่มีพวกเขาใช้จดหมาย!
เดวิดให้

จากนั้นเช่นstackoverflow.com/questions/3317174/…และแทนที่text/htmlด้วย MIME ประเภทใดก็ตามที่เหมาะสมกับไฟล์แนบของคุณ (สำหรับตัวอย่างที่เป็นรูปธรรมนี้ฉันเดาว่าapplication/gzip)
tripleee

43

อาจเรียกว่าเมล หากต้องการอ้างอิง @David ด้านบน:

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

หรือยัง:

cat message.txt | mail -s "Backup" -a mysqldbbackup.sql backup@email.com 

@ KarelBílek: แล้วตัวเลือกอื่นล่ะ?
Nathan Fellman

โซลูชันทั้งสองไม่ได้ผลสำหรับฉัน ฉันได้รับอีเมลพร้อม Outlook 2013 และอีเมลมีชื่อไฟล์เท่านั้น
Nickel715

2
manpage ของฉันอ่าน:-a, --append=HEADER: VALUE append given header to the message being sent
exhuma

2
นาธานก็ดูเหมือนว่าคำพูดของคุณจากดาวิดเป็นผิด - เขาใช้คำสั่งไม่ได้mutt mailเช่นเดียวกับคนอื่น ๆ ได้ชี้ให้เห็นตอนนี้โง่ดูเหมือนจะต้องมีการ--โต้แย้งก่อนที่อยู่ และฉันเห็นว่า @ exhuma และฉันเห็นด้วยกับสิ่งที่-aตัวเลือกmailทำ - ฉันสับสนที่นั่นเป็นเวลาหนึ่งนาที)
nealmcb

7
แทนที่จะเป็น -a คุณควรใช้ -A: -a, --append=HEADER: VALUE append given header to the message being sent -A, --attach=FILE attach FILE
Victor Perov

41

จากการดูman mailxโปรแกรม mailx ไม่มีตัวเลือกสำหรับแนบไฟล์ คุณสามารถใช้โปรแกรมอื่นเช่น mutt

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

mutt -hตัวเลือกบรรทัดคำสั่งสำหรับคนโง่จะแสดงให้เห็นด้วย


ขอบคุณ! นั่นเป็นกลอุบายที่ฉันมีปัญหาในการปิดเสียงให้กระทำการกระทำอย่างเงียบ ๆ
Kit Roed

10
ดูคำตอบด้านล่าง ( stackoverflow.com/a/9524359/10608 ) --เพราะเห็นได้ชัดว่าไวยากรณ์การเปลี่ยนแปลงสำหรับคนโง่ซึ่งตอนนี้ต้องใช้
Alexander Bird

29

ฉันใช้ SendEmail ซึ่งสร้างขึ้นสำหรับสถานการณ์นี้ มันบรรจุสำหรับ Ubuntu ดังนั้นฉันคิดว่ามันใช้ได้

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/


ฉันเชื่อว่าควรเป็น "sendEmail" แทนที่จะเป็น "sendemail" ในตัวอย่างของคุณ
Davit

1
ใช่และไม่ - แหล่งที่มา (แคสเปี้ย) ใช้ตัวพิมพ์ใหญ่ E ขณะนี้เป็นกลยุทธ์ที่ผิดปกติตั้งชื่อสำหรับเครื่องมือบรรทัดคำสั่ง (ในโลกที่ใช้ระบบปฏิบัติการยูนิกซ์) อย่างน้อยบรรจุภัณฑ์อูบุนตูของซอฟต์แวร์นี้มีทั้งsendemailและในsendEmail /usr/bin/
Fredrik Wendt

My Xubuntu 14.04.3 ยังไม่ได้ติดตั้งSendEmail
Vitaly Zdanevich

3
"sudo apt install sendemail" เพื่อติดตั้ง sendemail และเพิ่ม "-f ข้อบังคับ@email.com" ฟิลด์บังคับจากฟิลด์เพื่อให้คำสั่งทำงาน sendemail -f mandatory@email.com-t to@some.one -m "Here are your files!" -a file1.jpg file2.zip
Sailendra Pinupolu

28

ฉันใช้ mpack

mpack -s subject file user@example.com

น่าเสียดายที่ mpack ไม่รู้จัก '-' เป็นชื่อแทน stdin แต่งานต่อไปนี้และสามารถห่อในนามแฝง (เชลล์) หรือสคริปต์ได้อย่างง่ายดาย:

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

สิ่งนี้สามารถทำงานในทุบตีสำหรับ stdin ฉันไม่มี mpack ดังนั้นฉันจึงไม่ได้ลอง: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
นี่ควรเป็นคำตอบที่ยอมรับได้ ใช้ mailx เริ่มต้นและทำงานได้อย่างสมบูรณ์ Mutt v1.5.21 ปฏิเสธที่จะส่ง> ไฟล์แนบ 1MB เมื่อใช้ cron
โจเซฟ

ฉันกำลังมองหาบางอย่างที่ทำงานใน EC2 และทำงานได้ดี
เอกพจน์

6
mailxไม่ได้มาตรฐานอย่างถูกต้อง คำตอบใด ๆ ที่แนะนำว่าควรชี้ให้เห็นข้อแม้นี้ มีอย่างน้อยสามรูปแบบที่เข้ากันไม่ได้ในการใช้งานทั่วไป
tripleee

13

ฉันเคยเขียนฟังก์ชันนี้สำหรับ ksh บน Solaris (ใช้ Perl สำหรับการเข้ารหัส 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
}

8
บน GNU / Linux ผู้ใช้หนึ่งอาจใช้base64คำสั่งแทนที่จะเป็น Perl สำหรับการเข้ารหัส
MestreLion

12

คุณสามารถใช้muttเพื่อส่งอีเมลพร้อมไฟล์แนบ

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

2
อย่างน้อยที่สุดของ mutt 1.5.21 (Ubuntu เชื่อถือ) คุณต้องใส่-aตัวเลือกหลังผู้รับ: mutt -s "Backup" backup@email.com -a mysqldbbackup.sql < message.txtหรือใช้--ตัวเลือกก่อนผู้รับตามที่แสดงในคำตอบของ rynop
nealmcb

10

ส่งอีเมลเนื้อหา Plaintext พร้อมไฟล์แนบข้อความธรรมดาพร้อมกับ mailx:

(
  /usr/bin/uuencode attachfile.txt myattachedfilename.txt; 
  /usr/bin/echo "Body of text"
) | mailx -s 'Subject' youremail@gmail.com

ด้านล่างเป็นคำสั่งเดียวกับข้างต้นโดยไม่มีการขึ้นบรรทัดใหม่

( /usr/bin/uuencode /home/el/attachfile.txt myattachedfilename.txt; /usr/bin/echo "Body of text" ) | mailx -s 'Subject' youremail@gmail.com

ตรวจสอบให้แน่ใจว่าคุณได้/home/el/attachfile.txtกำหนดไฟล์ด้วยเนื้อหานี้:

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

หากคุณไม่มี uuencode ให้อ่าน: /unix/16277/how-do-i-get-uuencode-to-work

บน Linux ส่งอีเมลเนื้อหา HTML ที่มีไฟล์แนบ PDF พร้อม sendmail:

ตรวจสอบให้แน่ใจว่าคุณติดตั้ง ksh แล้ว: yum info ksh

ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งและกำหนดค่า sendmail แล้ว

ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งและพร้อมใช้งาน uuencode แล้ว: /unix/16277/how-do-i-get-uuencode-to-work

สร้างไฟล์ใหม่ชื่อtest.shและวางไว้ในโฮมไดเร็กตอรี่ของคุณ:/home/el

ใส่รหัสต่อไปนี้ใน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

เปลี่ยนตัวแปรส่งออกที่ด้านบนของ test.shเพื่อแสดงที่อยู่และชื่อไฟล์ของคุณ

ดาวน์โหลดเอกสารทดสอบ PDF แล้ววางใน/home/elชื่อ pdf-test.pdf

ทำไฟล์ชื่อ /home/el/email_body.htm แล้วใส่บรรทัดนี้เข้าไป

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

ตรวจสอบให้แน่ใจว่าไฟล์ pdf มีสิทธิ์เพียงพอ 755

เรียกใช้สคริปต์ ./test.sh

ตรวจสอบกล่องจดหมายของคุณข้อความควรอยู่ในรูปแบบ HTML และไฟล์ pdf ตีความโดยอัตโนมัติว่าเป็นไฟล์ไบนารี ระวังอย่าใช้ฟังก์ชั่นนี้มากกว่าพูด 15 ครั้งต่อวันแม้ว่าคุณจะส่งอีเมลถึงตัวคุณเองตัวกรองสแปมใน gmail สามารถขึ้นบัญชีดำกับโดเมนที่ส่งอีเมลโดยไม่ต้องให้คุณเลือก และคุณจะพบว่ามันใช้งานไม่ได้อีกต่อไปหรือใช้ได้เฉพาะไฟล์แนบหรืออีเมลไม่ผ่านเลย หากคุณต้องทำการทดสอบหลายอย่างให้กระจายออกไปหลายวันหรือคุณจะติดป้ายว่าเป็นผู้ส่งสแปมและฟังก์ชั่นนี้จะไม่ทำงานอีกต่อไป


1
สำหรับฉันมันทำงานในทางตรงกันข้าม (echo 'Email Body'; uuencode filename filename) | mailx -s 'Subject' user@domain.com
Vicky

uuencodeคือไม่ถูกต้องสิ่งที่แนบมา มันเพียงฝังหยดข้อความที่คอมพิวเตอร์อ่านได้กลางข้อความอื่น ๆ มันเคยทำงานได้ดีเมื่อไม่มีกลไกที่ดีกว่านี้ แต่เมื่อ 20+ ปีก่อน
tripleee

9

มีคำตอบหลายคำแนะนำไว้ที่นี่mailหรือmailxดังนั้นจึงเป็นพื้นหลังมากกว่าที่จะช่วยคุณตีความสิ่งเหล่านี้ในบริบท

บันทึกทางประวัติศาสตร์

ต้นกำเนิดของ Unix mailกลับเข้าไปในหมอกแห่งประวัติศาสตร์ยุคแรก ๆ ของ Bell Labs Unix ™ (1969?) และเราอาจไม่หวังว่าจะได้ลำดับวงศ์ตระกูลของมันที่นี่ เพียงพอที่จะบอกว่ามีหลายโปรแกรมที่รับรหัสจากหรือนำไปใช้ใหม่ (หรือรับรหัสจากการปรับใช้ใหม่) mailและไม่มีฐานรหัสเดียวที่สามารถระบุได้อย่างไม่น่าสงสัยว่าเป็น "the"mail""

อย่างไรก็ตามหนึ่งในผู้แข่งขันในตำแหน่งนั้นคือ "Berkeley Mail" ซึ่ง แต่เดิมเรียกว่าMailด้วยตัวพิมพ์ใหญ่ M ใน 2BSD (1978); แต่ใน 3BSD (1979) จะแทนที่mailคำสั่งตัวพิมพ์เล็กเช่นกันซึ่งนำไปสู่ความสับสนใหม่ SVR3 (1986) mailxรวมถึงตราสารอนุพันธ์ซึ่งถูกเรียกว่า xก็คงจะเพิ่มเพื่อให้มันไม่ซ้ำกันและแตกต่างกัน; แต่ตอนนี้ก็ถูกคัดลอกนำมาใช้ใหม่และทำให้เสียหายเพื่อที่ว่าจะไม่มีเวอร์ชั่นเดี่ยวที่ชัดเจน

ย้อนกลับไปในวันที่พฤตินัยuuencodeมาตรฐานสำหรับการส่งไบนารีผ่านจดหมายอิเล็กทรอนิกส์เป็น มันยังคงมีอยู่ แต่มีปัญหาการใช้งานมากมาย ถ้าเป็นไปได้คุณควรส่งไฟล์แนบ MIME แทนเว้นแต่คุณจะพยายามสื่อสารกับปลายทศวรรษ 1980 โดยเฉพาะ

MIMEถูกนำมาใช้ในต้นปี 1990 เพื่อแก้ไขปัญหาต่าง ๆ เกี่ยวกับอีเมลรวมถึงการสนับสนุนเนื้อหาประเภทต่าง ๆ นอกเหนือจากข้อความธรรมดาในชุดอักขระเดียวซึ่งเหมาะสำหรับชุดย่อยของภาษาอังกฤษเท่านั้น ) สิ่งนี้ได้นำเสนอการสนับสนุนสำหรับข้อความหลายส่วน, การทำให้เป็นสากล, ประเภทเนื้อหาสมบูรณ์, และอื่น ๆ และได้รับแรงฉุดอย่างรวดเร็วตลอดช่วงทศวรรษ 1990

(บันทึกHeirloom mail/ mailxบันทึกประวัติศาสตร์มีประโยชน์มากที่สุดเมื่อเขียนสิ่งนี้และแน่นอนว่าควรอ่านหากคุณอยู่ในประเภทนั้น)

ข้อเสนอปัจจุบัน

ตั้งแต่ปีพ. ศ. 2561 Debian มีแพ็คเกจสามชุดซึ่งรวมถึงคำสั่งmailหรือ mailx(คุณสามารถค้นหา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

(ฉันไม่ได้พูดภาษาเดเบียนเป็นคำแนะนำมันเป็นสิ่งที่ฉันใช้ดังนั้นฉันจึงคุ้นเคยกับมันและมันมีวิธีในการแยกแยะทางเลือกต่าง ๆ อย่างไม่น่าสงสัยโดยอ้างถึงชื่อแพ็คเกจของพวกเขา Ubuntu รุ่นใดที่ได้รับแพ็คเกจเหล่านี้)

  • bsd-mailxค่อนข้างง่ายmailxซึ่งดูเหมือนจะไม่รองรับการส่งไฟล์แนบ MIME ดูหน้าคู่มือและทราบว่านี่เป็นหน้าที่คุณคาดหวังว่าจะพบในระบบ * BSD รวมถึง MacOS โดยค่าเริ่มต้น
  • heirloom-mailxขณะนี้ถูกเรียกว่าs-nailและไม่-aสนับสนุนการส่งสิ่งที่แนบมาด้วยไมม์ ดูหน้าคู่มือและอื่น ๆ โดยทั่วไปโครงการ Heirloom
  • mailutilsaka GNU Mailutilsรวมถึงmail/ mailxwrapper เข้ากันได้ซึ่งจะสนับสนุนการส่งไฟล์แนบ MIME ด้วย-A

ด้วยความกังวลเหล่านี้ถ้าคุณต้องการรหัสของคุณจะเป็นแบบพกพาและสามารถขึ้นอยู่กับแพคเกจที่ค่อนข้างซับซ้อนวิธีง่ายๆในการ portably ส่งไฟล์แนบ MIME คือการใช้งานmutt


ฉันโพสต์สิ่งนี้เป็นคำตอบสำหรับคำถามซ้ำซ้อนที่ได้รับความนิยมในระดับปานกลางstackoverflow.com/questions/902591/…
tripleee

4

อีกทางเลือกหนึ่ง - Swaks (Swiss Army Knife สำหรับ 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 มีเครื่องมือ metasend

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

สิ่งนี้เคยติดตั้งเกือบทุกที่ แต่แทบจะไม่เคยใช้เลย เนื่องจากมันไม่ได้ถูกลบออกเป็นเวลานาน (และยังคงเป็น AFAIK) จึงถูกลบออกจากชุดเครื่องมือมาตรฐานแบบพฤตินัยบนแพลตฟอร์มจำนวนมาก
tripleee


1

ฉันมักจะใช้คำสั่ง mail กับ RHEL ฉันลอง mailx แล้วและมันก็ค่อนข้างมีประสิทธิภาพ

mailx -s "Sending Files" -a First_LocalConfig.conf -a
Second_LocalConfig.conf Recipient@myemail.com

This is the content of my msg.

.

1

วิธีที่สั้นที่สุดสำหรับฉันคือ

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

ดังนั้นสำหรับตัวอย่างของคุณมันจะเป็น

file=your_sql.log;gzip -c $file;uuencode ${file}.gz ${file}|mail -s "file with magnets" ph.gachoud@gmail.com

ส่วนที่ดีคือฉันสามารถเรียกคืนได้ด้วยCtrl + rเพื่อส่งไฟล์อื่น ...


เครื่องมือจัดฟันจะไม่ทำให้คุณเก่งนัก แต่การพกพาได้อย่างสมบูรณ์คุณควรใช้เครื่องหมายคำพูดคู่ล้อมรอบตัวแปร ดูstackoverflow.com/questions/10067266/…
tripleee

1

จากเครื่องต้นทาง

mysqldump --defaults-extra-file=sql.cnf database | gzip | base64 | mail me@myemail.com

บนเครื่องปลายทาง บันทึกเนื้อหาของจดหมายที่ได้รับเป็นdb.sql.gz.b64 ; แล้ว ..

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

0

เพียงเพิ่ม 2 เซ็นต์ของฉันฉันจะเขียนสคริปต์ PHP ของตัวเอง:

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

มีหลายวิธีที่จะทำสิ่งที่แนบมาในตัวอย่างในหน้านั้น


2
ไม่ใช่เซิร์ฟเวอร์ทุกตัวที่อาจติดตั้ง PHP หากคุณต้องการลงเส้นทาง "เขียนสคริปต์ของคุณเอง" จริงๆแล้ว perl หรือ python จะเหมาะสมกว่าเพราะปกติแล้วจะพร้อมใช้งาน
exhuma

shเป็นที่แพร่หลายมากขึ้น มีคำถามซ้ำซ้อนกับคำตอบพร้อมตัวอย่างที่ดี; นี่คือของฉัน
tripleee

0

mailxจะมี-aตัวเลือกตอนนี้สำหรับสิ่งที่แนบมา


2
ตัวเลือก "-a" สำหรับส่วนหัว
Yves Martin

man mail [x], รุ่น 12.5 จาก 10/9/10 (ไม่กี่ปีที่ผ่านมา) พูดอย่างชัดเจนว่าไฟล์ -a แนบไฟล์ที่ได้รับไปยังข้อความ "
fche

4
บางรุ่นmailxที่ต้องทำ ฉันเชื่อว่ามีสองการใช้งาน ที่หนึ่ง-aคือสำหรับสิ่งที่แนบมาในอื่น ๆ มันเป็นส่วนหัว
exhuma

1
เวอร์ชันของ mailx ใน Ubuntu มาจาก GNU และ -a หมายถึงเพิ่มส่วนหัว manpages.ubuntu.com/manpages/lucid/en/man1/mailx.1.html ระบบใดและ mailx ใดที่แนบมา?
nealmcb

3
ในการติดตั้งใหม่ "-a" สำหรับส่วนหัวและ "-A" สำหรับการติดตั้ง
Avi Mehenwal

0

ไม่ใช่วิธีการส่งอีเมล แต่คุณสามารถใช้เซิร์ฟเวอร์ Git ออนไลน์ (เช่น Bitbucket หรือบริการที่คล้ายกัน) ได้

ด้วยวิธีนี้คุณสามารถใช้git pushคำสั่งและทุกรุ่นจะถูกจัดเก็บในรูปแบบที่ถูกบีบอัดและจัดระเบียบ


0

นี่คือวิธีที่ฉันทำกับไฟล์บันทึกขนาดใหญ่หนึ่งไฟล์ใน 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

เหตุใดคุณจึงกำหนดWHOAMIและHOSTNAME สองครั้ง
David C. Rankin

นี่มีข้อผิดพลาดสไตล์การเข้ารหัสเชลล์หลายประการ shellcheck.netจะชี้ให้เห็นบางอย่าง แต่ไม่ใช่ทั้งหมด
tripleee

0

หากไฟล์เป็นข้อความคุณสามารถส่งไฟล์ได้ง่ายที่สุดในเนื้อความ:

sendmail recipient@example.com < message.txt

1
สิ่งนี้ไม่ส่งเป็นสิ่งที่แนบมาหรือแม้กระทั่งเป็นเนื้อหาของข้อความ Sendmail คาดว่าอินพุตจะเป็นข้อความอีเมล RFC5322 ที่สมบูรณ์และมีรูปแบบที่ดีและอาจล้มเหลวในรูปแบบที่น่าสนใจหากไม่มี
tripleee

0

ใช้คำสั่ง mailx

 echo "Message Body Here" | mailx -s "Subject Here" -a file_name user@example.com

ใช้ 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 เป็นตัวอย่างที่ดีดีใจที่ฉันพบที่นี่
Honza P.

โปรดทราบว่าคุณต้องมีบรรทัดว่างเปล่าที่จุดเริ่มต้นของ "ร่างกายของคุณ" มิฉะนั้นร่างกายจะหายไปในส่วนหัวหรืออาจทำลายข้อความทั้งหมด ดูบันทึกอื่น ๆ เกี่ยวกับการหลีกเลี่ยงuuencodeMIME ด้วย
tripleee

และevalbackticks ที่น่ากลัวและลึกลับรอบการคุมกำเนิดทั้งหมดนั้นไม่จำเป็นโดยสิ้นเชิงที่นี่
tripleee

0

Mailutils ทำให้เค้กชิ้นนี้

echo "Body" | mail.mailutils -M -s "My Subject" -A attachment.pdf mail@example.org
  • -A file แนบไฟล์
  • -M เปิดใช้งาน MIME เพื่อให้คุณสามารถมีสิ่งที่แนบและเนื้อความธรรมดา

หากยังไม่ได้ติดตั้งให้รัน

sudo apt install mailutils

0

ขึ้นอยู่กับตัวเลือกคำสั่งเมลของคุณ (ตรวจสอบด้วยman mail) และเวอร์ชันที่คุณสามารถทำได้

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


ดูเหมือนว่าจะซ้ำคำตอบที่มีอยู่โดยไม่ต้องเพิ่มอะไรใหม่โดยเฉพาะอย่างยิ่ง-Aตัวเลือกที่เฉพาะเจาะจงกับmailutilsเวอร์ชันGNU ของmailที่ได้กล่าวไว้ในคำตอบของฉันเช่นเดียวกับ @ rumpel's
tripleee

-1

หาก mutt ไม่ทำงานหรือไม่ได้ติดตั้งลองสิ่งนี้ -

*#!/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*
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.