Mail to Dropbox

Die eigenen Dateien überall zugreifbar zu haben. Mit anderen an bestimmten Dateien arbeiten  - egal ob vom Desktoprechner, IPhone oder Android Smartphone. Das erlaubt Dropbox. Doch wie viele Dokumente finden überhaupt den Weg bis zum Dateisystem via Datei speichern?  Reiseplan, Whitepaper, Präsentation – recht häufig bekommen wir Dokumente lediglich per Mail gesendet. Den Anhang dennoch direkt auf die Dropbox zu speichern erlaubt “Mail to Dropbox”.

Für ganz eilige: Einfach eine Mail mit Dateianhang senden an “post@dropbox.eenga.de“. Nach einigen Minuten sollte eine E-Mail im Postfach sein mit der Bitte sich einmalig die Verlinkung zwischen Dropbox und dem Mail to Dropbox System herzustellen. Innerhalb des Dropbox Startortners wird im Anschluss ein Ordner “eenga_attachments” angelegt, indem nun alle Dateianhänge verfügbar sind.

Regelmäßige Nutzung

Wer dieses System regelmäßig nutzen möchte, der kann dies entweder hier auf diesem System machen (für 6 $ US einmalig) und weiterhin “post@dropbox.eenga.de” nutzen – oder sich die notwendigen Konfigurationen selbst vornehmen. Hierzu wird etwas Kenntnisse über Linux und die Funktion von Web, Mail, PHP benötigt.

Schritt 1 – Voraussetzungen prüfen

  • Domain Name kann frei konfiguriert werden (Nameserver editierbar)
  • Webserver mit PHP vorhanden, Verwendung von PEAR möglich
  • Procmail installiert und lauffähig
  • Dropbox Zugang vorhanden.

Schritt 2 – Neue Dropbox Anwendung einrichten

Auf Dropbox anmelden und dort eine neue Anwendung beantragen. Die weiteren Optionen sind eigentlich egal. Benötigt wird lediglich der “Schlüssel” und “Geheim” Wert, der am Ende der Seite angezeigt wird.

Schritt 3 – DNS Server editieren

Um das “normale” E-Mail System nicht zu beeinträchtigen würde ich empfehlen eine neue Sub-Domain anzulegen und für diesen auch den MX Eintrag beim Nameserver zu setzten. Für post@dropbox.eenga.de läuft das alles auf einem eigenen VServer, da die folgenden Scripte nicht unbedingt 100% sicher sind.

Schritt 4 – Procmail konfigurieren

zunächst einen neuen Nutzer im System anlegen und prüfen, dass dieser auch Mails empfangen kann. Anschliessend in dessen Home-Verzeichnis eine .procmailrc mit folgendem Inhalt anlegen:

LOGABSTRACT=yes

LOGFILE=/var/log/procmail.log

:0

*

| /usr/bin/php -q /home/benutzername/recmail.php

Den Wert für “Benutzername” entsprechend anpassen.

Schritt 5 – Mail Processing PHP (recmail.php) anlegen

&st;?$stdin = fopen("php://stdin","r"); while(!feof($stdin)) { $email .= fread($stdin, 1024); } $consumerKey = '#####EINTRAGEN######'; $consumerSecret = '#####EINTRAGEN######'; require_once 'Mail.php'; require_once 'Mail/mimeDecode.php'; require_once 'Mail/mime.php'; $params['include_bodies'] = true; $params['decode_bodies'] = true; $params['decode_headers'] = true; $decoder = new Mail_mimeDecode($email); $structure = $decoder->decode($params);

$from = $structure->headers["from"];

$user = md5("benutzername-".$from);

if(!is_dir("/home/benutzername/msg/".$user)) {

mkdir("/home/benutzername/msg/".$user);

}

$auth=array();

if(!is_file("/home/benutzername/msg/".$user.".auth")) {

$msg="";

$msg.="Thanks for sending in a file to the EEnga Mail to Dropbox system.\n\r";

$msg.="In order to save it please grant access visiting the following URL:\n\r";

$msg.=" http://dropbox.eenga.de/grant.php?".$user."\n\r";

$headers="";

$headers .= 'From: Eenga Mail to Dropbox

' . "\r\n";

mail( $from,"Dropbox Authentication required",$msg,$headers);

} else {

$auth=json_decode(file_get_contents("/home/benutzername/msg/".$user.".auth"),true);

}

foreach ($structure->parts as $part) {

// only save if an attachment

if (isset($part->disposition) && ($part->disposition=='attachment')) {

// open file

file_put_contents("/home/benutzername/msg/".$user."/".$part->d_parameters["filename"],$part->body);

if(isset($auth["token"])) {

include 'Dropbox/autoload.php';

$oauth = new Dropbox_OAuth_PEAR($consumerKey, $consumerSecret);

include 'Dropbox/autoload.php';

$oauth = new Dropbox_OAuth_PEAR($consumerKey, $consumerSecret);

$oauth->setToken($auth);

$dropbox = new Dropbox_API($oauth);

try { $dropbox->createFolder("eenga_attachments"); } catch(Exception $ex) {}

$dropbox->putFile("eenga_attachments/".$part->d_parameters["filename"],"//home/benutzername/msg/".$user."/".$part->d_parameters["filename"]);

}

}

}

?>

Benutzername immer entsprechend austauschen, den Consumer Key & Secret setzen, URL für die grant.php anpassen.

Schritt 6 – grant.php anlegen


&st;?
php

/* Please supply your own consumer key and consumer secret */
$consumerKey = '#### EINFÜGEN#####';
$consumerSecret = '#### EINFÜGEN#####';

include 'Dropbox/autoload.php';

/* We need a session to store the token, use whatever you want though to store these */
session_start();
if(isset($_REQUEST["user"])) {
$_SESSION["user"]=$_REQUEST["user"];
$_SESSION["state"]=1;
}

$oauth = new Dropbox_OAuth_PHP($consumerKey, $consumerSecret);

// If the PHP OAuth extension is not available, you can try
// PEAR's HTTP_OAUTH instead.
// $oauth = new Dropbox_OAuth_PEAR($consumerKey, $consumerSecret);

if (isset($_SESSION['state'])) {
$state = $_SESSION['state'];
} else {
$state = 1;
}
//$state=1;
switch($state) {

case 1 :
$tokens = $oauth->getRequestToken();

// Note that if you want the user to automatically redirect back, you can
// add the 'callback' argument to getAuthorizeUrl.
$redir=str_replace("api.dropbox","www.dropbox",$oauth->getAuthorizeUrl());
$redir.="&callback=".urlencode("http://dropbox.eenga.de/grant.php")."\n";

$_SESSION['state'] = 2;
$_SESSION['oauth_tokens'] = $tokens;
header("Location: ".$redir);
die();
case 2 :
$oauth->setToken($_SESSION['oauth_tokens']);
$tokens = $oauth->getAccessToken();
$_SESSION['state'] = 3;
$_SESSION['oauth_tokens'] = $tokens;
header("Location: /grant.php");
case 3 :
echo "Your user is authenticated\n";
echo "Mails send to post@dropbox.eenga.de will be saved to your Dropbox.\n";
file_put_contents("/home/benutzername/msg/".$_SESSION["user"].".auth",json_encode($_SESSION['oauth_tokens']));

$oauth->setToken($_SESSION['oauth_tokens']);
break;
}

?>

Comments are closed.