2010-04-07 41 views
48

Tôi cần gửi email có định dạng html. Tôi chỉ có dòng lệnh linux và lệnh "mail".Cách gửi email HTML bằng cách sử dụng dòng lệnh linux

Hiện nay đã sử dụng:

echo "To: [email protected]" > /var/www/report.csv 
echo "Subject: Subject" >> /var/www/report.csv 
echo "Content-Type: text/html; charset=\"us-ascii\"" >> /var/www/report.csv 

echo "<html>" >> /var/www/report.csv 
mysql -u ***** -p***** -H -e "select * from users LIMIT 20" dev >> /var/www/report.csv 
echo "</html>" >> /var/www/report.csv 

mail -s "Built notification" [email protected] < /var/www/report.csv 

Nhưng trong thư đại diện của tôi tôi nhận được chỉ đơn giản/văn bản.

alt text

+0

Độc giả của câu trả lời cho câu hỏi này hãy cẩn thận: có những chương trình khác nhau được gọi là 'mail', ví dụ' gia truyền-mailx' và 'bsd-mailx' trên jessie Debian . Nếu một lệnh 'mail' từ một câu trả lời ở đây không có tác dụng với bạn, có thể bạn đang sử dụng sai' mail'. Tham khảo trình quản lý gói của phân phối để cài đặt gói đúng và sử dụng tên cụ thể của nhị phân đó (ví dụ: 'bsd-mailx' trên Debian) để giải quyết vấn đề đó. Thông tin chi tiết về vấn đề này tại đây: http://heirloom.sourceforge.net/mailx_history.html –

Trả lời

1

bạn nên sử dụng "thêm" chế độ chuyển hướng >> thay vì >

+0

xin lỗi, đây là mã cũ. Tôi đã sưa nó. –

+8

Tôi nghĩ rằng điều này nên có được một bình luận, không phải là một câu trả lời. –

2

Hãy thử với:

echo "To: [email protected]" > /var/www/report.csv 
echo "Subject: Subject" >> /var/www/report.csv 
echo "MIME-Version: 1.0" >> /var/www/report.csv 
echo "Content-Type: text/html; charset=\"us-ascii\"" >> /var/www/report.csv 
echo "Content-Disposition: inline" >> /var/www/report.csv 

echo "<html>" >> /var/www/report.csv 
mysql -u ***** -p***** -H -e "select * from users LIMIT 20" dev >> /var/www/report.csv 
echo "</html>" >> /var/www/report.csv 

mail -s "Built notification" [email protected] < /var/www/report.csv 
+0

Điều này không hoạt động. $ lsb_release -a phân phối ID: \t Ubuntu Mô tả: \t Ubuntu 10.04.4 LTS phát hành: \t 10,04 Codename: \t sáng suốt – lrkwz

+0

@Simone, đây không phải làm việc một cách hoàn hảo bởi vì trật tự của ** MIME-Version * * và ** Nội dung-Tye **. Bạn cần đặt thông tin này trước ** Subject ** để làm việc cho hầu hết các hương vị unix/linux. –

5

Vấn đề là khi chuyển hướng một tập tin vào 'mail' như thế, nó chỉ được sử dụng cho nội dung thư. Bất kỳ tiêu đề nào bạn nhúng vào tệp sẽ đi vào nội dung thay thế.

Hãy thử:

mail --append="Content-type: text/html" -s "Built notification" [email protected] < /var/www/report.csv 

--append cho phép bạn thêm tiêu đề tùy ý để thư, đó là nơi bạn nên xác định các nội dung-type và nội dung bố trí. Không cần phải nhúng tiêu đề ToSubject vào tệp của bạn hoặc chỉ định chúng bằng --append, vì bạn đang đặt ngầm chúng trên dòng lệnh (-s là chủ đề và [email protected] sẽ tự động trở thành To).

+1

không có tùy chọn đó trên thư lệnh thư của tôi: tùy chọn không hợp lệ - a Cách sử dụng: thư [-iInv] [-s subject] [-c cc-addr] [-b bcc-addr] để thêm vào .. [- sendmail-options ...] thư [-iInNv] -f [name] mail [-iInNv] [-u user] –

+0

Tôi cũng không biết phiên bản/unix nào hỗ trợ tùy chọn này? – nylund

+0

@nylund: 'thư (GNU Mailutils 2.2)'. đây là tắt ubuntu 12.04, nhưng sẽ có trong phiên bản cũ là tốt, cho câu trả lời của gần 3 năm nay bây giờ. –

45

này đã làm việc cho tôi:

echo "<b>HTML Message goes here</b>" | mail -s "$(echo -e "This is the subject\nContent-Type: text/html")" [email protected] 
+5

không hoạt động đối với tôi ... các giải pháp dọn dẹp bên dưới – ftravers

+0

hoạt động trên OS X 10.8.4 – jobwat

+0

Tôi muốn nói đó là lỗi trong việc triển khai thư của OSX, mặc dù cần phải kết hợp với các lỗi khác để khai thác. Tôi chắc chắn rằng sẽ có một vài kịch bản web xung quanh mà không kiểm tra đúng cho vận chuyển trở lại trong những gì họ chèn vào dòng tiêu đề. – mc0e

35

phiên bản của tôi về thư không có --append và nó quá thông minh cho echo -e \n -trick (nó chỉ đơn giản là thay thế \ n với không gian). Nó hiện, tuy nhiên, có -a:

mail -a "Content-type: text/html" -s "Built notification" [email protected] < /var/www/report.html 
+0

Hoạt động trên ubuntu 14.04.1 LTS, thư thiết lập để bsd-mailx – kidmose

+0

tôi sử dụng theo cách này 'echo \' curl -L www.google.es \ '| mail -a "Nội dung trang web kiểu nội dung: văn bản/html" -s "email @ email.com' thay vì' <'. Để thuận tiện cho tôi, tôi tạo tập lệnh/usr/local/bin để bỏ qua phần lớn lệnh. Tôi chỉ sử dụng 'email wmail url' – erm3nda

16

Thực hiện một tập tin gọi là tmp.html và đưa dòng sau trong đó:

<b>my bold message</b> 

Sau đó dán bài này vào dòng lệnh: (với dấu ngoặc và tất cả các).

(
    echo To: [email protected] 
    echo From: [email protected] 
    echo "Content-Type: text/html; " 
    echo Subject: a logfile 
    echo 
    cat tmp.html 
) | sendmail -t 

Thư sẽ được gửi đi. Và thông báo xuất hiện đậm hơn thay vì với các thẻ <b>.

Nguồn:
How to send a html email with the bash command "sendmail"?

4

Trên OS X (10,9.4), cat tác phẩm, và dễ dàng hơn nếu email của bạn là đã có trong một tập tin:

cat email_template.html | mail -s "$(echo -e "Test\nContent-Type: text/html")" [email protected] 
+1

tìm trong máy chủ debian –

2

Với gia truyền-mailx bạn có thể thay đổi chương trình sendmail để kịch bản móc của bạn, thay thế tiêu đề đó và sau đó sử dụng sendmail.

Các kịch bản tôi sử dụng (~/bin/sendmail-hook):

#!/bin/bash 

sed '1,/^$/{ 
s,^\(Content-Type: \).*$,\1text/html; charset=utf-8,g 
s,^\(Content-Transfer-Encoding: \).*$,\18bit,g 
}' | sendmail [email protected] 

kịch bản này thay đổi các giá trị trong tiêu đề thư như sau:

  • Content-Type: để text/html; charset=utf-8
  • Content-Transfer-Encoding: để 8bit (không chắc chắn nếu điều này thực sự cần thiết).

Để gửi email HTML:

mail -Ssendmail='~/bin/sendmail-hook' \ 
    -s "Built notification" [email protected] < /var/www/report.csv 
+0

Vì một số lý do tôi không thể làm việc này trong một hàm, nhưng bạn thực sự có thể sử dụng nó như một tệp thực thi riêng biệt. Điều này làm việc khi các đề xuất khác trên trang này không. – bgStack15

+0

Bạn không thể lấy tác phẩm này làm chức năng vì quá trình gửi thư sinh ra không có quyền truy cập vào các chức năng trong tập lệnh bash của bạn – loentar

+0

[Không thể tìm hiểu cách thực hiện việc này với cuộc trò chuyện hoặc PM.] ? '. mail -Ssendmail = '~/bin/sendmail-hook' -s 'Chủ đề "[email protected] bgStack15

0

tôi đã phải vật lộn với vấn đề tương tự (với thư) trong một trong những móc post_receive git của tôi và cuối cùng tôi phát hiện ra, sendmail đó thực sự hoạt động tốt hơn cho rằng loại mọi thứ, đặc biệt là nếu bạn biết một chút về cách e-mail được xây dựng (và có vẻ như bạn biết). Tôi biết câu trả lời này đến rất muộn, nhưng có lẽ nó cũng sẽ có ích cho người khác. Tôi đã sử dụng toán tử heredoc và sử dụng tính năng, nó mở rộng các biến, vì vậy nó cũng có thể chạy các tập lệnh nội tuyến. Chỉ cần kiểm tra này ra (bash script):

#!/bin/bash 
recipients=(
    '[email protected]' 
    '[email protected]' 
# '[email protected]' 
); 
sender='[email protected]'; 
subject='Oh, who really cares, seriously...'; 
sendmail -t <<-MAIL 
    From: ${sender} 
    `for r in "${recipients[@]}"; do echo "To: ${r}"; done;` 
    Subject: ${subject} 
    Content-Type: text/html; charset=UTF-8 

    <html><head><meta charset="UTF-8"/></head> 
    <body><p>Ladies and gents, here comes the report!</p> 
    <pre>`mysql -u ***** -p***** -H -e "SELECT * FROM users LIMIT 20"`</pre> 
    </body></html> 
MAIL 

Note backticks ở phần MAIL để tạo ra một số lượng và ghi nhớ, rằng <<- dải điều hành duy nhất các tab (không gian) từ đầu dòng, vì vậy trong trường hợp đó sao chép-dán sẽ không hoạt động (bạn cần phải thay thế thụt lề bằng các tab thích hợp). Hoặc sử dụng toán tử << và hoàn toàn không thụt lề. Hy vọng điều này sẽ giúp một ai đó. Tất nhiên bạn có thể sử dụng backticks bên ngoài phần MAIL và lưu đầu ra vào một số biến, sau đó bạn có thể sử dụng trong phần MAIL - vấn đề về hương vị và khả năng đọc. Và tôi biết, #!/bin/bash không phải lúc nào cũng hoạt động trên mọi hệ thống.

0

Tôi đã tìm thấy một giải pháp thực sự dễ dàng: thêm vào lệnh thư sửa đổi -aContent-Type: text/html.

Trong trường hợp của bạn sẽ là:

mail -aContent-Type:text/html -s "Built notification" [email protected] < /var/www/report.csv 
Các vấn đề liên quan