HTML emails mit mail.mailutils

Das Programm mail.mailutils (meist einfach mail) ist auf vielen Linux-Distributionen installiert. Man kann damit über die Shell Emails verschicken, was sehr praktisch ist für scripte und cron-jobs, die den Admin per Mail informieren sollen.

Manchmal will man auch mal ein wenig mit HTML spielen und sei es auch nur, um um den Text ein <pre> zu setzen, damit er mit einer Monospace-Schrift angezeigt wird und ASCII-Art und Tabellen ordentlich dargestellt werden.

So schickt man HTML:

# generiere random boundary
BOUNDARY=$(date | md5sum | head -c8)
echo "
--_$BOUNDARY_
Content-Type: text/html; charset=\"us-ascii\"
Content-Transfer-Encoding: quoted-printable

<html><pre>
Meine Tabelle

+-------+----------+
| id    | analysis |
+-------+----------+
| 36190 |      219 |
| 36192 |      219 |
| 36273 |      219 |
| 36275 |       -1 |
| 36276 |       -1 |
| 36289 |      219 |
| 36293 |      122 |
| 36371 |      219 |
| 36388 |      219 |
| 36393 |      219 |
| 36394 |       -1 |
| 36395 |       -1 |
| 36708 |      122 |
+-------+----------+
</pre></html>
--_$BOUNDARY_--

" | mail.mailutils -s "Mein Subject" \
-a Content-Type:"multipart/alternative; boundary="\"_$BOUNDARY_\"" \
-a From:mein@absender.tld mein@empfaenger.tld

Diese Tabelle sieht jetzt sauber aus, wenn sie den Empfänger erreicht. Die Leerzeilen vor und nach dem Boundary und/oder Headern sind wichtig!

Wenn ich ein Bild in das HTML einbetten will, wird es komplizierter. Das mail-Tool kann zwar mit -A Anhänge verschicken, aber die kann ich dann nicht im HTML nutzen, da ich die dazugehörige ID nicht kenne.
Also muss ich das händisch machen, damit ich alle Parameter kontrollieren kann. Da Email ein 7-Bit Medium ist, muss ich aus dem Binär-Bild ASCII machen und dann noch dem Mailprogramm erklären, wie es das ASCII wieder in eine Binär-Bilddatei zurückverwandelt. Ich benutze hier base64 dafür, da das standardmässig installiert ist und so ziemlich jedes Mailprogramm das versteht. Ausserdem muss ich dem Bild einen Namen geben, denn der Dateiname geht verloren beim encoden in base64, und dazu eine ID, mit der ich darauf verweisen kann im HTML-Code der Mail. So gehts:

# generiere random boundary und Image ID
BOUNDARY=$(date | md5sum | head -c8)
IMAGEID=$(date | md5sum | head -c10 | rev)
# meine Bilddatei
IMAGEFILE=graph.png
( echo "
--_$BOUNDARY_
Content-Type: text/html; charset=\"us-ascii\"
Content-Transfer-Encoding: quoted-printable

<html>
Mein Graph als Bild:<br>
<img contenttype=3D\"image/png\" src=3D\"cid:$IMAGEID\"><br>
Sieht gut aus!

</pre></html>

--_$BOUNDARY_
Content-Type: image/png;name=\"$IMAGEFILE\"
Content-Disposition: attachment;filename=\"$IMAGEFILE\"
Content-ID: <$IMAGEID>
Content-Transfer-Encoding: base64 
"
base64 $IMAGEFILE 
echo "
--_$BOUNDARY_--" ) |  mail.mailutils -s "Mein Subject" \
-a Content-Type:"multipart/related; boundary="\"_$BOUNDARY_\""; type="\"multipart/alternative\""" \
-a MIME-Version:"1.0" \
-a From:mein@absender.tld mein@empfaenger.tld

Es gibt ausser mail.mailutils noch viele andere Commandline-Mailer wie etwa mutt oder mailx. Mit Hilfe der Beispiele oben kann man auch diese Mailer dazu bringen, HTML zu verschicken. Einfach mal gucken, welche Tools auf dem System installiert sind. Auch OS X kann das.

HTML emails mit mail.mailutils

Grafische Oberfläche auf CentOS

Das CentOS Installationsmedium mit allen Paketen für die grafische Oberfläche ist zu groß für einen 4GB USB Stick. Daher installiere ich meist nur die Minimal-Installation. Um danach doch noch klickibunti machen zu können, muss man die Pakete nachinstallieren. Das geht so:

yum -y groups install "GNOME Desktop"
yum -y update

Dann muss man noch dafür sorgen, dass das System auch in den grafischen Modus bootet:

sudo systemctl set-default graphical.target
Grafische Oberfläche auf CentOS

PDF kleiner machen

Wenn in einem PDF Bilder sind, dann oft in unmöglich hoher Auflösung und unkomprimiert, was in einem PDF resultiert, das so groß ist, dass kein Mailserver es mehr annimmt. Auf dem Mac kann man mit dem Programm „Preview“ (oder „Vorschau“ für alle, die auf Deutsch mit ihrem Computer kommunizieren) ein bestehendes PDF als PDF mit verkleinerter Größe exportieren. Aber das Ergebnis ist auch selten zufriedenstellend, denn das PDF ist dann zwar klein, aber die Bilder in bescheidener Qualität.

Besser macht es ghostscript. Da das nicht auf meinem Mac installiert ist, muss eben meine Ubuntu-Installation herhalten. Hier ist der Befehl:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf

Mit dem Parameter -dPDFSETTINGS=/screen, kann man die Qualität beeinflussen. Folgende Presets versteht ghostscript:

  • -dPDFSETTINGS=/screen (Bildschirm, 72 dpi Bilder)
  • -dPDFSETTINGS=/ebook (niedrige Qualität, 150 dpi Bilder)
  • -dPDFSETTINGS=/printer (hohe Qualität, 300 dpi Bilder)
  • -dPDFSETTINGS=/prepress (hohe Qualität, farbtreu, 300 dpi Bilder)

Achtung! Bei dPDFSETTINGS=/printer wirft gs einen Fehler aus. Man muss noch ein -dUseCIEColor hinter -dPDFSETTINGS=/printer hängen, damit es klappt.

PDF kleiner machen