Command Line Interface Mail Bot

Nach einer kurzen Pause – jeder braucht mal Erholung, ich hoffe auf Ihr Verständnis, und danke, dass Sie uns treu geblieben sind – stellen wir heute eines unserer internen Tools in den Public Domain.

Sie kennen die Situation bestimmt, Sie haben einen Server aufgesetzt und benötigen Monitoring dafür – Sie möchten z.B. für verschiedene Fehlerzustände eine Information erhalten.

In vielen Fällen am besten geeignet dafür ist es, wenn der Server Sie per Mail informiert. Nun bringen zwar Linux-Systeme eigene Clients dafür mit, und auch damit einen eigenen Mailserver aufzusetzen wäre an sich kein Problem. Aber da inzwischen soviel Spam per Mail unterwegs ist, sind die Anforderungen an einen erfolgreichen Mailversand sehr hoch geworden, und deshalb sieht es mit Bordmitteln mittlerweile recht schlecht aus. Die Mail landet im Spam, oder wird gleich schon vor dem Versand abgelehnt. Und wenn es um den Versand von einem Windows System aus geht, ist an Bordmitteln sowieso nichts dabei.

In solchen Situationen hilft unser „Command Line Interface Mail Bot“ (CLIMB). Er beherrscht alle Verschlüsselungstechniken, kann Anhänge mitsenden, Kopien in Sent ablegen, und bietet auch sonst alle Möglichkeiten, die ein Mail Client benötigt wie CC: BCC: und so weiter.

CLIMB ist in Python geschrieben und läuft deshalb überall, wo ein Python-Interpreter verfügbar ist. Weiterhin ist das Ihnen zur Verfügung gestellte Script hybrider Python 2.7 und Python 3 Code, es kann also mit diesen beiden Python-Versionen ausgeführt werden.

Download CLIMB Python


(Hinweis: neuere OpenSSL-Versionen werden von Python 2.7 nicht mehr unterstützt. Falls Climb Fehlermeldungen ausgibt über fehlende Crypto-Bibliotheken, verwenden Sie bitte Python 3.)

Für Windows-Systeme gibt es außerdem die Möglichkeit, mittels dem Modul Py2Exe ein ausführbares Programm zu generieren, dann ist es dort nicht erforderlich einen Python-Interpreter zu installieren. Perfekt zum Beispiel für Kundensysteme.

Sie können diese Compilation entweder selbst vornehmen, oder das von uns erzeugte Executable herunterladen:

Download CLIMB Win32

(Die Windows-Version ist eine ZIP-Datei mit mehreren Komponenten. In ein Verzeichnis Ihrer Wahl auspacken und dort das EXE aufrufen).

Wenn Sie CLIMB ohne Parameter oder mit dem Parameter -h aufrufen, erhalten Sie eine Liste der möglichen Parameter. Das meiste davon sollte ziemlich selbsterklärend sein. Mit einem Klick auf „weiterlesen“ erhalten Sie eine Einführung in die Verwendung von CLIMB, sowie ein konkretes Anwendungsbeispiel.

[Beginn Einführung CLIMB]

Der minimale Aufruf von CLIMB sieht so aus:

python climb.py -to [recipient] \
    -title [title] -body [text] \
    -server [server] -user [user] -password [password]

Für alle Parameter gibt es eine Kurz- und eine Langform. Die Kurzform für obiges Beispiel ist:

python climb.py -t [recipient] -tt [title] -b [text] \
    -s [server] -u [user] -pw [password]

(Wenn ein Parametertext Sonderzeichen oder Whitespace enthält, fassen Sie ihn in Anführungszeichen -b „This is text with whitespace“. Ansonsten ist die Reihenfolge der Parameter egal, und außerdem können Kurz- und Langform der Befehle beliebig gemischt werden. Groß-/Kleinschreibung wird für die Parameter ignoriert. Die Zugangsdaten server, user, password sind die gleichen, die in einem Mail-Client, z.b. Thunderbird, für den SMTP-Zugang, von z.B. gmx.de, einzugeben sind.)

Sie können natürlich alle Parameter jedesmal komplett in der Kommandozeile angeben. Aber es empfiehlt sich, eine Parameterdatei anzulegen, da die meisten Teile des Aufrufs sich nicht mehr ändern (Server, User, Passwort, usw.), sobald sie einmal konfiguriert sind.

Eine solche Parameterdatei sieht bspw. so aus:

<<File parameter.cfg>>

-server [server]
-user [user]
-password [password]

Diese Datei wird dann wie folgt verwendet:

python climb.py -optionsF parameter.cfg \
    -to [recipient] -title [title] -body [text]

(Die Parameter sind genauso wie auf der Kommandozeile; und alle Parameter können in dieser Datei stehen, so dass der minimale Aufruf python climb.py -of [file] ist.)

Noch ein paar weitere Hinweise. Standardmäßig wird immer eine verschlüsselte Verbindung zum Mailserver aufgebaut, als Default dafür ist die häufigste Verschlüsselungsmethode mit dem Standardport gesetzt. Dieser Port kann geändert werden mit der Option -port, außerdem kann verschlüsselte Verbindung von Anfang an ausgewählt werden mit der Option -ssl. Sollten Sie eine unverschlüsselte Verbindung benötigen, erhalten Sie diese mit der Option -nocrypt, aber es gibt kaum noch Server, die das überhaupt noch annehmen. Mit der Option -output können Sie eine Datei generieren, statt eine Mail zu senden, das ist nützlich beim Testen der Funktion.

Und nun zum versprochenen Anwendungsbeispiel. Neulich hatten wir hier im Blog einen Eintrag, da ging es um die notwendige Umstellung für das COM-Modell des Internet Explorers auf moderne Browser. Wir hatten darin als Beispiel Google Chrome gewählt, und geschrieben, dass regelmäßig geprüft werden muss, ob es einen neueren Selenium-Treiber dafür gibt.

Besonders lästig daran ist, dass es überhaupt nicht gesagt ist, dass für jeden Update des Browsers auch eine neue Steuerungsdatei erscheint. Chrome hat sich aktualisiert, man schaut nach, ob es eine neue Treiberversion gibt, aber das ist sehr oft vergeudete Zeit. Da liegt es doch nahe, den Vorgang zu automatisieren, und sich eine Mail senden zu lassen, wenn dieses Treibermodul von Google aktualisiert wurde.

Hier ist ein Bash-Script, das dies leistet:

#!/bin/bash

scriptdir="$(realpath $(dirname $0))"
versfile="$scriptdir/chromedriver.version"
drvrurl="https://sites.google.com/chromium.org/driver/"

function isVersionString {
    v="$(echo "$1" |xargs |sed 's/\.//g')" #trim string, remove dots
    case $v in #check if all numeric
        ''|*[!0-9]*)
            $scriptdir/climb -of $scriptdir/check-chromedriver.smtp \
                -tt "Cannot read ChromeDriver-Version" \
                -b "The HTML of the driver page probably was modified."
            exit 1 ;;
    esac
}

if [ -f $versfile ]; then
    curver="$(cat $versfile)"
else
    curver="x"
fi

newver="$(curl -L $drvrurl 2>/dev/null \
    |grep '<body ' \
    |sed 's/^.*Latest.*release//' \
    |awk -F "ChromeDriver " '{print $2}' \
    |sed 's/<\/a>.*//')"
isVersionString $newver #check if page html-format has changed

if [ "$curver" != "$newver" ]; then
    python $scriptdir/climb.py \
        -of $scriptdir/check-chromedriver.smtp \
        -tt "New Selenium-ChromeDriver $newver available" \
        -b "$drvrurl"
    echo "$newver" >$versfile
else
    touch $versfile
fi

(Das Script geht davon aus, dass climb.py und dessen Parameterdatei im gleichen Verzeicnis liegen wie das Script; außerdem sind für den Aufruf von climb.py wie gegeben alle Parameter außer -title und -body in eine Parameterdatei ausgelagert. Das Trickreiche daran ist übrigens, dass sich diese Prüfung nicht per Selenium-Automatisierung erzielen lässt, denn wäre das Modul aktualisiert, würde sie ja nicht mehr funktionieren. Deshalb wird curl benutzt, um die Seite mit den Links zu den Treibermodulen direkt auszulesen und zu parsen.)

Dieses Script packen Sie dann in die Crontab und lassen es bspw. alle 6 Stunden ausführen. Und voilà, sobald es eine neue Version des Selenium-Treibermoduls gibt, bekommen Sie eine Mail und können das neue Modul installieren, sobald Sie Zeit dafür haben. Denn eine Mail hat ja den Vorteil, dass Sie sie bearbeiten können, wenn es Ihnen zeitlich passt. Und darum habe ich für solche Fälle lieber eine Mail, als z.B. eine Desktop-Infobox, die weg wäre, sobald man sie bestätigt hat.

Addendum: Vollständige Liste aller möglichen Parameter (Ausgabe der Hilfefunktion) –

climb - Command Line Interface Mail Bot V1.0 by Michael Boehm, Cephei AG
Utility to send automated E-Mails with full encryption support - Freeware
Usage: climb [options]
Case-insensitive options, and [arguments] that follow them:
-s  or -server   : SMTP [Server] to use
-p  or -port     : Server [Port] (Default 587 for encrypted connections)
-ss or -ssl      : Force SSL from beginning of connection (ignored if -nc)
-nc or -nocrypt  : Unencrypted connection (don't use SSL; default port 25)
-u  or -user     : [Username] for login
-pw or -password : [Password] for login
-f  or -from     : Sender [E-Mail] (defaults to login username)
-t  or -to       : Recipients [E-Mails], comma-separated
-c  or -cc       : CC: Recipients [E-Mails], comma-separated
-bc or -bcc      : BCC: Recipients [E-Mails], comma-separated
-tt or -title    : Mail [Title] (Subject - use quotes for whitespace)
-b  or -body     : Mail [Body] (Message Text - use quotes for whitespace)
-bf or -bodyF    : [File] to read Mail Body from
-ht or -html     : Mail [HTML] (Message HTML - use quotes for whitespace)
-hf or -htmlF    : [File] to read Mail HTML Body from
-a  or -attach   : Attachment [File or Dir] (Use repeatedly to add more)
-ch or -charset  : Use this [Charset] for text, default "ISO-8859-1"
-r  or -receipt  : Request a return receipt
-cp or -copy     : Place a copy of Mail into [IMAP Folder] (ignored if -o)
-i  or -imap     : IMAP4 [Server] to use (only relevant with -cp; default SMTP)
-o  or -output   : Instead of sending mail, create [File] containing mail
-v  or -verbose  : Give status info while sending
-of or -optionsF : [File] to read options from (CLI opts higher prio!)
-h  or -help     : Help (this usage)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert