Jak wysłać wiadomość e-mail w formacie HTML za pomocą polecenia linux „mail”?

66

mail -s "subject" [email protected] <test.html działa, ale tylko w przypadku zwykłego e-maila.

Jaki jest prawidłowy sposób wysyłania wiadomości e-mail w formacie HTML za pomocą polecenia systemu Linux mail?

pyth0ner
źródło

Odpowiedzi:

61

Istnieje wiele różnych wersji mail. Kiedy wychodzisz poza mail -s subject to1@address1 to2@address2 <body(do wysyłania, to wszystko gwarancje POSIX - a nawet -snie istniały w dawnych czasach ), mają one zwykle różne opcje wiersza poleceń. Dodanie dodatkowego nagłówka nie zawsze jest łatwe.

  • Z niektórymi mailximplementacjami, np. Z mailutilsUbuntu lub Debianabsd-mailx , jest to łatwe, ponieważ jest na to opcja.

    mailx -a 'Content-Type: text/html' -s "Subject" to@address <test.html
    
  • W Heirloom mailx nie ma wygodnego sposobu. Jedną z możliwości wstawienia dowolnych nagłówków jest ustawienie editheaders=1zewnętrznego edytora (który może być skryptem) i korzystanie z niego.

    ## 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"
    
  • Z ogólnym POSIX-emmailx nie wiem, jak uzyskać nagłówki.

Jeśli zamierzasz użyć dowolnego maillub mailx, pamiętaj o tym

  • To nie jest przenośne, nawet w ramach danej dystrybucji Linux. Na przykład zarówno Ubuntu, jak i Debian mają kilka alternatyw dla maili mailx.
  • Podczas tworzenia wiadomości maili mailxtraktuje linie zaczynające się ~jako polecenia. Jeśli wstawiasz tekst do potoku mail, musisz tak ustawić, aby ten tekst nie zawierał linii zaczynających się od ~.

Jeśli i tak zamierzasz zainstalować oprogramowanie, równie dobrze możesz zainstalować coś bardziej przewidywalnego niż mail/ Mail/ mailx. Na przykład mutt . Dzięki Mutt możesz dostarczyć większość nagłówków na wejściu z -Hopcją, ale nieContent-Type , którą należy ustawić za pomocą opcji mutt.

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

Lub możesz wywołać sendmailbezpośrednio. Istnieje kilka wersji sendmail, ale wszystkie obsługują sendmail -twysyłanie wiadomości w najprostszy sposób, czytając listę adresatów z wiadomości. (Myślę, że nie wszystkie obsługują Bcc:.) W większości systemów sendmailnie ma go w zwykłym systemie $PATH, jest w /usr/sbinlub /usr/lib.

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

EOF
Gilles
źródło
Próbowałem przy użyciu powyższego przykładu mutt; zastępując rzeczywiste wartości nazwą pliku, adresem e-mail itp., ale dostałem „Nie podano odbiorców” Jestem bardzo nowy w mutt, @Gilles, czy wiesz, dlaczego tak się stało? (lew górski osx, mutt 1.5.21 zainstalowany przez homebrew)
Chuck van der Linden
mój drugi wiersz brzmiał „Do: [email protected]” (przepraszam za brak formatowania, niemożliwy w odpowiedzi, faktyczny tekst był bez cudzysłowów) i wstawiłem pusty wiersz przed wstawieniem EOF. czy byłaby konfiguracja, którą muszę zrobić, aby zepsuć? przed wypróbowaniem podanego przez ciebie przykładu (z podstawionymi właściwymi wartościami) wszystko, co zrobiłem, to „brew install mutt”
Chuck van der Linden
@ChuckvanderLinden Zadaj nowe pytanie. Skopiuj i wklej dokładnie uruchomione polecenie oraz pełny komunikat o błędzie. Sprawdź, czy możesz wysłać wiadomość e-mail z mutt za pomocą interaktywnego interfejsu.
Gilles
Byłem w stanie wysłać coś przez interfejs „interaktywny”, początkowo narzekał na brak katalogu poczty i zaproponował jego utworzenie. przypomniałem, jak bardzo nienawidzę vima ;-), ale dostałem go do wysłania. Zacznę nowe pytanie, ponieważ łatwiej jest je sformatować itp. Dokładny komunikat o błędzie brzmiał dokładnie tak, jak powiedziałem: „Nie podano odbiorców”.
Chuck van der Linden
Nowe pytanie 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
Ulepszacz kodu
źródło
5
To właściwie nie działa mail.
3
@ user16144 Nie, ale to dobra alternatywa, którą OP może rozważyć.
trusktr
Tak, nie używa poczty, ale działa wszędzie. Wypróbowałem to, co jest więcej niż mogę powiedzieć o innych rozwiązaniach.
user1683793
Działa również pięknie na Macu.
Asim Jalis
7

Dzięki Heirloom mailx wygodny sposób to

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

Dzięki, koleś
przetestował Fedorę 17 i działał

Daniel
źródło
1
Bezczelny. Lubię to. : -]
Alastair Irvine
1
Uważaj, że to rozwiązanie może spowodować, że wiadomość e-mail będzie zawierała zarówno „Typ zawartości: tekst / HTML”, jak i „Typ treści: tekst / zwykły” oraz potencjalne niespójności, jeśli użyjesz tej metody do określenia zestawu znaków.
Skippy le Grand Gourou
5

Content-TypeAby to się stało, musisz dodać nagłówek do wiadomości e-mail.

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

będzie działać

Noufal Ibrahim
źródło
2
mail: nielegalna opcja - a
pyth0ner
Czy masz mailx? To może mieć opcję. Jeśli to nie zadziała. Jeśli to nie zadziała, możesz rozważyć użycie mutta, chociaż nie wiem od razu, jakie przełączniki linii poleceń to robią.
Noufal Ibrahim
1
jeśli poczta nie tnie musztardy, użyj python ... docs.python.org/library/email-examples.html przykłady to 3 lub 6, który odpowiada twoim wymaganiom.
sdolgy
Python będzie wymagał napisania (i utrzymania) skryptu. Jedna linijka linii poleceń ma różne zalety.
Noufal Ibrahim
Mam mailx, ale „opcja -a” nie działa, wciąż pokazuję: mail: niedozwolona opcja - a
pyth0ner
3

Dzięki heirloom-mailx możesz zmienić program sendmail na swój skrypt przechwytujący, zamienić tam nagłówki, a następnie użyć sendmaila.

Skrypt, którego używam ( ~/bin/sendmail-mailx-hook):

#!/bin/bash

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

Ten skrypt zmienia wartości w nagłówku wiadomości w następujący sposób:

  • Content-Type: do text/html; charset=utf-8
  • Content-Transfer-Encoding:do 8bit(nie jestem pewien, czy jest to naprawdę potrzebne).

Aby wysłać wiadomość e-mail w formacie HTML:

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

Ta metoda jest bardziej skuteczna niż zaproponowana przez @Gilles, ponieważ nie tworzy plików tymczasowych, a jedynie naprawia strumień w locie.

loentar
źródło
1

Użyłem poniższych skryptów

#!/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
źródło
0

Dla mnie musiałem podać zmienną taką jak serwer SMTP, więc polecenie mail działało w następujący sposób. Przeszukałem wiele postów i znalazłem poniżej właściwości do konwersji treści na tekst / HTML. Teraz e-mail, który otrzymuję, jest w formacie HTML.

Dyspozycja treści: wbudowana

Wersja uniksowa: Red Hat Enterprise Linux Server wydanie 6.6 (Santiago)

Pierwszy. Utwórz w skrypcie dowolne informacje (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>"

Druga. Prześlij ten skrypt do polecenia 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]

W ten sposób otrzymuję następujące informacje w wiadomości e-mail:

Dyspozycja treści: wbudowana Identyfikator wiadomości: Agent użytkownika: Heirloom mailx 12.4 7/29/08 Wersja MIME: 1.0 Typ treści: tekst / zwykły; charset = us-ascii Content-Transfer-Encoding: 7bit

Wartość1 Wartość2

Wartość1 i Wartość2 zgodnie z tagowaniem HTML wykonanym w pliku testSql.sh

Vaibhav
źródło
-5
cat htmlfile.html | mail -s "subject" [email protected]

źródło
5
Nie. Spowoduje to wysłanie wiadomości e-mail z kodem HTML w treści.
Noufal Ibrahim