Inbox en Python

Door Heli0s op dinsdag 8 juli 2014 18:00 - Reacties (4)
Categorie: -, Views: 3.632


code:
1
2
3
DISCLAIMER: in deze handleiding word uitgelegd hoe je inbox-sync installeert. 
Omdat hier verder geen beveiliging op zit kan theoretisch iedereen bij je 
mail, je bent gewaarschuwd!



Gister stond er een stukje op de frontpage over een nieuwe mail api die het mogelijk maakt om je Gmail te benaderen via een simple Rest API. Omdat ik al lang met het idee loop om een email client te maken (Omdat het kan en je er van kan leren) ben ik eens gaan kijken hoe het in elkaar steekt.

Op het moment van schrijven is er nog geen live omgeving om mee te werken, en is de enige optie om hier mee te spelen door een Vagrant test machine te maken. De uitleg op de site van Inbox is erg duidelijk, maar voor de compleetheid zet ik hem hier ook even neer:


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
For development, we recommend installing it on a VirtualBox or VMWare Fusion 
virtual machine and running it with Vagrant:

1: Install VirtualBox

2: Install Vagrant

3: git clone git@github.com:inboxapp/inbox.git

4: cd inbox

5: vagrant up

6: vagrant ssh

At this point you should be SSH’d into a shiny new Ubuntu 12.04 VM.

7: cd /vagrant

The inbox directory you started with should be synced to /vagrant. If this 
directory is empty, then logout and run vagrant reload and vagrant 
ssh again.

At this point the Inbox Sync Engine is installed and ready to process mail! 
The next steps are to start the processes that come with the open-source 
toolkit and authenticate a mail account.



Voor mensen die met Vagrant werken is dit denk ik wel duidelijk. Ik moest zelf eerst nog een vagrant reprovision doen om het allemaal werkent te krijgen, maar dat kwam waarschijnlijk door wat netwerk hickups.

Als je nu een werkende Vagrant omgeving hebt, kun je verder om de Inbox sync aan het werkt te krijgen. Hiervoor moet je met ssh in je Vagrant machine inloggen, en naar de /vagrant directory gaan. Hier moet je een aantal commando's uitvoeren:

Start de sync service, dit kan je het besten doen vanuit een screen sessie of in een aparte shell, omdat deze open blijft :

code:
1
$ bin/inbox-start



Nu kan je je email account toegang geven:


code:
1
2
3
$ bin/inbox-auth [YOUR_ACCOUNT]@gmail.com

$ bin/inbox-sync start [YOUR_ACCOUNT]@gmail.com



inbox-auth loopt je door het toegang geven van je account en inbox-sync start (zoals de naam al zegt) start de sync. Dit syncen kan, afhankelijk van de hoeveelheid mail in je gmail account, de eerste keer erg lang duren!

Als laatste moet je de api starten:


code:
1
$ bin/inbox-api



Nu kan je vanaf je host machine testen of het werkt met


code:
1
$ curl http://localhost:5555/n/



Als dit werk, heb je met succes de Inbox-sync test omgeving opgezet en kunnen we aan het echte werk beginnen!

Als eerst hebben we het namespace_id nodig, deze heb je al even gezien toen we de test deden. Het is naamelijk het id veld uit de JSON reply de we kregen van de test omgeving:


code:
1
2
3
4
5
6
7
8
{
    "id": "awa6ltos76vz5hvphkp8k17nt",
    "object": "namespace",
    "namespace": "awa6ltos76vz5hvphkp8k17nt",
    "account": "c5zc216uat483slypx67mu8i3",
    "email_adddress": "ben.bitdiddle@gmail.com",
    "provider": "Gmail",
}



je can deze ook achterhalen door http://localhost:5555/n/ in je browser op te vragen. Voor alle rest calls heb je dit basis url verder nodig. Bijvoorbeeld het opvragen van je labels:


code:
1
http://localhost:5555/n/<namespace_id>/tags



Het is nu erg makkelijk om informatie op te vragen via je browser, en de api documentatie is over het algemeen erg duidelijk. Het enige waar ik tegen aan liep, is het versturen van mail. Ik heb hiervoor een klein voorbeeld scriptje in python geschreven:


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
import requests
import json

url = "http://localhost:5555/n/3clbum5iozyjjl5s63ardrkv4/send"
headers = {'Content-Type': 'application/json'}


payload = {
    "to": [{"name": "Test", "email": "test@gmail.com"}],
    "body" : "Testing 1, 2, 3",
}

r = requests.post(url, data=json.dumps(payload), headers=headers)



Belangrijk hierbij is dat je de headers mee stuurt en dat je echt een json object aan levert. Vergeet ook niet de requests module te installeren.

Meer informatie vind je in de API documentatie