Linux 'mail' komutunu kullanarak HTML e-postasını nasıl gönderirim?


66

mail -s "subject" xxxxx@gmail.com <test.html çalışır, ancak yalnızca düz metin e-posta için.

Linux komutunu kullanarak HTML e-posta göndermenin doğru yolu nedir mail?

Yanıtlar:


61

mailÇevresinde birçok farklı versiyonları vardır . Ötesine geçtiğinizde mail -s subject to1@address1 to2@address2 <body(göndermek için, tüm POSIX garantileri - ve eski günlerde bile -smevcut değildi ), farklı komut satırı seçeneklerine sahip olma eğilimindedirler. Ek bir başlık eklemek her zaman kolay değildir.

  • Bazılarında mailxörneğin uygulamalarda, gelen mailutilsUbuntu veya Debian enbsd-mailx bunun için bir seçenek var, çünkü, bu kolaydır.

    mailx -a 'Content-Type: text/html' -s "Subject" to@address <test.html
    
  • Heirloom ile mailxuygun bir yol yoktur. İsteğe bağlı başlıklar eklemek için bir olasılık editheaders=1(bir komut dosyası olabilir) harici bir editör ayarlamak ve kullanmaktır.

    ## 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"
    
  • Genel bir POSIX ilemailx , başlıklara nasıl gireceğimi bilmiyorum.

Herhangi birini kullanacaksanız mailya da mailxaklınızda bulundurun.

  • Bu, belirli bir Linux dağıtımında bile taşınabilir değil. Örneğin, Ubuntu ve Debian ikisi için birçok alternatifimiz olduğunu mailve mailx.
  • Bir mesaj oluştururken mailve komutlarla mailxbaşlayan satırları ele alır ~. Metni içine aktarırsanız mail, bu metinden başlayarak satır içermemesi için düzenleme yapmanız gerekir ~.

Yine de yazılımı yükleyecekseniz, mail/ Mail/ öğesinden daha öngörülebilir bir şey yükleyebilirsiniz mailx. Örneğin, mutt . Mutt ile, birlikte girdi en başlıklarını sağlayabilmektedir -Hseçeneği değil amaContent-Type bir ahmak seçeneği üzerinden ayarlanması gerekir, hangi.

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

Veya sendmaildoğrudan başvurabilirsiniz . sendmailDışarıda birkaç versiyon var, ancak hepsi sendmail -ten basit şekilde bir posta göndererek, postaların alıcı listesini okuyarak destek veriyorlar . (Hepsinin desteklemediğini düşünüyorum Bcc:.) Çoğu sistemde, sendmailnormalde değil $PATH, içinde /usr/sbinveya de /usr/lib.

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

EOF

Yukarıdaki mutt örneğini kullanarak denedim; dosya adı, e-posta adresi vb. için gerçek değerleri kullanmak, ancak "Alıcı belirtilmedi" ifadesi var. Mutt için çok yeniyim, @ Gilles bunun neden olmuş olabileceğini biliyor musunuz? (osx dağ aslanı, kötülük 1.5.21 homebrew aracılığıyla kurulmuş)
Chuck van der Linden

ikinci satırım "Kime: myaddress@mycompany.com" idi (biçimlendirme yetersizliği nedeniyle cevap verilemediği için üzgünüm, asıl metin alıntı yapıldı) ve EOF’yi koymadan önce boş bir satır ekledim. Yapıştırmak için yapmam gereken bir yapılandırma var mıydı? Verdiğiniz örneği denemeden önce (yerine uygun değerler kullanılmışsa) yaptığım tek şey 'demurt takma' idi
Chuck van der Linden

@ChuckvanderLinden Yeni bir soru sor. Koştuğunuz komutu ve tam hata mesajını kopyala-yapıştır yapın. Etkileşimli arayüzü kullanarak mutttan bir e-posta gönderebiliyor musunuz bir bakın.
Gilles

'Etkileşimli' arayüz üzerinden bir şey gönderebildim, başlangıçta bir posta dizini eksikti ve onu oluşturmayı teklif etti. vim'den ne kadar nefret ettiğimi hatırlattı ;-) ancak göndermesini sağladı. Biçimlendirmek daha kolay olduğu gibi yeni bir soru başlayacağım. Kesin hata mesajı tam olarak "Hiçbir alıcı belirtilmedi" demiştim.
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
Bu aslında kullanmaz mail.

3
@ user16144 Hayır, ancak OP'nin dikkate almak isteyebileceği hoş bir alternatif.
trusktr

Evet, posta kullanmıyor ama çalıştığım her yerde çalışıyor, diğer çözümler için söyleyebileceğimden daha fazla.
user1683793

Mac'te de güzel çalışır.
Asim Jalis

7

Heirloom mailx ile uygun yol

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

Teşekkürler, Dostum
Fedora 17'de Test Edildi ve Çalıştı


1
Yüzsüz. Bunu sevdim. : -]
Alastair Irvine

1
Bu çözümün, karakter kümesini belirlemek için bu yolu kullanırsanız hem "Content-Type: text / html" hem de "Content-Type: text / plain" içeren e-postalara ve olası tutarsızlıklara yol açabileceğini unutmayın.
Skippy le Grand Gourou

5

Bunun gerçekleşmesi Content-Typeiçin e-postanıza başlık eklemeniz gerekir.

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

çalışacak


2
posta: yasadışı seçenek - a
pyth0ner

Eğer var mı mailx? Bu seçeneğe sahip olabilir. Bu işe yaramazsa. Bu işe yaramazsa, komut satırının ne yapmak için el değiştirdiğini bilmeme rağmen mutt kullanmayı düşünebilirsiniz.
Noufal Ibrahim,

1
eğer posta hardalı kesmiyorsa python ... docs.python.org/library/email-examples.html örnekleri gereksiniminize uygun 3. veya 6. örnektir.
sdolgy

Python, bir komut dosyası yazmanızı (ve sürdürmenizi) gerektirir. Bir komut satırı bir astar farklı avantajlara sahiptir.
Noufal Ibrahim

Mailx'im var ama "seçenek -a" çalışmıyor, hala göster: mail: illegal seçenek - a
pyth0ner

3

Heirloom-mailx ile sendmail programını hook betiğinize değiştirebilir, oradaki başlıkları değiştirebilir ve daha sonra sendmail'i kullanabilirsiniz.

Kullandığım script ( ~/bin/sendmail-mailx-hook):

#!/bin/bash

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

Bu komut dosyası, posta başlığındaki değerleri aşağıdaki gibi değiştirir:

  • Content-Type: için text/html; charset=utf-8
  • Content-Transfer-Encoding:için 8bit(bu gerçekten gerekli olup olmadığından emin değilim).

HTML e-posta göndermek için:

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

Bu yöntem @Gilles tarafından önerilenlerden daha etkilidir, çünkü geçici dosyalar oluşturmaz ve sadece akışı anında düzeltir.


1

Aşağıdaki komut dosyalarını kullanmak için kullandım

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

Benim için SMTP sunucusu gibi bir değişken belirtmem gerekiyordu, bu yüzden mail komutu aşağıdaki şekilde çalıştı. Birçok gönderide arama yaptım ve cesedi text / html biçimine dönüştürmek için aşağıdaki özelliği buldum. Şimdi aldığım e-posta HTML biçiminde.

İçerik Eğilimi: satır içi

Unix sürümü: Red Hat Enterprise Linux Sunucu sürümü 6.6 (Santiago)

İlk. Bir komut dosyasında gereken bilgileri oluşturun (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>"

İkinci. Bu komut dosyasını posta komutuna aktar

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

Bunu yaparak e-postada aşağıdaki gibi bilgileri alıyorum:

İçerik Eğilimi: satır içi Mesaj Kimliği: Kullanıcı-Temsilcisi: Heirloom mailx 12.4 7/29/08 MIME Sürümü: 1.0 İçerik Türü: text / plain; charset = us-ascii İçerik Aktarımı-Kodlaması: 7bit

Değer1 Değer2

TestSql.sh içinde yapılan HTML etiketlemeye göre Value1 ve Value2


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

5
Hayır! Bu, gövdede HTML içeren bir metin e-postası gönderir.
Noufal Ibrahim,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.