it-swarm-id.com

Bagaimana cara mengirim email HTML menggunakan perintah 'mail' linux?

mail -s "subject" [email protected] <test.html berfungsi, tetapi hanya untuk email teks biasa.

Apa cara yang benar untuk mengirim email HTML menggunakan perintah Linux mail?

71
pyth0ner

Ada banyak versi mail berbeda di sekitar. Ketika Anda melampaui mail -s subject [email protected] [email protected] <body (untuk pengiriman, itu saja POSIX jaminan - dan bahkan -s tidak ada di hari tua ), mereka cenderung memiliki opsi baris perintah yang berbeda. Menambahkan tajuk tambahan tidak selalu mudah.

  • Dengan beberapa implementasi mailx, mis. dari mailutils di Ubunt atau Debian's bsd-mailx , mudah, karena ada opsi untuk itu.

    mailx -a 'Content-Type: text/html' -s "Subject" [email protected] <test.html
    
  • Dengan Heirloommailx , tidak ada cara yang mudah. Satu kemungkinan untuk memasukkan header yang berubah-ubah adalah dengan mengatur editheaders=1 dan gunakan editor eksternal (yang bisa berupa skrip).

    ## 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"
    
  • Dengan seorang jenderal POSIX mailx , saya tidak tahu bagaimana mendapatkan header.

Jika Anda akan menggunakan mail atau mailx, ingatlah itu

  • Ini tidak portabel bahkan dalam distribusi Linux yang diberikan. Sebagai contoh, baik Ubuntu dan Debian memiliki beberapa alternatif untuk mail dan mailx.
  • Saat menulis pesan, mail dan mailx memperlakukan baris yang diawali dengan ~ sebagai perintah. Jika Anda menyalurkan teks ke mail, Anda perlu mengatur agar teks ini tidak mengandung baris yang diawali dengan ~.

Jika Anda tetap akan menginstal perangkat lunak, Anda mungkin juga menginstal sesuatu yang lebih dapat diprediksi daripada mail/Mail/mailx. Misalnya, mutt . Dengan Mutt, Anda dapat memasok sebagian besar header di input dengan -H pilihan, tetapi tidak Content-Type , yang perlu diatur melalui opsi mutt.

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

Atau Anda dapat memanggil sendmail secara langsung. Ada beberapa versi sendmail di luar sana, tetapi semuanya mendukung sendmail -t untuk mengirim surat dengan cara paling sederhana, membaca daftar penerima dari surat. (Saya pikir mereka tidak semua mendukung Bcc:.) Pada kebanyakan sistem, sendmail tidak seperti biasanya $PATH, ada di /usr/sbin atau /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

Dengan mailx Heirloom, cara yang mudah adalah

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

Terima kasih, Bung
Diuji pada Fedora 17, dan berhasil

7
daniel

Anda harus menambahkan Content-Type tajuk ke email Anda untuk mewujudkannya.

echo "<html><b>Hello</b></html>" | mail -a "Content-type: text/html;" -s "Testing" [email protected]

akan bekerja

5
Noufal Ibrahim

Dengan heirloom-mailx Anda dapat mengubah program sendmail menjadi skrip hook Anda, ganti header di sana dan kemudian gunakan sendmail.

Skrip yang saya gunakan (~/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]

Skrip ini mengubah nilai-nilai di header surat sebagai berikut:

  • Content-Type: hingga text/html; charset=utf-8
  • Content-Transfer-Encoding: hingga 8bit (tidak yakin apakah ini benar-benar diperlukan).

Untuk mengirim email HTML:

mailx -Ssendmail='~/bin/sendmail-mailx-hook' -s "subject" [email protected] < test.html

Metode ini lebih efektif daripada yang diusulkan oleh @Gilles karena tidak membuat file sementara dan hanya memperbaiki aliran on-the-fly.

3
loentar

Saya telah menggunakan skrip di bawah ini untuk terjadi

#!/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

Bagi saya saya perlu menentukan variabel seperti SMTP server, sehingga perintah mail bekerja dengan cara di bawah ini. Saya mencari di banyak posting, dan saya menemukan properti di bawah ini untuk mengubah tubuh menjadi teks/html. Sekarang email yang saya terima adalah dalam format HTML.

Content-Disposition: inline

Versi Unix: Red Hat Enterprise Linux Server rilis 6.6 (Santiago)

Pertama. Buat informasi apa pun yang diperlukan ke dalam skrip (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>"

Kedua. Pipa skrip itu ke perintah email

./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]

Dengan melakukan ini saya mendapatkan informasi seperti di bawah ini di email:

Content-Disposition: inline Pesan-ID: User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Versi: 1.0 Tipe-Konten: teks/polos; charset = us-ascii Content-Transfer-Encoding: 7bit 
 
 Value1 Value2

Value1 dan Value2 sesuai dengan penandaan HTML yang dilakukan di testSql.sh

0
Vaibhav

Diposting di utas lain tetapi pada dasarnya pada versi mail/mailx (12.5+), parameter -a untuk email tidak berfungsi lagi karena menambah lampiran dan saya tidak dapat menemukan parameter pengganti untuk header tambahan sehingga cara termudah untuk saya menggunakan sendmail.

Di bawah ini adalah 1 liner sederhana yang saya buat untuk dijalankan di skrip bash kami yang berfungsi untuk kami. Itu pada dasarnya hanya melewati Tipe-Konten: teks/html, subjek, dan tubuh dan bekerja.

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

Jika Anda ingin membuat seluruh halaman html dari suatu variabel metode alternatif yang saya gunakan dalam skrip bash adalah untuk melewatkan variabel seperti di bawah ini.

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