Wer meine vorigen Artikel zum Thema Calibre gelesen hat, weiß, dass ich das Programm schätzen gelernt habe. Wer seinen E-Reader zum Lesen von kostenlosen Zeitungsartikeln nutzen will, wird wohl kaum um Calibre herumkommen. Zudem sind die Konvertierungs-Möglichkeiten umfangreich.
Nach einiger Zeit der Anwendung hatte ich nun aber den Wunsch, die Funktionalität von Calibre ohne dessen GUI zu nutzen.
Genauer gesagt, würde ich ohne GUI gerne regelmäßig News aus dem Internet beziehen und diese per Mail an mein Kindle übertragen lassen. Dazu braucht es keine GUI. Dazu braucht es auch keine Eingaben von mir. Die Verarbeitung sollte einfach im Hintergrund regelmäßig laufen.
Doch wie kann man das bewerkstelligen?
Um es gleich vorweg zu nehmen: ich werde mit diesem Beitrag hier nicht wirklich “die eine” Antwort auf diese Frage geben können. Vielmehr möchte ich Möglichkeiten – und deren Schwachpunkte – aufzeigen.
Kommandozeilen-Tools
Was zunächst einmal wunderbar aussieht und sicherlich auch ein toller Ansatz ist: Calibre ist modular aufgebaut. Die einzelnen Teile können jeweils per Kommandozeile bedient werden. So gibt es u.a. ein Kommandozeilen-Tool zum Abruf der News bzw. Konvertierung von E-Book-Formaten, eines für den Zugriff auf die Datenbank bzw. den Katalog und eines für den E-Mail-Versand.
Aus diesen Einzelteilen kann man sich dann ein Shellskript für den Nachrichten-Abruf und die Übertragung an das Gerät basteln.
Nachrichten abrufen / Dokumente konvertieren
Zum Abrufen von Daten per Recipes und zum Konvertieren von Dokumenten wird ein und das selbe Tool verwendet: ebook-convert
. Für das Abrufen der Nachrichten wird dazu lediglich als Quell-Format das Recipes-Format angegeben.
So sieht beispielsweise der Aufruf aus, der die aktuellen Artikel aus der Süddeutschen Zeitung abruft und im MOBI-Format in der Datei /tmp/sz.mobi
speichert:
ebook-convert /usr/share/calibre/recipes/sueddeutsche.recipe /tmp/sz.mobi
Die in Calibre mitgelieferten Default-Recipes findet ihr, wie ihr es an dem Beispiel sehen könnt, im Verzeichnis /usr/share/calibre/recipes
.
Habt ihr ein Recipe (im deutschen übrigens Schema genannt) angepasst oder gar ein eigenes erstellt, müsst ihr dessen Source-Code in eine Datei kopieren und dann diese Datei als Konvertierungs-Quelle angeben. Geht dazu folgendermaßen vor:
- Startet Calibre und ruft den Dialog auf, in dem ihr Recipes anlegen bzw. anpassen könnt.
- Ladet das Recipe, um das es euch geht.
- Schaltet den Editor in den erweiterten Modus.
- Kopiert den Quelltext des Recipes per Copy & Paste in eine Datei.
Das ist zugegebenermaßen nicht schön – aber es gibt wohl keine andere Möglichkeit.
Bücher / Dokumente in den Katalog eintragen
Wollt ihr ein Dokument bzw. ein Buch eurem Katalog (eurer Büchersammlung) hinzufügen, dann könnt ihr dazu das Tool calibredb
benutzen. Hier ein beispielhafter Aufruf, der die zuvor heruntergeladene Datei /tmp/sz.mobi
in den Katalog einfügt:
calibredb add /tmp/sz.mobi
Wenn ihr dann Calibre startet, werdet ihr einen neuen Eintrag finden.
Falls ihr euch jetzt fragt, was euch das bringt…
- … ist das erst einmal eine gute Frage! Denn wenn ihr das selbe Ziel habt, wie ich (nämlich Nachrichten-Download und -Zustellung per Mail an den Kindle), dann werdet ihr wenig Nutzen daraus ziehen und diesen Schritt überspringen können.
- Vielleicht wollt ihr ja den Calibre-Server betreiben, um eure E-Books und E-Papers dort aktiv abzuholen. In dem Fall wäre das Tool natürlich sehr wichtig für euch…
Dokumente per Mail an den Kindle senden
Mit dem Tool calibre-smtp
könnt ihr euch Bücher per Mail an den Kindle schicken. Wollten wir die zuvor heruntergeladene /tmp/sz.mobi
übertragen, würde der entsprechende Aufruf folgendermaßen aussehen:
calibre-smtp -a /tmp/sz.mobi -s "SZ" -r smtphost -u smtpuser -p smtppass absender@domain.com kindleusername@free.kindle.com "SZ"
Was die Argumente im Einzelnen bedeuten:
- Mit -a wird der Mail-Anhang angegeben, also die Datei, die übertragen werden soll. Amazon nimmt übrigens auch ZIP-Archive an. Man kann also erst einmal alle Nachrichten herunterladen, die MOBIs alle zusammen in eine ZIP packen und diese dann senden.
- Mit
-s
wird der Mail-Betreff angegeben. Der ist allerdings nicht sonderlich bedeutungsvoll.
- Mit
-r
wird der SMTP-Relay-Host angegeben. Also der SMTP-Server, an dem ihr euch anmelden und Mails versendet könnt. Solltet ihr ein GoogleMail-Konto haben, gebt hier smtp.googlemail.com
an.
- Mit
-u
und -p
gebt ihr eure Zugangsdaten für den SMTP-Server an, also den Benutzernamen (smtpuser
) und euer Kennwort (smtppass
).
- Anstelle von
absender@domain.com
müsst ihr eure Absender-Mailadresse angeben. Die ist besonders wichtig, denn ihr müsst diese in eurem Amazon-Konto als erlaubte Mailadresse (für den Kindle-Empfang) hinterlegt haben. An dieser Stelle: “sorry” an alle, die einen anderen E-Reader haben. Ich habe nun einmal einen Kindle und kann daher nur von dem berichten…
- Anstelle von
kindleusername@free.kindle.com
gebt ihr die Mailadresse eures Kindles an. Wie die lautet, könnt ihr in eurem Amazon-Konto nachsehen. Wichtig ist hier das free
in der Maildomain. Es gibt auch noch eine @kindle.com
-Adresse – ohne free
. Darüber bietet Amazon etwas mehr – die ist aber auch kostenpflichtig.
- Zum Schluss seht ihr hier noch das
"SZ"
, das den Text der Mail angibt. Auch der ist nicht wirklich von Bedeutung (zumindest beim Kindle nicht).
Weitere Informationen
Im Online-Manual von Calibre findet ihr eine genaue Beschreibung dieser und weiterer Calibre-Tools.
Wo ist also das Problem?
Naja, der modulare Aufbau ist ja wirklich schön und gut. Aber zwei Dinge gibt es da, die mich daran stören:
- Warum sollte ich alles das in einem Skript nachbauen, was ich in der GUI von Calibre sowieso schon eingerichtet habe? Calibre weiß doch, welche News ich wie und wann (Zeitplan) abrufen möchte. Warum kann ich also nicht einfach einen Job starten, der die eingeplaten Aufträge abarbeitet und sich danach beendet?
- Für den Mailversand muss ich im Shellskript mein Kennwort für den Zugriff auf den SMTP-Server in Klartext hinterlegen. Klar kann ich das irgendwie verschlüsseln. Aber wenn es mein Skript wieder entschlüsseln kann, dann kann es jeder andere auch. Das passt mir natürlich gar nicht. Und selbst, wenn für einen die Lösung mit der eigenen Verschlüsselung i.O. ist: für den Aufruf des Calibre-Tools für den SMTP-Versand muss man das Kennwort entschlüsseln. Und so taucht das Kennwort unverschlüsselt in der Prozess-Liste auf.
Nee, das geht mir zu weit. Mit seinem normalen Mailkonto sollte man das m.E. überhaupt nicht in Betracht ziehen. Wer Zugang zu deinem Mailkonto hat, kann sich ggfs. auch Zugriff auf andere Dienste verschaffen, bei denen du angemeldet bist. Stichwort: Kennwort vergessen und per Mail zusenden lassen bzw. zurücksetzen… Die Folgen könnten teuer werden…
Mail-Kennwort: Lösungs-Ansatz und Warnung
Was das Thema mit dem Passwort für das Mail-Konto angeht, habe ich mich mal umgesehen, ob man nicht einfach die in Calibre hinterlegten Konfigurations-Daten für den SMTP-Zugang nutzen könnte. Da Calibre größtenteils in Python geschrieben ist, kann man sich da auch relativ schnell reinhacken.
So sendet folgendes Python-Skript eine Mail – so wie das auch das Kommandozeilen-Tool calibre-smtp
tut. Allerdings muss man dabei die SMTP-Parameter nicht angeben. Das Skript zieht sich die in Calibre hinterlegten Konfigurationsdaten heran.
#!/usr/bin/python
import sys, os
path = os.environ.get('CALIBRE_PYTHON_PATH', '/usr/lib/calibre')
sys.path.insert(0, path)
sys.resources_location = os.environ.get('CALIBRE_RESOURCES_PATH', '/usr/share/calibre')
sys.extensions_location = os.environ.get('CALIBRE_EXTENSIONS_PATH', '/usr/lib/calibre/calibre/plugins')
sys.executables_location = os.environ.get('CALIBRE_EXECUTABLES_PATH', '/usr/bin')
from calibre.utils.smtp import compose_mail, sendmail, config as email_config
from binascii import unhexlify
opts = email_config().parse()
efrom = "absender@domain.com"
eto = "kindleusername@free.kindle.com"
msg = compose_mail(efrom, eto, "SZ", "SZ", "/tmp/sz.mobi")
sendmail(msg, efrom, eto, None, 1, None, opts.relay_host,
opts.relay_username, unhexlify(opts.relay_password),
opts.encryption, opts.relay_port, None)
Auch hierzu eine kurze Erklärung der im Skript enthaltenen Angaben:
- Wie schon oben bei der Beschreibung des Tools
calibre-smtp
ist absender@domain.com
der Absender, der im Amazon-Konto als erlaubter Absender für Kindle-Dokumente hinterlegt ist und kindleusername@free.kindle.com
die Kindle-Adresse.
- Beim Aufruf von
compose_mail
ist das erste SZ
der Mailtext und das zweite SZ
der Betreff der Mail. Beide Angaben sind natürlich wieder wenig von Bedeutung.
- Als letzten Parameter wird
compose_mail
der Pfad zu der Datei mitgegeben, die der Mail angehängt werden soll – also das E-Book bzw. Dokument.
Und wo ist jetzt die Warnung? Ganz einfach: seht euch mal das Skript hinsichtlich des SMTP-Kennworts an (der Teil unhexlify(opts.relay_password)
. Wie ihr seht, könnt ihr (und somit jeder, der auf euren Rechner Zugriff hat oder bekommt) mit einem kleinen Python-Skript das Passwort eures Mail-Kontos ermitteln. Also: auch das Hinterlegen des Kennworts in Calibre ist alles andere als sicher. Andererseits: wie soll es auch wirklich sicher sein…
Fazit
Wie einleitend schon gesagt, bin ich in diesem Thema sicher noch nicht am Ende angekommen. Seitens Calibre wäre es wünschenswert, dass tatsächlich ein Tool angeboten wird, das einfach alle anstehenden Aufgaben abarbeitet. Das Kennwort-Problem löst das allerdings nicht.
Hier bleibt nur der Rat, dass man sich am besten ein eigenes Mail-Konto anlegt, das man dann ausschließlich für diesen Zweck verwendet. Wenn das Kennwort einmal in fremde Hände fällt, kann der “Dieb” zumindest nicht viel damit anstellen…
Ich werde wohl in der nächsten Zeit probieren, auf meinem Rechner Postfix zu installieren – so, dass es Mails über meinen GMail-Account versenden kann. So kann man dann einerseits unbeschwert scripten und andererseit hat man eine sichere Konfiguration.
Was meint ihr? Habt ihr weitere Ideen? Gibt es da etwas, woran ich noch nicht gedacht habe?
pssst, weitersagen!