Hallo zusammen,
auch wenn ich die Funktionalität eigentlich selbst nicht dringend benötige und daher nicht allzuviel Zeit in dieses Thema investieren wollte, habe ich mich nun auf mehrfachen Wunsch hin doch entschlossen, im Mailbox-Plugin eine Möglichkeit zu schaffen, HTML-only Mails halbwegs lesbar darzustellen.
Natürlich kann die Darstellung von HTML-Mails nicht mit echten Mail-Clients unter einer grafischen Benutzeroberfläche mit halten, da nach wie vor das OSD des VDR im 'Textmodus' verwendet wird. Ausserdem spielt die Qualität der Konvertierung des HTML-Quelltextes in Plain-Text eine Rolle.
Da ich weiterhin nicht die Absicht hatte, selbst einen HTML->Text-Konverter zu implementieren oder bestehenden Quelltext in das Plugin zu integrieren, kommen für diese Aufgabe externe Programme zum Einsatz.
Das ganze funktioniert wie folgt:
Das Plugin aktzeptiert einen neuen Parameter "-c <ConvertCmd>', dem ein externes Programm mitgegeben wird, welches zur Konvertierung verwendet wird.
Wenn das Plugin mit -c <ConvertCmd> gestartet wurde, wird für alle Teile von E-Mails, welche HML-Text enthalten und die auch dargstellt werden sollen (s.u.), folgendes ausgeführt:
- Das Plugin schreibt den HTML-Quelltext in eine temporäre Datei.
- Das Plugin ruft das 'ConvertCmd' mit folgenden Parametern auf:
-i <Name der HTML-Quelldatei>
-s <charset im HTML-Quelltext>
-o <Name der Text-Zieldatei>
-d <gewünschter charset in der Text-Zieldatei>
-w <Anzahl Zeichen / Zeile> - Kehrt der Aufruf des 'ConvertCmd' mit einem Fehlercode von 0 zurück, so liest das Mailbox-Plugin die Zieldatei (falls vorhanden) und stellt den enthaltenen Text anstelle des HTML-Quelltextes dar.
- Das Plugin löscht die Quell- und Zieldatei.
Als Name für die HTML-Quelldatei wird '/tmp/vdr-mail-<pid-des-VDR-Prozesses>.html' und als Name für die Text-Zieldatei wird '/tmp/vdr-mail-<pid-des-VDR-Prozesses>.txt' verwendet. VDR muss also die entsprechenden Rechte im Dateisystem haben.
Die Angabe der charsets ist erforderlich, um den Text korrekt für das OSD des VDR zu erzeugen. (Hint: VDR-1.5.x erlaubt neben den bisher verwendeten iso-8859-* auch UTF-8 als Zeichensatz.)
Mit dem Plugin möchte ich ein Shell-Script (mailconv.sh) liefern, welches zumindest ein paar mögliche Wege aufzeigt, wie die Konvertierung durchgeführt werden kann und welches direkt als Konvertierungskommando an das Plugin übergeben werden kann (also so: '-c /pfad/zum/befehl/mailcmd.sh')
Beispielhaft habe ich mich mit "html2text", "w3m" und "lynx" versucht, wobei das zu verwendende Programm natürlich auch installiert sein muss!
Folgendermassen sieht meine derzeitige Version von mailcmd.sh aus:
Da ich kein grosser Shell-Programmierer bin und mit nicht allzuvielen HTML-Mails experimentiert habe, nehme ich Verbesserungsvorschläge für mailcmd.sh gerne entgegen.
#!/bin/sh
# =================================================================
# converts the given srcfile in HTML-format to text format dstfile
# -----------------------------------------------------------------
# Parameters:
#
# -i <name of source file> -> SRCFILE
# -o <name of destination file> -> DSTFILE
# -s <charset of html-file> -> SRCCHARSET
# -d <charset of vdr-osd> -> DSTCHARSET
# -w <width in characters> -> WIDTH
#
# =================================================================
# CONVERTER=w3m
# CONVERTER=h2t
CONVERTER=lnx
CMDNAME=`basename $0`
LOGCMD="logger -t $CMDNAME"
# LOGCMD="echo"
# -----------------------------------------------------------------
# default values
# -----------------------------------------------------------------
SRCFILE=""
DSTFILE=""
CONTENT_TYPE="html"
CHARSET="iso-8859-1"
WIDTH=50
# -----------------------------------------------------------------
# show values
# -----------------------------------------------------------------
function showValues
{
$LOGCMD "Parameter:"
$LOGCMD "src-file: $SRCFILE"
$LOGCMD "src-Charset: $SRCCHARSET"
$LOGCMD "dst-file: $DSTFILE"
$LOGCMD "dst-Charset: $DSTCHARSET"
$LOGCMD "width: $WIDTH"
}
# -----------------------------------------------------------------
# process arguments
# -----------------------------------------------------------------
while getopts "i:o:c:s:d:w:" opt; do
case $opt in
i) SRCFILE=$OPTARG;;
o) DSTFILE=$OPTARG;;
s) SRCCHARSET=$OPTARG;;
d) DSTCHARSET=$OPTARG;;
w) WIDTH=$OPTARG;;
esac
done
shift $(($OPTIND - 1))
if test "$SRCFILE" = ""; then
$LOGCMD "source file missing (parameter -i)"
exit 1
fi
if test "$DSTFILE" = ""; then
$LOGCMD "desitnation file missing (parameter -o)"
exit 1
fi
if test "$SRCCHARSET" = ""; then
$LOGCMD "source charset missing (parameter -s)"
exit 1
fi
if test "$DSTCHARSET" = ""; then
$LOGCMD "destination charset missing (parameter -d)"
exit 1
fi
if test "$WIDTH" = ""; then
$LOGCMD "width missing (parameter -w)"
exit 1
fi
showValues
# -----------------------------------------------------------------
# convert
# -----------------------------------------------------------------
case $CONVERTER in
w3m)
$LOGCMD "using w3m..."
w3m -cols $WIDTH -I $SRCCHARSET -O $DSTCHARSET -S -dump $SRCFILE >$DSTFILE
;;
h2t)
# by default, html2text uses ISO 8859-1
# -> if VDR needs UTF-8, we have to convert the text afterwards
case $CHARSET in
UTF-8)
$LOGCMD "using html2text/iconv..."
html2text -width $WIDTH -nobs -style compact $SRCFILE | iconv -f $SRCCHARSET -t $DSTCHARSET > $DSTFILE
;;
*)
$LOGCMD "using html2text..."
html2text -width $WIDTH -nobs -style pretty $SRCFILE > $DSTFILE
;;
esac
;;
lnx)
$LOGCMD "using lynx..."
lynx -dump -nomargins -nonumbers -center -width $WIDTH -assume_charset=$SRCCHARSET -display_charset=$DSTCHARSET $SRCFILE > $DSTFILE
;;
*)
$LOGCMD "converter not set!"
;;
esac
EXTRET=$?
# -----------------------------------------------------------------
$LOGCMD "exiting with $EXTRET"
exit $EXTRET
Alles anzeigen
Noch ein Wort zu (HTML-)Mails überhaupt:
(sehr vereinfacht dargestellt)
[list=n]
[*] Der einfachste Fall sind Mails, die lediglich aus einem Teil bestehen, der reinem Plain-Text enthält. Diese werden wie gehabt angezeigt.
[*] Der Mail-Client des Absenders erzeugt die Mail so, dass sie aus mehreren Teilen (MULTIPART/ALTERNATIVE) besteht, wobei beide Teile den eigentlichen Text beinhalten. Ein Teil wird dabei vom Mail-Client des Absenders als Plain-Text formatiert und ein weiterer Teil enthält denselben Text im HTML- oder einem anderen Format.
Die Teile haben also den gleichen Inhalt, jedoch in unterschiedlicher Formatierung. Das Programm zur Anzeige der Mail hat nun die Wahl, welchen Teil bzw. welche Formatierung es am Besten darstellen kann.
Da das Mailbox-Plugin sowieso nur unformatierten Text darstellen kann, wird es denjenigen Teil der Mail darstellen, der Plain-Text enthält. Der HTML-Teil wird in diesem Fall also nicht angezeigt und damit auch keine Konvertierung durchgeführt.
(Siehe RFC 2046, Abschnitt 5.1.4 oder schöner formatiert in einem älteren RFC)
[*] Die Mail besteht aus einem Teil, der den Text im HTML-Format darstellt.
Hier wird das Plugin den externen Konvertierer aufrufen und den konvertierten Text darstellen.
[/list]
Die Test-Version 0.5.2-pre1 des Mailbox-Plugins bekommt Ihr hier
Sodele, und nun wünsche ich viel Spass beim Testen und - insbesondere von denjenigen, die sich diese Funktion gewünscht haben - Kommentare/Verbesserungsvorschläge zur mailcmd.sh (und der Funktion allgemein).
EDIT: 28.10.2007
Die Test-Version 0.5.2-pre2 des Plugins erlaubt es nun, mit der Taste 8 alle (darstellbaren) Teile einer Mail zu anzuzeigen, d.h. bei MULTIPART/ALTERNATIVE werden Plain- und HTML-Text-Teile angezeigt.
bye, Alex