Làm cách nào để gửi tệp dưới dạng tệp đính kèm email bằng dòng lệnh Linux?


289

Tôi đã tạo một tập lệnh chạy mỗi đêm trên máy chủ Linux của mình, sử dụng mysqldumpđể sao lưu từng cơ sở dữ liệu MySQL của tôi vào các tệp .sql và gói chúng lại với nhau dưới dạng tệp .tar được nén. Bước tiếp theo tôi muốn thực hiện là gửi tệp tar đó qua email đến một máy chủ email từ xa để giữ an toàn. Tôi đã có thể gửi tập lệnh thô trong cơ thể một email bằng cách chuyển tệp văn bản sao lưu sang mailxnhư vậy:

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

catlặp lại văn bản của tệp sao lưu được dẫn vào mailxchương trình với địa chỉ email của người nhận được chuyển qua làm đối số.

Mặc dù điều này thực hiện được những gì tôi cần, tôi nghĩ rằng nó có thể tốt hơn một bước, Có cách nào không, sử dụng tập lệnh shell hay nói cách khác là gửi tệp .tar nén đến một email gửi đi dưới dạng tệp đính kèm ? Điều này sẽ đánh bại việc phải xử lý các thư email rất dài có chứa dữ liệu tiêu đề và thường có vấn đề bao bọc từ, v.v.


1
Bạn có thể chia sẻ tập lệnh sao lưu cơ sở dữ liệu MySQL của bạn không?
Almino Melo

Xin lỗi, tôi đã không làm điều này trong một thời gian. Tôi biết nó liên quan đến việc gọi mysqldumpvà sau đó đính kèm đầu ra vào một email (với mutt). Tôi thậm chí có thể có một bước nén đầu ra thành zip / tar.gz ...
Kit Roed

1
Hoàn toàn tò mò, tại sao gửi email sao lưu của bạn so với scp hoặc rsync chúng?
jchook

Câu trả lời:


298

Không ai trong số những người mutt làm việc cho tôi. Nó đã nghĩ rằng địa chỉ email là một phần của tài liệu đính kèm. Phải làm:

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

1
Tôi đang sử dụng mutt 1.5.21 (2010-09-15) và nó yêu cầu -một thông số phải có sau email người nhận
Nurettin

Làm việc cho tôi bằng Mutt 1.5.24 (2015-08-30) trên openSUSE Leap 42.1.
Antonio Vinicius Menezes Medei

3
@fugitive có nghĩa là "kết thúc các tùy chọn". Hãy xem unix.stackexchange.com/questions/11376/ từ
rynop

Có cách nào để kiểm tra ngoại lệ và thử lại gửi không?
ti034

79

Hoặc, thất bại mutt:

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

26
Điều này sẽ gửi phần uuencoding nội tuyến và không phải là một tệp đính kèm . Nhiều ứng dụng thư nhận ra điều này mặc dù và hiển thị phần uuencoding dưới dạng tệp đính kèm.
FuePi

4
Đừng sử dụng uuencode trong thời đại ngày nay. MIME phức tạp hơn một chút nhưng thân thiện với người dùng hơn rất nhiều.
tripleee

@DavidGiven: Xem ví dụ (bằng cách lướt qua nhanh) tất cả các câu trả lời khác cho câu hỏi này.
tripleee

6
Không ai trong số họ sử dụng thư!
David đưa ra

Sau đó, ví dụ stackoverflow.com/questions/3317174/ và thay thế text/htmlbằng bất kỳ loại MIME nào có ý nghĩa cho tệp đính kèm của bạn. (Đối với ví dụ cụ thể này, tôi đoán vậy application/gzip.)
tripleee

43

Tùy thuộc vào phiên bản linux của bạn, nó có thể được gọi là mail. Để trích dẫn @David ở trên:

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

hoặc cũng:

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

@ KarelBílek: Còn lựa chọn khác thì sao?
Nathan Fellman

Cả hai giải pháp đều không hiệu quả với tôi. Tôi đã nhận được email với triển vọng 2013 và thư chỉ chứa tên tệp
niken715

2
trang của tôi có nội dung:-a, --append=HEADER: VALUE append given header to the message being sent
shoutuma

2
Nathan, có vẻ như trích dẫn của bạn từ David là sai - anh ấy đã sử dụng muttlệnh, không phải mail. Cũng như những người khác đã chỉ ra, mutt bây giờ dường như yêu cầu một --đối số trước địa chỉ. Và tôi thấy rằng @exhuma và tôi thực sự đồng ý về -alựa chọn mailđó là gì - tôi đã bối rối ở đó trong một phút;)
nealmcb

7
thay vì -a bạn nên sử dụng -A: -a, --append=HEADER: VALUE append given header to the message being sent -A, --attach=FILE attach FILE
Victor Perov

41

Từ việc xem xét man mailx, chương trình mailx không có tùy chọn để đính kèm tệp. Bạn có thể sử dụng một chương trình khác như mutt.

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

Tùy chọn dòng lệnh cho mutt có thể được hiển thị với mutt -h.


Cảm ơn! Đó là một mánh khóe, tôi đã gặp khó khăn khi bị mutt làm hành động một cách im lặng.
Kit Roed

10
Xem câu trả lời dưới đây ( stackoverflow.com/a/9524359/10608 ) vì rõ ràng cú pháp đã thay đổi cho mutt mà bây giờ yêu cầu a --.
Alexander Bird

29

Tôi sử dụng SendEmail, được tạo cho kịch bản này. Nó được đóng gói cho Ubuntu nên tôi cho rằng nó có sẵn

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/


Tôi tin rằng, nó phải là "sendEmail" thay vì "sendemail" trong ví dụ của bạn.
Davit

1
Có và không - nguồn (caspian) sử dụng chữ E viết hoa, trong khi đây là chiến lược đặt tên không phổ biến cho các công cụ dòng lệnh (trong thế giới Unix), ít nhất là bao bì Ubuntu của phần mềm này cung cấp cả sendemailsendEmailtrong /usr/bin/.
Fredrik Wendt

Xubfox 14.04.3 của tôi chưa được cài đặtSendEmail
Vitaly Zdanevich

3
"sudo apt install sendemail" để cài đặt sendemail và thêm "-f mand mand@email.com" một lệnh bắt buộc từ trường để lệnh hoạt động. sendemail -f mandatory@email.com-t to@some.one -m "Here are your files!" -a file1.jpg file2.zip
Sailendra Pinupolu

28

Tôi sử dụng mpack.

mpack -s subject file user@example.com

Thật không may, mpack không nhận ra '-' là bí danh cho stdin. Nhưng công việc sau đây và có thể dễ dàng được bọc trong một bí danh (shell) hoặc tập lệnh:

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

Điều này có thể làm việc trong bash cho stdin. Tôi không có mpack, vì vậy tôi chưa thử: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
Đây phải là câu trả lời được chấp nhận. Sử dụng mailx mặc định và hoạt động hoàn hảo. Mutt v1.5.21 từ chối gửi tệp đính kèm> 1MB khi sử dụng cron.
Giuse

Tôi đã tìm kiếm một cái gì đó hoạt động trong EC2 và điều này hoạt động tốt.
số ít

6
mailxkhông được chuẩn hóa đúng. Bất kỳ câu trả lời nào đề nghị nó nên chỉ ra cảnh báo này. Có ít nhất ba biến thể không tương thích được sử dụng phổ biến.
tripleee

13

Tôi đã từng viết hàm này cho ksh trên Solaris (sử dụng Perl để mã hóa 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
Trên GNU / Linux, người ta có thể sử dụng base64lệnh thay vì perl để mã hóa
MestreLion

12

Bạn có thể sử dụng mutt để gửi email với tệp đính kèm

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

2
Ít nhất là từ mutt 1.5.21 (Ubuntu đáng tin cậy), bạn cần đặt -atùy chọn sau người nhận : mutt -s "Backup" backup@email.com -a mysqldbbackup.sql < message.txt, hoặc sử dụng --tùy chọn trước người nhận như trong câu trả lời của rynop.
nealmcb

10

Gửi email nội dung Plaintext với một tệp đính kèm bản rõ với mailx:

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

Dưới đây là lệnh tương tự như trên, không có dòng mới

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

Đảm bảo rằng bạn có một tệp /home/el/attachfile.txtđược xác định với nội dung này:

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

Nếu bạn không có uuencode, hãy đọc nó: /unix/16277/how-do-i-get-uuencode-to-work

Trên Linux, Gửi email thân HTML với tệp đính kèm PDF bằng sendmail:

Hãy chắc chắn rằng bạn đã cài đặt ksh: yum info ksh

Hãy chắc chắn rằng bạn đã cài đặt sendmail và cấu hình.

Đảm bảo bạn đã cài đặt uuencode và có sẵn: /unix/16277/how-do-i-get-uuencode-to-work

Tạo một tệp mới được gọi test.shvà đặt nó vào thư mục chính của bạn:/home/el

Đặt mã sau vào 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

Thay đổi các biến xuất trên đầu trang test.shđể phản ánh địa chỉ và tên tệp của bạn.

Tải xuống một tài liệu pdf kiểm tra và đặt nó vào /home/elđược gọi là pdf-test.pdf

Tạo một tệp có tên /home/el/email_body.htm và đặt dòng này vào đó:

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

Đảm bảo tệp pdf có đủ 755 quyền.

Chạy kịch bản ./test.sh

Kiểm tra hộp thư đến email của bạn, văn bản phải ở định dạng HTML và tệp pdf tự động được hiểu là tệp nhị phân. Cẩn thận không sử dụng chức năng này nhiều hơn 15 lần mỗi ngày, ngay cả khi bạn gửi email cho chính mình, các bộ lọc thư rác trong gmail có thể đưa vào danh sách đen một email phun mà không cho bạn tùy chọn để cho phép chúng thông qua. Và bạn sẽ thấy điều này không còn hoạt động nữa, hoặc nó chỉ cho phép thông qua tệp đính kèm hoặc email hoàn toàn không thông qua. Nếu bạn phải thực hiện nhiều thử nghiệm về vấn đề này, hãy trải đều chúng trong nhiều ngày hoặc bạn sẽ bị gắn mác là người gửi thư rác và chức năng này sẽ không hoạt động nữa.


1
Đối với tôi nó làm việc theo cách khác. (echo 'Email Body'; uuencode filename filename) | mailx -s 'Subject' user@domain.com
Vicky

uuencodekhông phải là một tập tin đính kèm. Nó chỉ đơn giản là nhúng một đốm văn bản có thể đọc được ở giữa một số văn bản khác. Nó từng hoạt động tốt khi không có cơ chế nào tốt hơn, nhưng đó là hơn 20 năm trước.
tripleee

9

Có một số câu trả lời ở đây gợi ý mailhoặc mailxvì vậy đây là một nền tảng để giúp bạn diễn giải những điều này trong ngữ cảnh.

Ghi chú lịch sử

Nguồn gốc của Unix mailquay trở lại vào lịch sử ban đầu của Bell Labs Unix ™ (1969?), Và có lẽ chúng ta không thể hy vọng đi vào gia phả đầy đủ của nó ở đây. Có thể nói rằng có nhiều chương trình kế thừa mã từ hoặc thực hiện lại (hoặc kế thừa mã từ việc triển khai lại) mailvà không có cơ sở mã duy nhất nào có thể được xác định rõ ràng là "the" mail.

Tuy nhiên, một trong những ứng cử viên cho vị trí đó chắc chắn là "Berkeley Mail" ban đầu được gọi Mailbằng chữ hoa M trong 2BSD (1978); nhưng trong 3BSD (1979), nó cũng thay thế maillệnh viết thường , dẫn đến một số nhầm lẫn mới. SVR3 (1986) bao gồm một dẫn xuất được gọi là mailx. Có xlẽ đã được thêm vào để làm cho nó độc đáo và khác biệt; nhưng điều này cũng đã được sao chép, thực hiện lại và cắt xén để không có phiên bản riêng lẻ nào là dứt khoát.

Trước đây, tiêu chuẩn thực tế để gửi nhị phân qua thư điện tử là uuencode. Nó vẫn tồn tại, nhưng có nhiều vấn đề về khả năng sử dụng; thay vào đó, nếu bạn có thể, bạn nên gửi tệp đính kèm MIME, trừ khi bạn đặc biệt cố gắng để có thể liên lạc với cuối những năm 1980.

MIME được giới thiệu vào đầu những năm 1990 để giải quyết một số vấn đề với email, bao gồm hỗ trợ cho nhiều loại nội dung khác ngoài văn bản đơn giản trong một bộ ký tự duy nhất thực sự phù hợp với một tập hợp tiếng Anh (và, chúng tôi được biết, Hawaii ). Điều này đã giới thiệu hỗ trợ cho các thông điệp nhiều phần, quốc tế hóa, các loại nội dung phong phú, v.v. và nhanh chóng đạt được lực kéo trong suốt những năm 1990.

(Các ghi chú gia truyền mail/ mailxlịch sử là hữu ích nhất khi soạn bài này, và chắc chắn đáng để đọc nếu bạn thuộc loại đó.)

Chào hàng hiện tại

Kể từ năm 2018, Debian có ba gói bao gồm một mailhoặc một mailxlệnh. (Bạn có thể tìm kiếm 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

(Tôi không sử dụng Debian như một đề xuất; đó là những gì tôi sử dụng, vì vậy tôi quen với nó và nó cung cấp một phương tiện để phân biệt rõ ràng các lựa chọn thay thế khác nhau bằng cách tham khảo các tên gói tương ứng của chúng. Đây rõ ràng cũng là bản phân phối Ubuntu có các gói này.)

  • bsd-mailxlà một tương đối đơn giản mailxkhông xuất hiện để hỗ trợ gửi tệp đính kèm MIME. Xem trang hướng dẫn của nó và lưu ý rằng đây là trang bạn muốn tìm thấy trên hệ thống * BSD, bao gồm MacOS, theo mặc định.
  • heirloom-mailxhiện đang được gọi s-nailkhông hỗ trợ gửi tệp đính kèm MIME với -a. Xem trang hướng dẫn của nó và nói chung là dự án Gia truyền
  • mailutilsaka GNU Mailutils bao gồm một mail/ mailxkhả năng tương thích wrapperkhông hỗ trợ gửi file đính kèm với MIME-A

Với những lo ngại này, nếu bạn cần mã của mình để có thể di động và có thể phụ thuộc vào gói hơi phức tạp, cách đơn giản để gửi các tệp đính kèm MIME có thể sử dụng là sử dụng mutt.


Ban đầu tôi đã đăng bài này dưới dạng câu trả lời cho một câu hỏi trùng lặp phổ biến vừa phải stackoverflow.com/questions/902591/
mẹo

4

Một cách khác - Swaks (Swiss Army Knife for 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 có công cụ metasend

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

Điều này từng được cài đặt ở hầu hết mọi nơi, nhưng hầu như không bao giờ được sử dụng. Bởi vì nó không được biết đến trong một thời gian dài (và vẫn là AFAIK), nó đã bị xóa khỏi bộ công cụ tiêu chuẩn thực tế trên nhiều nền tảng.
tripleee

2

Tôi đã sử dụng

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

và điều này làm việc tốt cho tôi ....


1

Tôi thường chỉ sử dụng lệnh mail trên RHEL. Tôi đã thử mailx và nó khá hiệu quả.

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

This is the content of my msg.

.

1

con đường ngắn nhất đối với tôi là

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

vì vậy ví dụ của bạn sẽ là

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

phần tốt là tôi có thể gọi lại bằng Ctrl + r để gửi tệp khác ...


Niềng răng sẽ không giúp bạn nhiều nhưng để hoàn toàn di động, bạn nên sử dụng dấu ngoặc kép xung quanh các biến. Xem thêm stackoverflow.com/questions/10067266/
Mạnh

1

Từ máy nguồn

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

Trên máy đích. Lưu phần thân thư đã nhận dưới dạng db.sql.gz.b64 ; sau đó..

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

0

Chỉ cần thêm 2 xu của tôi, tôi sẽ viết Script PHP của riêng mình:

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

Có rất nhiều cách để thực hiện tệp đính kèm trong các ví dụ trên trang đó.


2
Không phải mọi máy chủ có thể đã cài đặt PHP. Nếu bạn thực sự muốn đi xuống đường dẫn "viết kịch bản của riêng bạn", thì perl hoặc python phù hợp hơn nhiều vì chúng thường có sẵn theo mặc định.
shoutuma

shthậm chí còn phổ biến hơn. Có những câu hỏi trùng lặp với câu trả lời với các ví dụ tốt; đây là của tôi.
tripleee

0

mailxhiện có một -atùy chọn cho các tệp đính kèm.


2
Tùy chọn "-a" dành cho các tiêu đề
Yves Martin

man mail [x], phiên bản 12.5 ngày 10/9/10 (một vài năm trước) nói rõ ràng -a tập tin Đính kèm tập tin đã cho vào tin
nhắn.`

4
một số phiên bản mailxlàm. Tôi tin rằng có hai triển khai. Một mặt -alà cho các tệp đính kèm, mặt khác là cho các tiêu đề.
shoutuma

1
Phiên bản của mailx trong Ubuntu đến từ GNU và có nghĩa là thêm một tiêu đề. manpages.ubfox.com/manpages/lucid/en/man1/mailx.1.html Hệ thống nào và mailx nào đính kèm?
nealmcb

3
Trong triển khai mới, "-a" dành cho Tiêu đề và "-A" dành cho mục đích
Avi Mehenwal

0

Không phải là một phương thức để gửi email, nhưng bạn có thể sử dụng máy chủ Git trực tuyến (ví dụ Bitbucket hoặc một dịch vụ tương tự) cho điều đó.

Bằng cách này, bạn có thể sử dụng git pushcác lệnh và tất cả các phiên bản sẽ được lưu trữ theo cách được nén và có tổ chức.


0

Đây là cách tôi đang thực hiện với một tệp nhật ký lớn trong 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

Tại sao bạn xác định WHOAMIHOSTNAME hai lần?
David C. Rankin

Điều này có một số sai lầm kiểu mã hóa vỏ. shellcheck.net sẽ chỉ ra một số, nhưng không phải tất cả, trong số họ.
tripleee

0

Nếu tệp là văn bản, bạn có thể gửi nó dễ nhất trong phần thân như:

sendmail recipient@example.com < message.txt

1
Điều này không gửi nó dưới dạng tệp đính kèm hoặc thậm chí dưới dạng nội dung thư. Sendmail hy vọng đầu vào của nó là một thông điệp email RFC5322 hoàn chỉnh, được định dạng tốt và có thể thất bại theo những cách thú vị nếu không.
tripleee

0

sử dụng lệnh mailx

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

sử dụng 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 là ví dụ hay, rất vui vì tôi đã tìm thấy nó ở đây.
Honza P.

Lưu ý rằng bạn cần một dòng trống khi bắt đầu "cơ thể của bạn", nếu không, cơ thể sẽ biến mất trong các tiêu đề hoặc có thể phá vỡ hoàn toàn thông điệp. Cũng xem ghi chú ở nơi khác về việc tránh uuencodeủng hộ MIME.
tripleee

Và các evalbackticks quái dị và bí ẩn xung quanh toàn bộ cỗ máy là hoàn toàn không cần thiết ở đây.
tripleee

0

Mailutils làm cho nó một miếng bánh

echo "Body" | mail.mailutils -M -s "My Subject" -A attachment.pdf mail@example.org
  • -A file đính kèm một tập tin
  • -M kích hoạt MIME, để bạn có thể có phần đính kèm và phần thân văn bản.

Nếu chưa cài đặt, hãy chạy

sudo apt install mailutils

0

Tùy thuộc vào các tùy chọn lệnh thư của bạn (kiểm tra nó với man mail) và phiên bản bạn có thể làm

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


Điều này dường như trùng lặp các câu trả lời hiện có mà không cần thêm bất cứ điều gì mới, đáng chú ý nhất là -Atùy chọn dành riêng cho mailutilsphiên bản GNU mailnhư đã được chỉ ra trong câu trả lời của tôi cũng như @ rumpel's
tripleee

-1

Nếu mutt không hoạt động hoặc không được cài đặt, hãy thử điều này-

*#!/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*
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.