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

66

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?

pyth0ner
sumber

Jawaban:

61

Ada banyak versi berbeda mail. Ketika Anda melampaui mail -s subject to1@address1 to2@address2 <body(untuk mengirim, itu semua jaminan POSIX - dan bahkan -stidak ada di masa lalu ), mereka cenderung memiliki opsi baris perintah yang berbeda. Menambahkan tajuk tambahan tidak selalu mudah.

  • Dengan beberapa mailximplementasi, misalnya dari mailutilsUbuntu atau Debianbsd-mailx , mudah, karena ada opsi untuk itu.

    mailx -a 'Content-Type: text/html' -s "Subject" to@address <test.html
    
  • Dengan Heirloom mailx , tidak ada cara yang nyaman. Satu kemungkinan untuk memasukkan header yang berubah-ubah adalah dengan mengatur editheaders=1dan menggunakan 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" to@address <<EOF
    ~e
    .
    EOF
    rm -f "$temp_script"
    
  • Dengan POSIXmailx umum , saya tidak tahu cara mendapatkan header.

Jika Anda akan menggunakan mailatau mailx, ingatlah itu

  • Ini tidak portabel bahkan dalam distribusi Linux yang diberikan. Sebagai contoh, Ubuntu dan Debian memiliki beberapa alternatif untuk maildan mailx.
  • Saat menulis pesan, maildan mailxmemperlakukan baris yang dimulai dengan ~sebagai perintah. Jika Anda memasukkan teks ke dalam 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 -Hopsi, tetapi tidakContent-Type , yang perlu diatur melalui opsi mutt.

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

Atau Anda bisa memohon sendmaillangsung. Ada beberapa versi di sendmailluar sana, tetapi mereka semua mendukung sendmail -tuntuk mengirim surat dengan cara yang paling sederhana, membaca daftar penerima dari surat. (Saya pikir mereka tidak semua mendukung Bcc:.) Pada sebagian besar sistem, sendmailtidak seperti biasanya $PATH, ada di /usr/sbinatau /usr/lib.

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

EOF
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Sudah mencoba menggunakan contoh mutt di atas; mengganti nilai nyata untuk nama file, ke alamat email, dll. tetapi mendapat "Tidak ada penerima yang ditentukan" Saya sangat baru di mutt, @Gilles, tahukah Anda mengapa hal itu mungkin terjadi? (osx mountain singa, mutt 1.5.21 diinstal melalui homebrew)
Chuck van der Linden
baris kedua saya adalah "Kepada: [email protected]" (maaf karena tidak memformat, tidak mungkin dalam respons, teks yang sebenarnya adalah tanpa tanda kutip) dan saya memasukkan baris kosong sebelum memasukkan EOF. apakah akan ada konfigurasi yang perlu saya lakukan untuk mutt? sebelum mencoba contoh yang Anda berikan (dengan nilai yang tepat diganti) yang saya lakukan adalah 'brew install mutt'
Chuck van der Linden
@ChuckvanderLinden Ajukan pertanyaan baru. Salin-tempel perintah persis yang Anda jalankan dan pesan kesalahan lengkap. Lihat apakah Anda dapat mengirim email dari mutt menggunakan antarmuka interaktif.
Gilles 'SANGAT berhenti menjadi jahat'
Saya dapat mengirim sesuatu melalui antarmuka 'interaktif', awalnya mengeluh tentang direktori mail yang hilang dan menawarkan untuk membuatnya. mengingatkan betapa aku benci vim ;-) tetapi mendapatkannya untuk dikirim. Saya akan memulai pertanyaan baru karena lebih mudah untuk memformat dll. Pesan kesalahan yang tepat adalah apa yang saya katakan "Tidak ada penerima yang ditentukan."
Chuck van der Linden
Pertanyaan baru unix.stackexchange.com/questions/83137/…
Chuck van der Linden
13
#!/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
Peningkat Kode
sumber
5
Itu tidak digunakan secara akut mail.
3
@ user16144 Tidak, tapi ini adalah alternatif yang baik yang ingin dipertimbangkan oleh OP.
trusktr
Ya, itu tidak menggunakan surat tetapi bekerja di mana-mana saya telah mencobanya yang lebih dari yang bisa saya katakan untuk solusi lainnya.
user1683793
Bekerja dengan indah di Mac juga.
Asim Jalis
7

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 bekerja

daniel
sumber
1
Bermuka tebal. Saya suka itu. : -]
Alastair Irvine
1
Hati-hati bahwa solusi ini dapat menyebabkan email memiliki baik "Content-Type: text / html" dan "Content-Type: text / plain", dan inkonsistensi potensial jika Anda menggunakan cara ini untuk menentukan charset.
Skippy le Grand Gourou
5

Anda harus menambahkan Content-Typetajuk ke email Anda untuk mewujudkannya.

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

akan bekerja

Noufal Ibrahim
sumber
2
mail: opsi ilegal - a
pyth0ner
Apakah Anda memiliki mailx? Itu mungkin memiliki opsi. Jika itu tidak berhasil. Jika itu tidak berhasil, Anda dapat mempertimbangkan menggunakan mutt meskipun saya tidak tahu apa yang harus dilakukan oleh baris perintah.
Noufal Ibrahim
1
jika email tidak memotong mustard, gunakan python ... docs.python.org/library/email-examples.html contoh adalah yang ke-3 atau # 6 yang sesuai dengan kebutuhan Anda.
sdolgy
Python akan meminta Anda untuk menulis (dan memelihara) skrip. Baris perintah baris satu memiliki kelebihan yang berbeda.
Noufal Ibrahim
Saya memiliki mailx, tetapi "option -a" tidak berfungsi, masih menunjukkan: mail: opsi ilegal - a
pyth0ner
3

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

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

  • Content-Type: untuk text/html; charset=utf-8
  • Content-Transfer-Encoding:ke 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.

sebentar
sumber
1

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
Bhabatosh
sumber
0

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

Vaibhav
sumber
-5
cat htmlfile.html | mail -s "subject" [email protected]

sumber
5
Nggak. Ini akan mengirim email teks dengan HTML di badan.
Noufal Ibrahim