Git Product home page Git Product logo

inbox-python's Introduction

inbox-python

Python bindings for the Nylas REST API. https://www.nylas.com/docs

Installation

This library is available on pypi. You can install it by running pip install nylas.

##Requirements

  • requests (>= 2.3.0)

Examples

There's an example Flask app in the examples directory. You can run the sample app to see how an authentication flow might be implemented.

Note: you will need to replace the APP_ID and APP_SECRET with your Nylas App ID and secret to use the sample app.

Usage

App ID and Secret

Before you can interact with the Nylas REST API, you need to register for the Nylas Developer Program at https://www.nylas.com/. After you've created a developer account, you can create a new application to generate an App ID / Secret pair.

Generally, you should store your App ID and Secret into environment variables to avoid adding them to source control. That said, in the example project and code snippets below, the values are hardcoded for convenience.

Authentication

The Nylas REST API uses server-side (three-legged) OAuth, and this library provides convenience methods to simplify the OAuth process. Here's how it works:

  1. You redirect the user to our login page, along with your App Id and Secret
  2. Your user logs in
  3. She is redirected to a callback URL of your own, along with an access code
  4. You use this access code to get an authorization token to the API

For more information about authenticating with Nylas, visit the Developer Documentation.

In practice, the Nylas REST API client simplifies this down to two steps.

Step 1: Redirect the user to Nylas:

from flask import Flask, session, request, redirect, Response
from inbox import APIClient

@app.route('/')
def index():
    redirect_url = "http://0.0.0.0:8888/login_callback"
    client = APIClient(APP_ID, APP_SECRET)
    return redirect(client.authentication_url(redirect_uri))

Step 2: Handle the Authentication Response:

@app.route('/login_callback')
def login_callback():
    if 'error' in request.args:
        return "Login error: {0}".format(request.args['error'])

    # Exchange the authorization code for an access token
    client = APIClient(APP_ID, APP_SECRET)
    code = request.args.get('code')
    session['access_token'] = client.token_for_code(code)

You can take a look at examples/server.py to see a server implementing the auth flow.

Fetching Namespaces

client = APIClient(APP_ID, APP_SECRET, token)

# Get the first namespace
namespace = client.namespaces.first()

# Print out the email address and provider (Gmail, Exchange)
print namespace.email_address
print namespace.provider

Fetching Threads

# Fetch the first thread
thread = namespace.threads.first()

# Fetch a specific thread
thread = namespace.threads.find('ac123acd123ef123')

# List all threads tagged `inbox`
# (paginating 50 at a time until no more are returned.)
for thread in namespace.threads.items():
    print thread.subject

# List the 5 most recent unread threads
for thread in namespace.threads.where(tag='unread'):
    print thread.subject

# List all threads with '[email protected]'
for thread in namespace.threads.where(any_email='[email protected]').items():
    print thread.subject

Working with Threads

# List thread participants
for participant in thread.participants:
    print participant["email"]

# Mark as read
thread.mark_as_read()

# Archive
thread.archive()

# Unarchive
thread.unarchive()

# Add or remove arbitrary tags
tagsToAdd = ['inbox', 'cfa1233ef123acd12']
tagsToRemove = []
thread.update_tags(tagsToAdd, tagsToRemove)

# List messages
for message in thread.messages.items():
    print message.subject

Working with Files

Files can be uploaded via two interfaces. One is providing data directly, another is by providing a stream (e.g. to an open file).

# List files
for file in namespace.files:
    print file.filename

# Create a new file with the stream interface
f = open('test.py', 'r')
myfile = namespace.files.create()
myfile.filename = 'test.py'
myfile.stream = f
myfile.save()
f.close()

# Create a new file with the data interface
myfile2 = ns.files.create()
myfile2.filename = 'test.txt'
myfile2.data = "Hello World."
myfile2.save()

Once the files have been created, they can be added to a draft via the attach() function.

Working with Drafts

Drafts can be created, saved and then sent. The following example will create a draft, attach a file to it and then send it.

# Create the attachment
myfile = namespace.files.create()
myfile.filename = 'test.txt'
myfile.data = "hello world"

# Create a new draft
draft = namespace.drafts.create()
draft.to = [{'name': 'My Friend', 'email': '[email protected]'}]
draft.subject = "Here's an attachment"
draft.body = "Cheers mate!"
draft.attach(myfile)
draft.send()

Working with Events

The following example shows how to create, update and delete an event.

# Create the event
ev = namespace.events.create()
ev.title = "Party at the Ritz"
ev.when = {"start_time": 1416423667, "end_time": 1416448867} # These numbers are UTC timestamps
ev.location = "The Old Ritz"
ev.participants = [{"name": "My Friend', 'email': 'my.friend@example.com'}]
ev.save()

# Update it
ev.location = "The Waldorf-Astoria"
ev.save()

# Delete it
namespace.events.delete(ev.id)

Working with Messages, Contacts, Calendars, etc.

Each of the primary collections (contacts, messages, etc.) behaves the same way as threads. For example, finding messages with a filter is similar to finding threads:

messages = namespace.messages.where(to=ben@nylas.com).all()

The where method accepts a keyword argument for each of the filters documented in the Nylas Filters Documentation.

Account Management

Account status

It's possible to query the status of all the user accounts registered to an app by using .accounts:

accounts = client.accounts
print [(acc.sync_status, acc.account_id, acc.trial, acc.trial_expires) for acc in accounts.all()]

Open-Source Sync Engine

The Nylas Sync Engine is open-source, and you can also use the Python library with the open-source API. Since the open-source API provides no authentication or security, connecting to it is simple. When you instantiate the Inbox object, provide null for the App ID, App Secret, and API Token, and pass the fully-qualified address of your copy of the sync engine:

from inbox import APIClient
client = APIClient(None, None, None, 'http://localhost:5555/')

Contributing

We'd love your help making Nylas better. Join the Google Group for project updates and feature discussion. We also hang out in #nylas on irc.freenode.net, or you can email [email protected].

Please sign the Contributor License Agreement before submitting pull requests. (It's similar to other projects, like NodeJS or Meteor.)

If you have access to the PyPI repository, you can make a new release as such:

python setup.py release <major/minor/patch>
git log # to verify
python setup.py publish

Looking for inbox.py?

If you're looking for Kenneth Reitz's SMTP project, please update your requirements.txt file to use inbox.py or see the Inbox.py repo on GitHub.

inbox-python's People

Contributors

dlitz avatar emfree avatar grinich avatar khamidou avatar paultag avatar spang avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.