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


66

mail -s "subject" xxxxx@gmail.com <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?

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

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: mojaadres@mojafirma.com” (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


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

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


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

będzie działać


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

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


1

Użyłem poniższych skryptów

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

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

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


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

5
Nie. Spowoduje to wysłanie wiadomości e-mail z kodem HTML w treści.
Noufal Ibrahim
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.