it-swarm.com.de

Senden von HTML-Mails mit einem Shell-Skript

Wie kann ich eine HTML-E-Mail mit einem Shell-Skript senden?

46
Tree

Zuerst müssen Sie die Nachricht verfassen. Das absolute Minimum besteht aus diesen beiden Kopfzeilen:

MIME-Version: 1.0
Content-Type: text/html

... und der entsprechende Nachrichtentext:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title></title>
</head>
<body>

<p>Hello, world!</p>

</body>
</html>

Sobald Sie es haben, können Sie die entsprechenden Informationen an den Befehl mail übergeben:

body = '...'

echo $body | mail \
-a "From: [email protected]" \
-a "MIME-Version: 1.0" \
-a "Content-Type: text/html" \
-s "This is the subject" \
[email protected]

Dies ist ein stark vereinfachtes Beispiel, da Sie sich auch um Zeichensätze, Kodierungen und die maximale Leitungslänge kümmern müssen. Dies ist jedoch im Grunde die Idee.

Alternativ können Sie Ihr Skript in Perl oder PHP anstatt in normaler Shell schreiben.

Aktualisieren

Ein Shell-Skript ist im Grunde eine Textdatei mit Unix-Zeilenenden, die mit einer Zeile namens Shebang beginnt, die der Shell mitteilt, an welchen Interpreter sie die Datei übergeben muss. in Unix ist das ein Dateiattribut). Zum Beispiel speichern Sie Folgendes als hello-world:

#!/bin/sh

echo Hello, world!

Dann weisen Sie die Ausführungsberechtigung zu:

chmod +x hello-world

Und du kannst es endlich ausführen:

./hello-world

Wie auch immer, das hat nichts mit der ursprünglichen Frage zu tun. Sie sollten sich mit den grundlegenden Shell-Skripts vertraut machen, bevor Sie fortgeschrittene Aufgaben damit erledigen. Hier sind ein paar Links zu bash, einer beliebten Shell:

http://www.gnu.org/software/bash/manual/html_node/index.html

http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html

57

Die Tags enthalten 'sendmail', hier also eine Lösung, die das verwendet:

(
echo "From: [email protected] "
echo "To: [email protected] "
echo "MIME-Version: 1.0"
echo "Content-Type: multipart/alternative; " 
echo ' boundary="some.unique.value.ABC123/server.xyz.com"' 
echo "Subject: Test HTML e-mail." 
echo "" 
echo "This is a MIME-encapsulated message" 
echo "" 
echo "--some.unique.value.ABC123/server.xyz.com" 
echo "Content-Type: text/html" 
echo "" 
echo "<html> 
<head>
<title>HTML E-mail</title>
</head>
<body>
<a href='http://www.google.com'>Click Here</a>
</body>
</html>"
echo "------some.unique.value.ABC123/server.xyz.com--"
) | sendmail -t

Ein Wrapper für sendmail kann diesen Job erleichtern, zum Beispiel mutt :

mutt -e 'set content_type="text/html"' [email protected] -s "subject" <  message.html
44
mdma

Bisher habe ich in cmd linux zwei schnelle Wege gefunden

  1. Benutze alte Post

mail -s "$(echo -e "This is Subject\nContent-Type: text/html")" [email protected] < mytest.html

  1. Verwenden Sie Köter

mutt -e "my_hdr Content-Type: text/html" [email protected] -s "subject" < mytest.html

37
Kevin Zhu

Eine weitere Option ist die Verwendung von msmtp.

Sie müssen Ihre .msmtprc-Datei so einrichten (Beispiel: gmail):

account default
Host smtp.gmail.com
port 587
from [email protected]
tls on
tls_starttls on
tls_trust_file ~/.certs/equifax.pem
auth on
user [email protected]
password <password>
logfile ~/.msmtp.log

Dann rufen Sie einfach an:

(echo "Subject: <subject>"; echo; echo "<message>") | msmtp <[email protected]>

in deinem Skript

Update: Für HTML-Mail müssen Sie auch die Kopfzeilen einfügen, so dass Sie eine Datei wie diese erstellen möchten:

From: [email protected]
To: [email protected]
Subject: Important message
Mime-Version: 1.0
Content-Type: text/html

<h1>Mail body will be here</h1>
The mail body <b>should</b> start after one blank line from the header.

Und maile es gerne

cat email-template | msmtp [email protected]

Das Gleiche kann auch über die Befehlszeile erfolgen, die Verwendung einer Datei könnte jedoch einfacher sein.

2
Ashaman

Eine weitere Option ist das sendEmail-Skript http://caspian.dotconf.net/menu/Software/SendEmail/ . Außerdem können Sie den Nachrichtentyp als html festlegen und eine Datei als Nachrichtentext angeben. Siehe den Link für Details.

2
Matti Pastell

Mime-Header und from, to-Adresse können auch in der HTML-Datei enthalten sein.

Befehl

cat cpu_alert.html | /usr/lib/sendmail -t

cpu_alert.html datei beispiel.

From: [email protected]
To: [email protected]
Subject: CPU utilization heigh
Mime-Version: 1.0
Content-Type: text/html

<h1>Mail body will be here</h1>
The mail body should start after one blank line from the header.

Beispielcode hier verfügbar: http://sugunan.net/git/slides/Shell/cpu.php

0
sugunan
cat > mail.txt <<EOL
To: <email>
Subject: <subject>
Content-Type: text/html

<html>
$(cat <report-table-*.html>)
This report in <a href="<url>">SVN</a>
</html>

EOL

Und dann: 

sendmail -t < mail.txt
0

Mit dem Standard-Mailx von CentOS 7 (wird als Heirloom-Mailx angezeigt), habe ich dies vereinfacht, indem Sie einfach eine Textdatei mit den erforderlichen Kopfzeilen und einer statischen Begrenzung für Multipart/Mixed und Multipart/Alternative verwenden.

Ich bin mir sicher, Sie können Multipart/verwandt herausfinden, wenn Sie das gleiche Setup wünschen.

test.txt:

--000000000000f3b2150570186a0e
Content-Type: multipart/alternative; boundary="000000000000f3b2130570186a0c"

--000000000000f3b2130570186a0c
Content-Type: text/plain; charset="UTF-8"

This is my plain text stuff here, in case the email client does not support HTML or is blocking it purposely

My Link Here <http://www.example.com>

--000000000000f3b2130570186a0c
Content-Type: text/html; charset="UTF-8"

<div dir="ltr">
<div>This is my HTML version of the email</div>
<div><br></div>
<div><a href="http://www.example.com">My Link Here</a><br></div>
</div>

--000000000000f3b2130570186a0c--
--000000000000f3b2150570186a0e
Content-Type: text/csv; charset="US-ASCII"; name="test.csv"
Content-Disposition: attachment; filename="test.csv"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_jj5qmzqz0

Die Grenzen definieren mehrteilige Segmente.

Die Begrenzungs-ID, die am Ende keine Striche enthält, ist ein Startpunkt eines Segments.

Der Punkt mit den beiden Strichen am Ende ist der Endpunkt. 

In diesem Beispiel gibt es im Multipart/Mixed-Hauptabschnitt einen Unterabschnitt für Multipart/Alternative. 

Die multipart/alternative Methode sagt im Wesentlichen "Rückfall auf dieses Problem, WENN der Prioritätsabschnitt nicht erfolgreich ist" - in diesem Beispiel wird HTML normalerweise von E-Mail-Clients als Priorität angenommen. Wenn ein E-Mail-Client den HTML-Code nicht anzeigt, wird auf den reinen Text zurückgegriffen.

Die Multipart/Mixed-Methode, die diese ganze Nachricht einschließt, besagt im Wesentlichen, dass es hier unterschiedliche Inhalte gibt, beide anzeigen. 

In diesem Beispiel habe ich der E-Mail einen CSV-Dateianhang hinzugefügt. Im folgenden Befehl wird der Anhang mit base64 eingebunden.

Als Beispiel habe ich den Anhang hinzugefügt. Sie müssen Ihren Inhaltstyp entsprechend für Ihren Anhang einstellen und angeben, ob Inline oder nicht. 

Die X-Attachment-ID ist für einige Anbieter erforderlich. Die von Ihnen festgelegte ID wird randomisiert.

Der Befehl, dies zu verschicken, lautet:

echo -e "`cat test.txt; openssl base64 -e < test.csv`\n--000000000000f3b2150570186a0e--\n" | mailx -s "Test 2 $( echo -e "\nContent-Type: multipart/mixed; boundary=\"000000000000f3b2150570186a0e\"" )" -r [email protected] [email protected]

Wie Sie in der mailx Betreffzeile sehen können, füge ich die mehrteilige Begrenzung statisch ein. Dies ist der erste Header, den der E-Mail-Client sehen wird.

Dann wird der Inhalt von test.txt ausgegeben.

In Bezug auf den Anhang verwende ich die Datei "openssl" (die auf Systemen ziemlich Standard ist), um den Dateianhang in base64 zu konvertieren. 

Außerdem habe ich am Ende dieses Echos die Anweisung zum Schließen der Grenze hinzugefügt, um das Ende der Nachricht anzuzeigen.

Dies funktioniert bei heirloom-mailx-Problemen und ist praktisch ohne Skript. 

Das Echo kann stattdessen ein Feed oder eine beliebige andere Anzahl von Methoden sein. 

0
Shawn Q

Hier ist meine (wenn "Mail" richtig konfiguriert ist):

scanuser @ owncloud: ~ $ vi sendMailAboutNewDocuments.sh

mail -s "You have new mail" -a "Content-type: text/html" -a "From: [email protected]" $1 << EOF
<html>
<body>
Neues Dokument: $2<br>
<a href="https://xxx/index.php/apps/files/?dir=/Post">Hier anschauen</a>
</body>
</html>

EOF

ausführbar machen:

chmod +x sendMailAboutNewDocuments.sh

dann ruf an:

./sendMailAboutNewDocuments.sh [email protected] test.doc
0
fiffy

Sie können die Option -o in sendEmail verwenden, um eine HTML-E-Mail zu senden.

-o message-content-type = html, um den Inhaltstyp der E-Mail anzugeben.

-o Nachrichtendatei, um die HTML-Datei zum E-Mail-Inhalt hinzuzufügen.

Ich habe diese Option in einem Shell-Skript ausprobiert und es funktioniert.

Hier ist der vollständige Befehl:

/usr/local/bin/sendEmail -f [email protected] -t "[email protected]" -s \
 smtp.test.com -u "Title" -xu [email protected] -xp password \
 -o message-charset=UTF-8  \
 -o message-content-type=html \
 -o message-file=test.html
0
liujiawen