Wie sende ich HTML-E-Mails mit dem Linux-Befehl 'mail'?

66

mail -s "subject" [email protected] <test.html funktioniert, aber nur für Nur-Text-E-Mails.

Was ist der richtige Weg, um HTML-E-Mails mit dem Linux-Befehl zu senden mail?

pyth0ner
quelle

Antworten:

61

Es gibt viele verschiedene Versionen von mail. Wenn Sie über das hinausgehen mail -s subject to1@address1 to2@address2 <body(zum Senden, das ist alles POSIX Garantien - und auch -snicht existieren in den alten Tagen ), sie neigen dazu , Optionen unterschiedliche Befehlszeile zu haben. Das Hinzufügen eines zusätzlichen Headers ist nicht immer einfach.

  • Bei einigen mailxImplementierungen, z. B. von mailutilsUbuntu oder Debianbsd-mailx , ist es einfach, weil es dafür eine Option gibt.

    mailx -a 'Content-Type: text/html' -s "Subject" to@address <test.html
    
  • Mit dem Erbstück mailx gibt es keinen bequemen Weg. Eine Möglichkeit, beliebige Überschriften einzufügen, besteht darin, editheaders=1einen externen Editor (der ein Skript sein kann) festzulegen und zu verwenden.

    ## 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"
    
  • Mit einem allgemeinen POSIXmailx kann ich nicht an Überschriften gelangen.

Wenn Sie eines mailoder verwenden möchten mailx, denken Sie daran

  • Dies ist nicht einmal innerhalb einer bestimmten Linux-Distribution portierbar. Zum Beispiel haben sowohl Ubuntu als auch Debian verschiedene Alternativen für mailund mailx.
  • Beim Verfassen einer Nachricht mailund mailxbehandelt Zeilen, die mit beginnen, ~als Befehle. Wenn Sie Text einfügen mail, müssen Sie dafür sorgen, dass dieser Text keine Zeilen enthält, die mit beginnen ~.

Wenn Sie sowieso Software installieren, dann kann man auch etwas berechenbarer als installieren mail/ Mail/ mailx. Zum Beispiel Mutt . Mit Mutt können Sie die meisten Header in der Eingabe mit der -HOption versehen, nicht jedochContent-Type , die über eine Mutt-Option festgelegt werden muss.

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

Oder Sie können sendmaildirekt aufrufen . Es gibt verschiedene Versionen von sendmail, aber alle unterstützen sendmail -tdas Senden einer E-Mail auf einfachste Weise und das Lesen der Empfängerliste aus der E-Mail. (Ich denke, sie werden nicht alle unterstützt Bcc:.) Auf den meisten Systemen sendmailist es nicht das Übliche $PATH, sondern das In- /usr/sbinoder /usr/lib.

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

EOF
Gilles
quelle
Versucht mit dem Mutt Beispiel oben; Ersetzen von echten Werten für den Dateinamen, die E-Mail-Adresse usw., aber mit der Meldung "Es wurden keine Empfänger angegeben" (Osx Mountain Lion, Mutt 1.5.21 über Homebrew installiert)
Chuck van der Linden
Meine zweite Zeile war "An: [email protected]" (Entschuldigung für die fehlende Formatierung, in einer Antwort nicht möglich, tatsächlicher Text war ohne Anführungszeichen) und ich habe vor dem Einfügen in die EOF eine leere Zeile eingefügt. würde es eine Konfiguration geben, die ich tun muss, um mutt zu machen? Bevor ich das Beispiel ausprobierte, das Sie angegeben hatten (mit richtigen Werten als Ersatz), war alles, was ich getan habe, 'Brew Install Mutt'
Chuck van der Linden,
@ChuckvanderLinden Stellen Sie eine neue Frage. Kopieren Sie den exakten Befehl, den Sie ausgeführt haben, und fügen Sie die vollständige Fehlermeldung ein. Sehen Sie, ob Sie über die interaktive Oberfläche eine E-Mail von mutt senden können.
Gilles
Ich konnte etwas über die 'interaktive' Oberfläche versenden, es klagte zunächst über ein fehlendes Mail-Verzeichnis und bot an, es anzulegen. erinnerte mich, wie sehr ich vim hasse ;-) aber habe es zu senden. Ich beginne eine neue Frage, da dies einfacher zu formatieren ist usw. Die genaue Fehlermeldung war genau das, was ich sagte: "Es wurden keine Empfänger angegeben."
Chuck van der Linden
Neue Frage 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
Code-Verbesserer
quelle
5
Das nutzt man eigentlich nicht mail.
3
@ user16144 Nein, aber es ist eine nette Alternative, die das OP in Betracht ziehen könnte.
Trusktr
Ja, es werden keine E-Mails verwendet, aber es funktioniert überall dort, wo ich es ausprobiert habe. Das ist mehr, als ich für die anderen Lösungen sagen kann.
user1683793
Funktioniert auch wunderbar auf dem Mac.
Asim Jalis
7

Mit dem Heirloom mailx ist dies ein bequemer Weg

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

Vielen Dank, Dude hat
auf Fedora 17 getestet und funktioniert

Daniel
quelle
1
Frech. Ich mag das. : -]
Alastair Irvine
1
Beachten Sie, dass diese Lösung dazu führen kann, dass die E-Mail sowohl "Content-Type: text / html" als auch "Content-Type: text / plain" und potenzielle Inkonsistenzen aufweist, wenn Sie den Zeichensatz auf diese Weise angeben.
Skippy le Grand Gourou
5

Sie müssen Content-TypeIhrer E-Mail einen Header hinzufügen , um dies zu ermöglichen.

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

wird funktionieren

Noufal Ibrahim
quelle
2
mail: illegale Option - a
pyth0ner
Haben Sie mailx? Das könnte die Option haben. Wenn das nicht geht. Wenn das nicht funktioniert, können Sie die Verwendung von mutt in Betracht ziehen, obwohl ich nicht genau weiß, wie die Befehlszeilenoptionen lauten.
Noufal Ibrahim
1
Wenn Mail den Senf nicht schneidet, verwenden Sie python ... docs.python.org/library/email-examples.html Bei den Beispielen handelt es sich um das dritte oder das sechste, das Ihren Anforderungen entspricht.
Sonntag,
In Python müssen Sie ein Skript schreiben (und warten). Ein Befehlszeilen-One-Liner hat verschiedene Vorteile.
Noufal Ibrahim
Ich habe mailx, aber "Option -a" funktioniert nicht, noch zeigen: Mail: illegale Option - a
pyth0ner
3

Mit heirloom-mailx können Sie das sendmail-Programm in Ihr Hook-Skript ändern, die Header dort ersetzen und dann sendmail verwenden.

Das Skript, das ich benutze ( ~/bin/sendmail-mailx-hook):

#!/bin/bash

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

Dieses Skript ändert die Werte im Mail-Header wie folgt:

  • Content-Type: zu text/html; charset=utf-8
  • Content-Transfer-Encoding:bis 8bit(nicht sicher, ob dies wirklich benötigt wird).

So senden Sie eine HTML-E-Mail:

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

Diese Methode ist effektiver als die von @Gilles vorgeschlagene, da keine temporären Dateien erstellt werden und der Stream nur im laufenden Betrieb repariert wird.

loentar
quelle
1

Ich habe die folgenden Skripte verwendet, um zu geschehen

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

Für mich musste ich eine Variable wie den SMTP-Server angeben, damit der E-Mail-Befehl wie folgt funktioniert. Ich suchte in vielen Beiträgen und fand unter Eigenschaft, um den Körper in Text / HTML umzuwandeln. Jetzt ist die E-Mail, die ich erhalte, im HTML-Format.

Inhaltsdisposition: Inline

Unix-Version: Red Hat Enterprise Linux Server Version 6.6 (Santiago)

Zuerst. Erstellen Sie alle erforderlichen Informationen in einem Skript (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>"

Zweite. Leiten Sie das Skript an den Befehl mail weiter

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

Auf diese Weise erhalte ich Informationen wie unten in der E-Mail:

Content-Disposition: Inline Message-ID: User-Agent: Heirloom mailx 12.4 29.07.08 MIME-Version: 1.0 Content-Type: text / plain; Zeichensatz = us-ascii Content-Transfer-Encoding: 7bit

Wert1 Wert2

Wert1 und Wert2 gemäß der HTML-Kennzeichnung in testSql.sh

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

quelle
5
Nee. Dadurch wird eine Text-E-Mail mit HTML im Textkörper gesendet.
Noufal Ibrahim