it-swarm.com.de

So senden Sie HTML-E-Mails über die Linux-Befehlszeile

Ich muss eine E-Mail im HTML-Format senden. Ich habe nur Linux-Befehlszeile und Befehl "Mail".

Derzeit haben verwendet:

echo "To: [email protected]" > /var/www/report.csv
echo "Subject: Subject" >> /var/www/report.csv
echo "Content-Type: text/html; charset=\"us-ascii\"" >> /var/www/report.csv

echo "<html>" >> /var/www/report.csv
mysql -u ***** -p***** -H -e "select * from users LIMIT 20" dev >> /var/www/report.csv
echo "</html>" >> /var/www/report.csv

mail -s "Built notification" [email protected] < /var/www/report.csv

Aber in meinem Mail-Agent bekomme ich nur Klartext.

alt text

57
Oleh Herych

Das hat bei mir funktioniert:

echo "<b>HTML Message goes here</b>" | mail -s "$(echo -e "This is the subject\nContent-Type: text/html")" [email protected]
49
Dude

Meine Mail-Version hat kein --append und es ist zu schlau für die echo -e \n- Trick (ersetzt einfach\n durch Leerzeichen). Es hat jedoch -a:

mail -a "Content-type: text/html" -s "Built notification" [email protected] < /var/www/report.html
42
Ole Tange

Erstellen Sie eine Datei mit dem Namen tmp.html und fügen Sie die folgende Zeile ein:

<b>my bold message</b>

Fügen Sie dann alles in die Befehlszeile ein: (mit der Klammer und allem).

(
  echo To: [email protected]
  echo From: [email protected]
  echo "Content-Type: text/html; "
  echo Subject: a logfile
  echo
  cat tmp.html
) | sendmail -t

Die Post wird versandt. Und die Nachricht erschien fett statt mit dem <b> Stichworte.

Quelle:
Wie versende ich eine HTML-E-Mail mit dem Bash-Befehl "sendmail"?

26
Eric Leschinski

Das Problem ist, dass beim Umleiten einer Datei in "Mail" diese nur für den Nachrichtentext verwendet wird. Alle Header, die Sie in die Datei einbetten, werden stattdessen in den Textkörper eingefügt.

Versuchen:

mail --append="Content-type: text/html" -s "Built notification" [email protected] < /var/www/report.csv

Mit --append können Sie der E-Mail beliebige Header hinzufügen, in denen Sie den Inhaltstyp und die Inhaltsdisposition angeben sollten. Es ist nicht erforderlich, die Header To und Subject in Ihre Datei einzubetten oder mit --append anzugeben, da Sie sie implizit bereits in der Befehlszeile festlegen (-s ist das Thema) und [email protected] werden automatisch zu To).

8
Marc B

Unter OS X (10.9.4) funktioniert cat und ist einfacher, wenn sich Ihre E-Mail bereits in einer Datei befindet:

cat email_template.html  | mail -s "$(echo -e "Test\nContent-Type: text/html")" [email protected]
7
jamesnotjim

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

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

#!/bin/bash

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

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

  • Content-Type: bis 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:

mail -Ssendmail='~/bin/sendmail-hook' \
    -s "Built notification" [email protected] < /var/www/report.csv
3
loentar

Sehr alte Frage, aber sie hat einen hohen Stellenwert, als ich eine Frage dazu googelte.

Hier finden Sie die Antwort:

Senden von HTML-Mail mit einem Shell-Skript

2
Magge

du solltest "Append" Mode Redirection verwenden >> anstatt >

2
ghostdog74

Ich habe eine wirklich einfache Lösung gefunden: Füge dem Mail-Befehl den Modifikator -aContent-Type: text/html hinzu.

In Ihrem Fall wäre:

mail -aContent-Type:text/html -s "Built notification" [email protected] < /var/www/report.csv
2
Muc

Versuche es mit :

echo "To: [email protected]" > /var/www/report.csv
echo "Subject: Subject" >> /var/www/report.csv
echo "MIME-Version: 1.0" >> /var/www/report.csv
echo "Content-Type: text/html; charset=\"us-ascii\"" >> /var/www/report.csv
echo "Content-Disposition: inline" >> /var/www/report.csv

echo "<html>" >> /var/www/report.csv
mysql -u ***** -p***** -H -e "select * from users LIMIT 20" dev >> /var/www/report.csv
echo "</html>" >> /var/www/report.csv

mail -s "Built notification" [email protected] < /var/www/report.csv
1

Ich kämpfte mit einem ähnlichen Problem (mit E-Mails) in einem der post_receive-Hooks meines Gits und fand schließlich heraus, dass sendmail für diese Art von Dingen tatsächlich besser funktioniert, insbesondere wenn Sie ein bisschen wissen, wie E-Mails aufgebaut sind (und wie sie aufgebaut sind) scheint wie du weißt). Ich weiß, dass diese Antwort sehr spät kommt, aber vielleicht wird sie auch anderen von Nutzen sein. Ich habe den heredoc-Operator und die Funktion verwendet, mit der Variablen erweitert werden, sodass auch inline Skripte ausgeführt werden können. Probieren Sie es einfach aus (Bash-Skript):

#!/bin/bash
recipients=(
    '[email protected]'
    '[email protected]'
#   '[email protected]'
);
sender='[email protected]';
subject='Oh, who really cares, seriously...';
sendmail -t <<-MAIL
    From: ${sender}
    `for r in "${recipients[@]}"; do echo "To: ${r}"; done;`
    Subject: ${subject}
    Content-Type: text/html; charset=UTF-8

    <html><head><meta charset="UTF-8"/></head>
    <body><p>Ladies and gents, here comes the report!</p>
    <pre>`mysql -u ***** -p***** -H -e "SELECT * FROM users LIMIT 20"`</pre>
    </body></html>
MAIL

Beachten Sie die Backticks im MAIL-Teil, um eine Ausgabe zu generieren und denken Sie daran, dass <<- Der Operator entfernt nur Tabulatoren (keine Leerzeichen) vom Zeilenanfang. In diesem Fall funktioniert das Kopieren und Einfügen nicht (Sie müssen den Einzug durch die richtigen Tabulatoren ersetzen). Oder benutze << Operator und überhaupt keine Einrückung. Hoffe das wird jemandem helfen. Natürlich können Sie Backticks außerhalb des MAIL-Teils verwenden und die Ausgabe in einer Variablen speichern, die Sie später im MAIL-Teil verwenden können - Geschmackssache und Lesbarkeit. Und ich weiß, #!/bin/bash funktioniert nicht immer auf jedem System.

1
Cromax