it-swarm-vi.com

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

mail -s "subject" [email protected] <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 mail là gì?

71
pyth0ner

Có nhiều phiên bản khác nhau của mail xung quanh. Khi bạn vượt xa mail -s subject [email protected] [email protected] <body (Để gửi, đó là tất cả POSIX đảm bảo - và thậm chí -s Không tồn tại trong 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ố triển khai mailx, ví dụ: từ mailutils trên Ubunt hoặc bsd-mailx , thật dễ dàng, vì có một tùy chọn cho điều đó.

    mailx -a 'Content-Type: text/html' -s "Subject" [email protected] <test.html
    
  • Với Gia truyềnmailx , 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=1 Và sử dụng trình chỉnh sửa 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" [email protected] <<EOF
    ~e
    .
    EOF
    rm -f "$temp_script"
    
  • Với một vị tướng POSIX mailx , tôi không biết cách lấy tiêu đề.

Nếu bạn sẽ sử dụng bất kỳ mail hoặ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, mailmailx coi các dòng bắt đầu bằng ~ Làm lệnh. Nếu bạn chuyển văn bản thành 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 định cài đặt phần mềm, bạn cũng có thể cài đặt thứ gì đó 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 tùy chọn -H, nhưng không phải Content-Type , cần được đặt thông qua tùy chọn mutt.

mutt -e 'set content_type=text/html' -s 'hello' '[email protected]' <test.html

Hoặc bạn có thể gọi trực tiếp sendmail. Có một số phiên bản của sendmail ngoài kia, nhưng tất cả chúng đề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ọ không hỗ trợ Bcc:.) Trên hầu hết các hệ thống, sendmail không có trong $PATH Thông thường, nó nằm trong /usr/sbin Hoặc /usr/lib.

cat <<'EOF' - test.html | /usr/sbin/sendmail -t
To: [email protected]
Subject: hello
Content-Type: text/html

EOF
#!/bin/sh

(
echo "To: [email protected]"
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
14
Code Improver

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

mailx -s "$(echo -e "Newsletter issue 3\nContent-Type: text/html")" [email protected] < /tmp/htmlmail.txt

Cảm ơn, Anh chàng
[.__.] Đã thử nghiệm trên Fedora 17 và đã hoạt động

7
daniel

Bạn sẽ phải thêm Content-Type tiê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" [email protected]

sẽ làm việc

5
Noufal Ibrahim

Với heirloom-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 [email protected]

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" [email protected] < test.html

Phương pháp này hiệu quả hơn đề 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.

3
loentar

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

#!/bin/ksh

(
echo "To: [email protected]"
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
1
Bhabatosh

Đố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")" [email protected]

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 Mã hóa chuyển nội dung: 7 bit [.__.] [.__.] Value1 Value2

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

0
Vaibhav

Được đăng trong một chủ đề khác nhưng về cơ bản trên phiên bản mail/mailx (12.5+) của chúng tôi, tham số -a cho thư không hoạt động nữa vì nó thêm tệp đính kèm và tôi không thể tìm thấy bất kỳ tham số thay thế nào cho các tiêu đề bổ sung vì vậy cách dễ nhất cho tôi đã sử dụng sendmail.

Dưới đây là 1 lớp lót đơn giản mà tôi đã tạo để chạy trong tập lệnh bash phù hợp với chúng tôi. Về cơ bản, nó chỉ vượt qua Kiểu nội dung: văn bản/html, chủ đề và nội dung và tác phẩm.

printf "Content-Type: text/html\nSubject: Test Email\nHTML BODY<b>test bold</b>" | sendmail <Email Address To>

Nếu bạn muốn tạo toàn bộ trang html từ một biến, một phương thức thay thế mà tôi đã sử dụng trong tập lệnh bash là truyền vào biến như dưới đây.

emailBody="From: <Email Address From>
Subject: Test
Content-Type: text/html; charset=\"us-ascii\"
<html>
<body>
body
<b> test bold</b>

</body>
</html>
"
echo "$emailBody" | sendmail <Email Address To>
0
Miburi