Digital

Instapaper Digest per E-Mail

Den Dienst Instapaper nutze ich regelmäßig, um mir Artikel zum späteren lesen zu speichern. Die gesammelten Artikel können bei Instapaper auch als Digest im ePub oder mobi Format heruntergeladen werden, ein Feature, das ich als ausgesprochener Fan des Lesens auf eInk-Geräten sehr schätze. Das Digest lässt sich zudem automatisch zu einer gewünschten Uhrzeit an eine E-Mail-Adresse versenden, doch leider kann in den Einstellungen nur eine Kindle-Gerät hinzugefügt werden:
Instapaper Kindle Settings

 

Als glücklicher Nutzer eines PocketBook-Readers wollte ich ein automatisch generiertes Digest nun gerne ebenso auf meinem Gerät empfangen und lesen. Eigentlich sollte dies kein großes Hindernis darstellen, denn der PocketBook-Reader verfügt wie der Kindle über eine E-Mail-Adresse, an die sich eBooks direkt an den Reader senden lassen. Eine Rückfrage beim Support von Instapaper ergab aber leider, dass dieses Feature momentan exklusiv für Kindle zur Verfügung steht.

Eine andere Lösung musste her, die ich schließlich mithilfe des Browser-Automatisierungstool Geb umsetzen konnte. Ein in Groovy geschriebenes Skript nutzt Geb um eine Firefox-Instanz zu öffnen, sich bei Instapaper einzuloggen, das aktuelle Digest herunterzuladen und per E-Mail an meinen Reader zu versenden. Und das schönste an dieser Lösung ist, dass sie auch mit einem headless Browser auf einem Raspberry Pi funktioniert. Ein Cronjob ruft das Groovy-Skript auf und ich erhalte vollautomatisch das Digest auf meinem Reader.

Zur Konfiguration des Skripts müssen die Credentials für Instapaper sowie für den Mail-Versand angepasst werden. Zum Versenden verwende ich eine Google-Adresse, ggf. müssen auch die Einstellungen des Mail-Server angepasst werden:

String instapaperUser = "blah@example.com"
String instapaperPasswd = "secret"

String mailUser = "blah@example.com"
String mailPasswd = "secretToo"
String mailRecipient = "pocketbook@example.com"

Quellcode des gesamten Groovy-Skripts:

@Grapes([
@Grab("org.gebish:geb-core:0.10.0"),
@Grab("org.seleniumhq.selenium:selenium-firefox-driver:2.45.0"),
@Grab("org.seleniumhq.selenium:selenium-support:2.45.0"),
@Grab("javax.mail:mail:1.4.3")
])

import geb.Browser

import javax.activation.DataHandler
import javax.activation.DataSource
import javax.activation.FileDataSource
import javax.mail.BodyPart
import javax.mail.Session
import javax.mail.Transport
import javax.mail.internet.InternetAddress
import javax.mail.internet.MimeBodyPart
import javax.mail.internet.MimeMessage
import javax.mail.internet.MimeMultipart

String instapaperUser = "blah@example.com"
String instapaperPasswd = "secret"

String mailUser = "blah@example.com"
String mailPasswd = "secretToo"
String mailRecipient = "pocketbook@example.com"

browser = new Browser();

browser.go("https://www.instapaper.com/user/login")
browser.find(".simple_form").username = instapaperUser
browser.find(".simple_form").password = instapaperPasswd
browser.find("#log_in").click()

File file = File.createTempFile("instapaperDigest",".mobi")
byte[] bytes = browser.downloadBytes("https://www.instapaper.com/mobi")
file << bytes

browser.go("https://www.instapaper.com/user/logout")
browser.close()
browser.quit()

Properties mailProperties = new Properties();
mailProperties.put("mail.smtp.host", "smtp.gmail.com");
mailProperties.put("mail.smtp.socketFactory.port", "465");
mailProperties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
mailProperties.put("mail.smtp.auth", "true");
mailProperties.put("mail.smtp.port", "465");
mailProperties.put("mail.smtp.user", mailUser);
mailProperties.put("mail.smtp.password", mailPasswd)

Session session = Session.getDefaultInstance(mailProperties);
MimeMessage mailMessage = new MimeMessage(session)
mailMessage.setFrom(new InternetAddress(mailUser))
mailMessage.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress(mailRecipient))
mailMessage.setSubject("Instapaper Digest")

MimeMultipart mulitpart = new MimeMultipart()

BodyPart bodyPart = new MimeBodyPart();
bodyPart.setText("New Instapaper Digest")
mulitpart.addBodyPart(bodyPart)

bodyPart = new MimeBodyPart()
DataSource dataSource = new FileDataSource(file.getAbsolutePath())
bodyPart.setDataHandler(new DataHandler(dataSource))
bodyPart.setFileName(file.getName())
mulitpart.addBodyPart(bodyPart)

mailMessage.setContent(mulitpart)

Transport transport = session.getTransport("smtp");
transport.connect("smtp.gmail.com", mailUser, mailPasswd);
transport.sendMessage(mailMessage, mailMessage.getAllRecipients());
transport.close();

file.delete()

Installation auf einem Raspberry Pi

Groovy lässt sich per GVM mit folgenden Zeilen auf dem Raspberry Pi installieren:

curl -s get.gvmtool.net | bash
source "$HOME/.gvm/bin/gvm-init.sh"
gvm install groovy

Als Browser kommt bei mir Iceweasel zum Einsatz, den ich als headless Browser nach dieser Anleitung installiert habe.

Durch die Integration des Dependency Managers Grape in Groovy, wird Geb bei Bedarf direkt durch das Groovy-Skript heruntergeladen. Das Skript muss also lediglich noch ausgeführt werden: groovy getInstapaperDigest.groovy

1 Kommentar zu “Instapaper Digest per E-Mail

  1. Eine wunderbare Erklärung, vielen Dank! Vor allem Instapaper wurde mir erst jetzt vorgestellt.

Schreibe einen Kommentar

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