Làm cách nào để gửi email HTML bằng lệnh 'mail' linux?


66

mail -s "subject" xxxxx@gmail.com <test.html hoạt động, nhưng chỉ cho email văn bản đơn giản.

Cách chính xác để gửi email HTML bằng lệnh Linux là mailgì?

Câu trả lời:


61

Có nhiều phiên bản khác nhau mailxung quanh. Khi bạn đi xa hơn mail -s subject to1@address1 to2@address2 <body(để gửi, đó là tất cả các đảm bảo POSIX - và thậm chí -skhông tồn tại trong những ngày xưa ), họ có xu hướng có các tùy chọn dòng lệnh khác nhau. Thêm một tiêu đề bổ sung không phải lúc nào cũng dễ dàng.

  • Với một số mailxtriển khai, ví dụ như từ mailutilstrên Ubuntu hoặc Debianbsd-mailx , thật dễ dàng, bởi vì có một tùy chọn cho điều đó.

    mailx -a 'Content-Type: text/html' -s "Subject" to@address <test.html
    
  • Với Gia truyền mailx , không có cách nào thuận tiện. Một khả năng để chèn các tiêu đề tùy ý là đặt editheaders=1và sử dụng trình soạn thảo bên ngoài (có thể là tập lệnh).

    ## Prepare a temporary script that will serve as an editor.
    ## This script will be passed to ed.
    temp_script=$(mktemp)
    cat <<'EOF' >>"$temp_script"
    1a
    Content-Type: text/html
    .
    $r test.html
    w
    q
    EOF
    ## Call mailx, and tell it to invoke the editor script
    EDITOR="ed -s $temp_script" heirloom-mailx -S editheaders=1 -s "Subject" to@address <<EOF
    ~e
    .
    EOF
    rm -f "$temp_script"
    
  • Với một POSIXmailx chung , tôi không biết làm thế nào để có được tiêu đề.

Nếu bạn sẽ sử dụng bất kỳ mailhoặc mailx, hãy nhớ rằng

  • Đây không phải là di động ngay cả trong một bản phân phối Linux nhất định. Ví dụ, cả Ubuntu và Debian đều có một vài lựa chọn thay thế cho mailmailx.
  • Khi soạn tin nhắn mailmailxxử lý các dòng bắt đầu bằng ~các lệnh. Nếu bạn chuyển văn bản vào mail, bạn cần sắp xếp để văn bản này không chứa các dòng bắt đầu bằng ~.

Nếu bạn vẫn sẽ cài đặt phần mềm, bạn cũng có thể cài đặt một cái gì đó dễ dự đoán hơn mail/ Mail/ mailx. Ví dụ, mutt . Với Mutt, bạn có thể cung cấp hầu hết các tiêu đề trong đầu vào với -Htùy chọn, nhưng khôngContent-Type , cần phải được đặt thông qua tùy chọn mutt.

mutt -e 'set content_type=text/html' -s 'hello' 'to@address' <test.html

Hoặc bạn có thể gọi sendmailtrực tiếp. Có một số phiên bản sendmailngoài kia, nhưng tất cả đều hỗ trợ sendmail -tđể gửi thư theo cách đơn giản nhất, đọc danh sách người nhận từ thư. (Tôi nghĩ rằng tất cả họ đều không hỗ trợ Bcc:.) Trên hầu hết các hệ thống, sendmailkhông phải thông thường $PATH, nó nằm trong /usr/sbinhoặc /usr/lib.

cat <<'EOF' - test.html | /usr/sbin/sendmail -t
To: to@address
Subject: hello
Content-Type: text/html

EOF

Đã thử sử dụng ví dụ mutt ở trên; thay thế các giá trị thực cho tên tệp, thành địa chỉ email, v.v. nhưng nhận được "Không có người nhận được chỉ định" Tôi rất mới đối với mutt, @Gilles bạn có biết tại sao điều đó có thể xảy ra không? (sư tử núi osx, mutt 1.5,21 được cài đặt qua homebrew)
Chuck van der Linden

dòng thứ hai của tôi là "To: myaddress@mycompany.com" (xin lỗi vì thiếu định dạng, không thể trả lời, văn bản thực tế là trích dẫn sans) và tôi đã bao gồm một dòng trống trước khi đưa vào EOF. Có cấu hình nào tôi cần làm để mutt không? trước khi thử ví dụ bạn đã đưa ra (với các giá trị phù hợp được thay thế), tất cả những gì tôi đã làm là 'brew install mutt'
Chuck van der Linden

@ChuckvanderLinden Đặt câu hỏi mới. Sao chép-dán chính xác lệnh bạn đã chạy và thông báo lỗi đầy đủ. Xem nếu bạn có thể gửi email từ mutt bằng giao diện tương tác.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi đã có thể gửi một cái gì đó qua giao diện 'tương tác', ban đầu nó phàn nàn về một thư mục thư bị thiếu và đề nghị tạo ra nó. nhắc nhở tôi ghét vim đến mức nào ;-) nhưng đã gửi nó đi. Tôi sẽ bắt đầu một câu hỏi mới vì nó dễ định dạng hơn, v.v. Thông báo lỗi chính xác chỉ là những gì tôi nói "Không có người nhận được chỉ định."
Chuck van der Linden


13
#!/bin/sh

(
echo "To: me@example.com"
echo "Subject: hello"
echo "Content-Type: text/html"
echo
echo "<html><b><font size='7'>H</font>ello</b></html>"
echo
) | /usr/sbin/sendmail -t

5
Điều đó không sử dụng thường xuyên mail.

3
@ user16144 Không, nhưng đó là một lựa chọn tốt mà OP có thể muốn xem xét.
trusktr

Vâng, nó không sử dụng thư nhưng nó hoạt động ở mọi nơi tôi đã thử nó nhiều hơn những gì tôi có thể nói cho các giải pháp khác.
user1683793

Hoạt động tốt trên Mac là tốt.
Asim Jalis

7

Với mailx gia truyền, cách thuận tiện là

mailx -s "$(echo -e "Newsletter issue 3\nContent-Type: text/html")" user@server.com < /tmp/htmlmail.txt

Cảm ơn, Dude đã
thử nghiệm trên Fedora 17, và đã làm việc


1
Táo bạo. Tôi thích nó. : -]
Alastair Irvine

1
Coi chừng giải pháp này có thể dẫn đến email có cả "Loại nội dung: văn bản / html" và "Loại nội dung: văn bản / đơn giản" và sự không nhất quán tiềm năng nếu bạn sử dụng cách này để chỉ định bộ ký tự.
Skippy le Grand Gourou

5

Bạn sẽ phải thêm Content-Typetiêu đề vào email của bạn để thực hiện điều này.

echo "<html><b>Hello</b></html>" | mail -a "Content-type: text/html;" -s "Testing" me@example.com

sẽ làm việc


2
mail: tùy chọn bất hợp pháp - a
pyth0ner

Bạn có mailxkhông Điều đó có thể có tùy chọn. Nếu điều đó không làm việc. Nếu điều đó không hiệu quả, bạn có thể cân nhắc sử dụng mutt mặc dù tôi không biết tay dòng lệnh sẽ làm gì.
Noufal Ibrahim

1
nếu thư không cắt mù tạt, hãy sử dụng python ... docs.python.org/l Library / email- example.html ví dụ là ví dụ thứ 3 hoặc # 6 phù hợp với yêu cầu của bạn.
sdolgy

Python sẽ yêu cầu bạn viết (và duy trì) một tập lệnh. Một dòng lệnh một lót có lợi thế khác nhau.
Noufal Ibrahim

Tôi có mailx, nhưng "tùy chọn -a" không hoạt động, vẫn hiển thị: mail: tùy chọn bất hợp pháp - a
pyth0ner

3

Với gia truyền-mailx, bạn có thể thay đổi chương trình sendmail thành tập lệnh hook của mình, thay thế các tiêu đề ở đó và sau đó sử dụng sendmail.

Kịch bản tôi sử dụng ( ~/bin/sendmail-mailx-hook):

#!/bin/bash

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

Tập lệnh này thay đổi các giá trị trong tiêu đề thư như sau:

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

Để gửi email HTML:

mailx -Ssendmail='~/bin/sendmail-mailx-hook' -s "subject" xxxxx@gmail.com < test.html

Phương pháp này hiệu quả hơn so với đề xuất của @Gilles vì ​​nó không tạo các tệp tạm thời và chỉ sửa lỗi khi đang di chuyển.


1

Tôi đã sử dụng các kịch bản dưới đây để xảy ra

#!/bin/ksh

(
echo "To: yourmail@domain.com"
echo "Subject: Job Status"
echo "Content-Type: text/html"
echo
echo "<html>
<head>
<title>Status of the jobs during the day</title>
<style>
table, th, td {
    border: 1px solid blue;
    border-collapse: collapse;
}
th, td {
    padding: 5px;
}
</style>
</head>
<body>
<table style='width:100%'>
<tr bgcolor='#808080'>
    <th>Job Name</th>
    <th>System name</th>
    <th>Status</th>
  </tr>
  <tr>
    <td>Job-1</td>
    <td>Sys</td>
    <td>Sucess</td>
  </tr>
  <tr>
    <td>Job-2</td>
    <td>sys</td>
    <td>Failure</td>
  </tr>
  <tr>
    <td>Job-3</td>
    <td>sys</td>
    <td>Sucess</td>
  </tr>
 </table>
</body></html>"
echo
) | /usr/sbin/sendmail -t

0

Đối với tôi, tôi cần chỉ định một biến như máy chủ SMTP, vì vậy lệnh mail hoạt động theo kiểu bên dưới. Tôi đã tìm kiếm trên nhiều bài viết, và tôi tìm thấy bên dưới tài sản để chuyển đổi nội dung thành văn bản / html. Bây giờ email tôi nhận được ở định dạng HTML.

Bố trí nội dung: nội tuyến

Phiên bản Unix: Red Hat Enterprise Linux Server phát hành 6.6 (Santiago)

Đầu tiên. Tạo bất cứ thông tin nào là cần thiết vào một tập lệnh (testSql.sh)

echo "<html><body><pre>"
mysql -u USERNAME -pPASSWORD -P PORTNUMBER -h HOSTNAME DBNAME --table -e "select columns from tablename where member in ('value1','value2')"
echo "</pre></body></html>"

Thứ hai. Đặt đoạn script đó vào lệnh mail

./testSql.sh  | mail -v -S smtp=smtp://IP:PORTNUMBER -s "$(echo -e "This is the subject\nContent-Type: text/ht ml\nMIME-Version: 1.0\nContent-Disposition: inline")" userid@email.com

Bằng cách này, tôi nhận được thông tin như dưới đây trong email:

Bố trí nội dung: Nội dung Tin nhắn-ID: Tác nhân người dùng: Gia truyền mailx 12.4 7/29/08 MIME-Phiên bản: 1.0 Loại nội dung: văn bản / thuần túy; charset = us-ascii Nội dung-Chuyển-Mã hóa: 7 bit

Giá trị1 Giá trị2

Value1 và Value2 theo cách gắn thẻ HTML được thực hiện trong testSql.sh


-5
cat htmlfile.html | mail -s "subject" xx@example.com

5
Không. Điều này sẽ gửi một email văn bản với HTML trong cơ thể.
Noufal Ibrahim
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.