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


66

mail -s "subject" xxxxx@gmail.com <test.html berfungsi, tetapi hanya untuk email teks biasa.

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

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

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: myaddress@mycompany.com" (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


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
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")" user@server.com < /tmp/htmlmail.txt

Terima kasih, Bung
Diuji pada Fedora 17, dan bekerja


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" me@example.com

akan bekerja


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" xxxxx@gmail.com < test.html

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


1

Saya telah menggunakan skrip di bawah ini untuk terjadi

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

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")" userid@email.com

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


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

5
Nggak. Ini akan mengirim email teks dengan HTML di badan.
Noufal Ibrahim
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.