:incoming_envelope: IMAP/SMTP sync system with modern APIs

Related tags

Emailsync-engine
Overview

Nylas Sync Engine Build Status

The Nylas Sync Engine provides a RESTful API on top of a powerful email sync platform, making it easy to build apps on top of email. See the full API documentation for more details.

Need help? Join our Slack channel Slack Invite Button

Installation and Setup

  1. Install the latest versions of VirtualBox and Install Vagrant.

  2. git clone https://github.com/nylas/sync-engine.git

  3. cd sync-engine

  4. vagrant up

    Feel free to check out the Vagrantfile while this starts up. It creates a host-only network for the VM at 192.168.10.200.

  5. vagrant ssh

  6. cd /vagrant

  7. NYLAS_ENV=dev bin/inbox-start

And voilà! Auth an account via the commandline to start syncing:

bin/inbox-auth [email protected]

The inbox-auth command will walk you through the process of obtaining an authorization token from Google or another service for syncing your mail. In the open-source version of the sync engine, your credentials are stored to the local MySQL database for simplicity. The open-source Nylas Sync Engine does not support Exchange, but the hosted version does.

The sync engine will automatically begin syncing your account with the underlying provider. The inbox-sync command allows you to manually stop or restart the sync by running inbox-sync stop [YOUR_ACCOUNT]@example.com or inbox-sync start [YOUR_ACCOUNT]@example.com. Note that an initial sync can take quite a while depending on how much mail you have.

Nylas API Service

The Nylas API service provides a REST API for interacting with your data. To start it in your development environment, run command below from the /vagrant folder within your VM:

$ bin/inbox-api

This will start the API Server on port 5555. At this point You're now ready to make requests! If you're using VirtualBox or VMWare fusion with Vagrant, port 5555 has already been forwarded to your host machine, so you can hit the API from your regular web browser.

You can get a list of all connected accounts by requesting http://localhost:5555/accounts. This endpoint requires no authentication.

For subsequent requests to retreive mail, contacts, and calendar data, your app should pass the account_id value from the previous step as the "username" parameter in HTTP Basic auth. For example:

curl --user 'ACCOUNT_ID_VALUE_HERE:' http://localhost:5555/threads

If you are using a web browser and would like to clear your cached HTTP Basic Auth values, simply visit http://localhost:5555/logout and click "Cancel".

Now you can start writing your own application on top of the Nylas API! For more information about the internals of the Nylas Sync Engine, see the Nylas API Documentation.

Production Support

We provide a fully managed and supported version of the Nylas sync engine for production apps. Read more at https://nylas.com

Pull Requests

We'd love your help making Nylas better! Please sign-up for a developer account for project updates and the latest news. Feel free to create issues or pull requests to start discussions.

We require all authors sign our Contributor License Agreement when submitting pull requests. (It's similar to other projects, like NodeJS or Meteor.)

Security

For the sake of simplicity and setup speed, the development VM does not include any authentication or permission. For developing with sensitive data, we encourage developers to add their own protection, such as only running Nylas on a local machine or behind a controlled firewall. Note that passwords and OAuth tokens are stored unencrypted in the local MySQL data store on disk. This is intentional, for the same reason as above.

License

This code is free software, licensed under the The GNU Affero General Public License (AGPL). See the LICENSE file for more details.

Comments
  • Using generic IMAP with username

    Using generic IMAP with username

    Is it possible to access an IMAP mailbox requiring an username different from the e-mail address? Example:

    Password for test@****.com (hidden):
    Username:
    IMAP server host:
    
    feature-request 
    opened by amarcacci 23
  • 1 of 33 tests failing; new mail hitting gmail is only getting processed on restarting ./inbox start

    1 of 33 tests failing; new mail hitting gmail is only getting processed on restarting ./inbox start

    inbox app team: Thanks for a great project. I had been looking for projects using zerorpc. I have been playing around with inbox today and have it mostly working except for a single test. I wasn't sure if this was broken for you too? Part of the error msg was "No handlers could be found for logger "inbox.server.general"" and I was wondering if this might explain why new mails hitting my gmail inbox aren't getting picked up and pushed across to mysql. I set up a workbench GUI to try to understand the tables in mysql a bit better ... the message and thread tables only appear to update when I stop and restart ./inbox start. As per the installation readme, I had set up ./inbox sync start [email protected] ... and wasn't sure if this was hindering new mails being picked up automatically. Thanks. Colum

    runtest output is here: https://gist.github.com/Analect/f98543c05c39d763b307

    opened by Analect 21
  • Adding an imap account to sync

    Adding an imap account to sync

    I have successfully added a gmail account (using the command line) to sync and it works wonderfully.

    I cannot see how to add an imap account. Ideally, I would like to add it via the api and also know how to add a gmail account via the api but I cannot see anything in the docs for this. I have looked through the code also but cannot see anything. It looks like it can sync but I cannot see a resource I can use to add.

    opened by eamonnfaherty 15
  • Syncing all emails from Gmail - old messages not synced

    Syncing all emails from Gmail - old messages not synced

    I added a Gmail account with ~15gb of emails and after a few hours I still have close to 200 threads synced. I thought quotas.. so I added my own API key.

    Any tips on how to speed up the sync process?

    opened by xarg 14
  • Update Instructions

    Update Instructions

    It would be nice to have detailed update instructions. Like:

    vagrant halt
    git pull
    vagrant up
    vagrant ssh
    cd /vagrant/
    sudo sh setup.sh
    ...
    

    I am unable to start server again after the update.

    opened by pavelbinar 14
  • Hundreds of update_metadata calls eternally

    Hundreds of update_metadata calls eternally

    I unfortunately don't know enough about IMAP to be able to provide a meaningful bug report or patch right off the bat, but hopefully you can point me towards what information I can provide that might be helpful.

    I'm connecting to a Dreamhost IMAP server (not sure what software they use, unfortunately). I'm not sure if they're not compliant with IMAP standards (see #78) or if it just doesn't adhere to some common conventions. But I'm finding that when I go to sync, I'm always presented with dozens or hundreds of "UIDs to refresh" (https://github.com/inboxapp/inbox/blob/25bb4e867d372652e44083102d7e091849793d95/inbox/mailsync/backends/imap/imap.py#L393) in each folder.

    I'll then get a stream of:

    [INFO] {"account_id": 1, "level": "info", "timestamp": "2014-08-15T03:13:51.323217Z", "module": "inbox.mailsync.backends.imap.imap:870", "folder_name": "INBOX.Sent", "new_flags": {"6200": [["\\Seen"]], "6196": [["\\Seen"]], "6197": [["\\Answered", "\\Seen"]], "6198": [["\\Seen"]], "6199": [["\\Seen"]]}, "folder": "INBOX.Sent", "event": "new flags "}
    [DEBUG] {"account_id": 1, "level": "debug", "timestamp": "2014-08-15T03:13:51.323738Z", "module": "inbox.mailsync.backends.imap.imap:872", "folder": "INBOX.Sent", "event": "update_metadata acquired syncmanager_lock"}
    

    These will last for a while, then break breifly and then (I suppose when the next sync iteration starts) repeat.

    I'm not changing anything in my folders, so I'm not sure what it would be thinking needs to be updated. I'm happy to do a little more investigating if you can point me in the right direction.

    opened by trestletech 13
  • Fixed Bad Links in Getting Started Docs

    Fixed Bad Links in Getting Started Docs

    There are several bad links in the getting started docs that returned 404 pages on GitHub. Additionally, the headers weren't properly formatted. Both of these issues were rectified with proper links from the inboxapp website.

    opened by mmattioli 13
  • Running setup.sh aborts with Exception: TypeError: __cal__() takes exactly 2 arguments (1 given)

    Running setup.sh aborts with Exception: TypeError: __cal__() takes exactly 2 arguments (1 given)

    I'm attempting to install sync engine on a mint 17 box (based on ubuntu 14.04). Running setup.sh goes through for a bit and then errors out with the following message:

    Collecting nylas-production-python>=0.3.9 (from -r requirements.txt (line 1))
    /usr/local/lib/python2.7/dist-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:318: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/latest/security.html#snimissingwarning.
      SNIMissingWarning
    /usr/local/lib/python2.7/dist-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/latest/security.html#insecureplatformwarning.
      InsecurePlatformWarning
      Downloading nylas-production-python-0.3.9.tar.gz
    Exception:
    Traceback (most recent call last):
      File "/usr/local/lib/python2.7/dist-packages/pip/basecommand.py", line 215, in main
        status = self.run(options, args)
      File "/usr/local/lib/python2.7/dist-packages/pip/commands/install.py", line 324, in run
        requirement_set.prepare_files(finder)
      File "/usr/local/lib/python2.7/dist-packages/pip/req/req_set.py", line 380, in prepare_files
        ignore_dependencies=self.ignore_dependencies))
      File "/usr/local/lib/python2.7/dist-packages/pip/req/req_set.py", line 634, in _prepare_file
        abstract_dist.prep_for_dist()
      File "/usr/local/lib/python2.7/dist-packages/pip/req/req_set.py", line 129, in prep_for_dist
        self.req_to_install.run_egg_info()
      File "/usr/local/lib/python2.7/dist-packages/pip/req/req_install.py", line 412, in run_egg_info
        self.setup_py, self.name,
      File "/usr/local/lib/python2.7/dist-packages/pip/req/req_install.py", line 387, in setup_py
        import setuptools  # noqa
      File "/usr/local/lib/python2.7/dist-packages/setuptools/__init__.py", line 12, in <module>
        import setuptools.version
      File "/usr/local/lib/python2.7/dist-packages/setuptools/version.py", line 1, in <module>
        import pkg_resources
      File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 72, in <module>
        import packaging.requirements
      File "/usr/local/lib/python2.7/dist-packages/packaging/requirements.py", line 59, in <module>
        MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker")
    TypeError: __call__() takes exactly 2 arguments (1 given)
    

    How can I get past this error?

    opened by shchukax 12
  • How to implement security/authorization

    How to implement security/authorization

    Hi, I've recently set up a sync-engine instance on a home VM, how would I go about allowing N1 to connect to it from outside the network in a safe way? As I understand correctly there is a security concern simply exposing port 5555, as anybody can query for accounts and account Ids.

    I've seen https://github.com/nylas/sync-engine/pull/104 and https://github.com/nylas/sync-engine/pull/115 but still don't quite understand.

    opened by Porco-Rosso 12
  • inbox-auth warn about invalid character strings

    inbox-auth warn about invalid character strings

    Initial run of inbox-auth after google authentication spam tons of warnings like this:

    /usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py:450: Warning: Invalid utf8mb4 character string: '9A570A'
    
    opened by vitalyster 12
  • Can't build the sync-engine

    Can't build the sync-engine

    Hi guys!

    I followed the instructions to build the sync-engine, but I am having this problem:

    ==> default: /usr/local/lib/python2.7/dist-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
    ==> default:   InsecurePlatformWarning
    ==> default: You are using pip version 8.1.2, however version 9.0.1 is available.
    ==> default: You should consider upgrading via the 'pip install --upgrade pip' command.
    ==> default: Traceback (most recent call last):
    ==> default:   File "/usr/local/bin/pip", line 5, in <module>
    ==> default:     
    ==> default: from pkg_resources import load_entry_point
    ==> default:   File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 72, in <module>
    ==> default:     
    ==> default: import packaging.requirements
    ==> default:   File "/usr/local/lib/python2.7/dist-packages/packaging/requirements.py", line 59, in <module>
    ==> default:     
    ==> default: MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker")
    ==> default: TypeError
    ==> default: : 
    ==> default: __call__() takes exactly 2 arguments (1 given)
    The SSH command responded with a non-zero exit status. Vagrant
    assumes that this means the command failed. The output for this command
    should be in the log above. Please read the output to determine what
    went wrong.
    

    I am using vagrant 1.9.1 and VirtualBox as provider.

    opened by ronisbr 11
  • Update google.py

    Update google.py

    There is a small typo in inbox/events/google.py. as per the raised issue. Should read uncommitted rather than uncommited.

    Fixes #

    Summary:

    Test Plan:

    Reviewers: Please add the reviewer as an assignee to this PR on the right

    opened by Dids-Himanshu 0
  • Internal Error on event create for Gmail

    Internal Error on event create for Gmail

    Nylas::InternalError: An internal error occurred. If this issue persists, please contact support and include this request_uid: B9EBAC8F:C29C_0A4D0050:01BB_5B2BD4A5_15030C81:2AF0.

    opened by yevhene 0
  • Outlook.com all day events date mismatch

    Outlook.com all day events date mismatch

    I create event on 16.05.2018 (My timezone is +2 Kyiv, Ukraine) in outlook.com screenshot from 2018-05-24 18-07-38

    And then I pull event from nylas API and it is on 15.05.2018:

    {
      "id": "25d2ktgflve600le2lezkh1hw",
      ...
      "title": "allday",
      "when": {
        "date": "2018-05-15",
        "object": "date"
      }
    }
    
    opened by yevhene 1
  • Add environment variable so binaries work; tweak install script

    Add environment variable so binaries work; tweak install script

    I was trying to run this using the Vagrant method and I got some errors, so I thought I would just try and fix them.

    First, the default version of pip that's already installed seems to try to install from the non-TLS version of the python repositories.

    Next, the Python chardet library version that the system wants conflicts with one that's already installed on Ubuntu. I just uninstalled the package so the new one can get put in instead.

    I also disabled the pip version check, it just makes for confusing errors.

    And the last change to the setup.sh script is - because of how upstart is hooked into the system, mysql seems to start on its own and the mysqld_safe binary doesn't need to be run directly.

    Additionally, I modified the Vagrantfile to make the various binaries run as documented in the README. I adding a profile.d script to set the PYTHONPATH environment variable so those various binaries will execute correctly.

    That last change seems weird; if that was something that was necessary I would expect it to already be there? If there's a better or different way to do that, I'm happy to rework my changes here to accommodate.

    opened by uberbrady 0
Releases(17.1.6)
  • 17.1.6(Jan 6, 2017)

    We've switched to doing released in order to make sure folks are getting stable code. This release includes many changes (mostly bugfixes) from the past several months.

    Here is an abbreviated commit log. If you are updating your local sync engine, note there are several migrations you may need to run.

    4df11df [sync] TravisCI testing changes and version bump for OSS release
    5619ef9 [developer] More logs display bugfixes
    bcef868 [none] Update outdated comment
    1b42c6c [admin] Add instructions for perf profiler and make easier to use
    3e94a3f [balancer] Don't move Accounts that belong to debug sync instances
    d08e69b [api, sync] Handle more IMAP auth errors. Provide better error messages.
    aa9b82a [sync] Truncate long calendar names
    de16267 [api] Fixes AttributeError where some messages categories are None
    5cc00df [sync] Truncate traceback to prevent DataError cont.
    dd7bad3 [sync] Truncate traceback to prevent DataError
    bcfa1a5 [sync] Make sure the thread exists
    4f4bc6f [sync] Don't process event during message reconciliation
    0cbd15f [sync] Fixes T7297
    c386528 [*] Fix event queue bug
    825d9bc [api] Don't schedule draft deletion until message is sent
    29a5ed4 [all] Don't include debug instances by default
    6123e2a [sync] Handle JSON parsing errors from event queue data
    5a38ac6 [sync] Use KillerGreenletTracer for SyncHTTPFrontend
    124b57d [sync] Use PPAs instead of CPU history for process limits
    9de67a4 [sync] Unpack the right number of values for event queue lpop
    2f17ab1 [migrator] Make migrator send heartbeats
    3005676 [sync, api, admin, migrator] Guard event listener against multiple commits
    622a37f [sync] Use correct end time for all day events
    b250782 [sync, api] Mark Accounts that already have post commit listeners
    10243b5 [sync] Split shared and private event queue handlers
    3b08cf4 [sync] Fix bugs in updated unschedule script
    4b0b653 [balancer] Handle when account ID is missing
    76f5b13 [sync] Update script to manually unload Accounts
    4ed36b8 [balancer] Add stats logging for migration minimization
    d58d651 [sync] Flush private queue when receiving an event
    2a80cd4 [balancer] Use Hungarian algo to minimize migrations
    4b0040f [balancer] Parameterize the timespan for load balancing
    2191519 [none] Delete legacy scheduler code
    0a9626d [sync] Release owned Accounts that no longer should be
    2daba2d [sync] Turn noisy event queue timeout statement down to DEBUG
    e850a9f [all] Make database transaction timing metrics optional
    2a0719a [sync] Don't discard Account until it's marked as released in the DB
    065eb63 [webhooks,sync,api,admin] Consolidate StatsD code, revise metrics names
    b950d0a [sync] Notify when Account.sync_should_run changes
    8dc90fa [api] [direct_fetching] Handle case where g_msgid is None.
    498a9ff [sync] Comment out new statsd counters for now
    2c69eb5 [sync] Don't send migrate_from if desired_sync_host is None
    be41c73 [sync] Handle more folder roles edge cases
    fe8f3db [sync, api] Ignore irrelevent Account updates when sending events
    9f65c7b Fix another draft deletion edge-case
    1dcf4f9 [api] Add custom provider rule for adaptiveinsights.com
    0f323fb [sync] Use gauge for sync_hosts_count metric
    82b20fb [sync] Fixup sync restart script
    b8b1c27 [sync] Don't manually clear sync host
    ed70ec8 [sync] Add function to get vcpu count when balancing fleet
    205fc95 [sync] Fix some problems with finding Account loads
    1bfe66b [sync] Reduce some code duplication
    e67a9a5 [sync] Add script to dump per-Account loads in JSON
    88d0184 [sync] Add scripts to dump and restore the assigned sync redis hash
    531df0e [api, sync] Handle more errors during device provisioning.
    ad6ac16 [sync] Add legacy-balance-fleet to setup.py
    1e2aa19 [sync] Add legacy load balancer
    8b1ae86 [sync][api] Don't double-save to our legacy S3 bucket anymore
    aeae53a Log affected account id.
    81e8407 [sync] Add script to restart sync for forgotten Accounts
    5ed6047 [api] Direct fetching: handle non-existent UID replies.
    d8bb3e4 [syncback] Delete messages in a safe way
    36812e6 [migrator] Moar load balancer fixes
    aea75f9 [migrator] More sync load balancer fixes
    763fa83 [sync] Add script to balance sync fleet
    226d322 [api] Try converting g_msgid to a number if we get a string.
    3bd4764 [syncback] Merge adjacent SyncbackTasks for change_labels
    2103eec [sync] Add service to schedule Account migrations across sync hosts
    e7eba03 [sync] Deduplicate migration events
    8e015e2 [sync] Add per-Account sync counter for alerts
    b81bde9 [sync] Fixup string formatting in a couple scripts
    ca24daa Display exception breakdown in direct fetching validation script.
    d388df0 [sync] Add /build-metadata endpoint to SyncHTTPFrontend
    df7d351 More fixes for account migration
    c6c8a40 Fix Account migration stuff
    7251aed [schema][sync, api] Add ability to migrate Accounts between sync hosts
    b76ad14 Fix SyncHTTPFrontend after refactoring
    ed580d6 Commit after undeleting a Thread
    c7d1da6 [api] Bump nylas-production-python version
    0926449 [sync] Only collect first message metric for inbox
    c87a433 [sync] Include application_id in all requests
    69df7aa [api] Add provider to api request logs
    a4cc16f [api] Log more details on direct fetch failures
    8d56dc6 [api] Raise the right exception when trying to fetch a deleted message.
    89c78bd Skip null MIME parts.
    7aa87f4 Add more graphite logs.
    49576e0 [migration, sync] Update imapfolderinfo uidnext to be a bigint instead of int
    15b4d17 [direct-fetching] [sync] [api] Phase 2: Stop reading from our permanent bucket
    480c75e [sync] Fix truncation for TEXT columns
    95cc875 Add the ability to interrupt blocked greenlets
    3b0cdce Fix alembic migration script revisions
    4ed8cfc More exception catching
    0da4345 Log attempts on individual syncback actions
    66152e2 Standardize logging actionlog.id as action_log_id
    0b77782 Log account_id and num_connections as structured data in crispin pool creation
    4d468ee Make the direct fetching code a bit more robust
    e74efd2 Add profiler for SyncbackService
    e220f21 Add test for correct Contact.uid collation
    881548b Revert "Remove Block/Part ForeignKeys"
    d7e2af3 Bump nylas-production-python version
    ab7bb85 Bump nylas-production-python version
    9e4100b Skip Messages that don't have a valid Thread
    b8f8f81 [api, sync, schema] Make deleting Threads asynchronous
    53fe179 [sync, api] Don't update remote events if the remote event creation failed
    f5b5d82 [api] Update fastmail provider settings
    25e7a6f [api] Prevent TypeError for recurring calendar events
    723d84c Fix incorrect rebase of alembic migration script
    9781733 [SCHEMA] Drop foreign keys to and from Contact table
    e154aff Remove Block/Part ForeignKeys
    fe86721 [Ask @khamidou before shipping] Fetch attachments and raw messages directly from the email provider
    3a81f0f [api] Don't leak Exception messages when we don't know what they are!
    7ff64a4 Don't send an event invite to the owner.
    5b99c86 Set Part.content_id for inline attachments
    1f55c83 [api] fix(logging): Add all auth scope logging to WSGI context immediately
    727f9dd [api] fix(logging): Log namespace IDs before throwing 404s
    e47e6e7 Add support for sending inline images
    9a37aab [none] fix(logging): mysql “too many conn” is transient
    ed63006 [none] Upgrade coverage dep for more features
    9028025 [sync] fix(logging): Get default logger if none provided in callback
    f308473 [none] fix(tests): Use a random port for SMTP server
    e4aa649 fix(logging): Clip error messages saved to Account objects
    2d78db4 fix(logging): Don’t log transient mysql errors
    3461444 Standardize test database names
    f388883 [sync] Bump IMAPClient to include folder_status fix
    20f201f Provide detailed message to users when handling `OperationalError`'s
    572b70b Roll back to older pytest
    32e2b51 fix(tests): Unbreak local testing, oops
    2f8b12e fix(tests): Skip test_block_on_depleted_pool()
    7693683 Fix broken JSON in config-test.json
    482203a Split test sync-engine shard config out into separate config files
    c88471a Remove redwood DB config from sync engine test config
    e3eb09b Disable webhooks tests during jenkins runs until they are fixed
    af0881f Add iontrading as an exchange provider
    3512e7d Prevent ICS organizer CN field from being set to blank
    20e121d Bump nylas-production-python version
    ab6d56a Don't allow DetachedInstanceError crashes in model repr()
    c873997 Fix passing in of echo to engine()
    b27868f Quiet noisy 'syncing events' log statement
    c48cb33 Fix from address.
    f5bf5a8 Fix typo which made code super slow.
    5e13deb Turn down the production log volume more
    d7828d5 Remove Transaction ForeignKeys
    ea8d940 Give more insight about what deletion is doing 😅
    485250a Fix dev secrets filename
    113b95c Add ZONE in prod test config
    4e9603e For prod too
    236e968 Restore old SYNCBACK_ASSIGNMENTS values
    c860120 Syncback assignments really do have id '0' even though it's not valid JSON
    435f06a Add back some keys to the sync-engine test config
    7efb16b globs aren't strings
    19be6ef Deduplicate test configs
    e9f80b7 Make 'syncing contacts' message DEBUG also
    2f51947 Further reduce log volume
    363f98d Remove extraneous conftest.py
    87d8359 Install pytest.ini into package
    49c4371 Pass 127.0.0.1 as the hostname to mysql when dropping/creating test tables
    f9d9b62 sync-engine system tests depend on unspecified nylas API client library
    318e52e s/localhost/127.0.0.1/ on DATABASE_USERS also
    7661f81 Use 127.0.0.1 instead of localhost in test mysql configs
    1c02fee Give all test_util.py a different name
    e24c1d8 Fix SMTP SSL test
    cb1d356 Fix more tests
    ce226d9 Fix more tests in install
    da74be1 Ship JSON files too
    511fb55 Fix a bunch of tests
    c6901b1 Fix up MANIFEST.in to ship test data
    3abcc69 Fix Exchange tests to work in installed form
    c22eb3a Combine inbox.test dirs in installation
    127e617 Make tests work when package is installed too
    34276c6 Install test configs for sync-engine too
    5928e13 Add tox to sync-engine deps
    01fa0ac Distribute tests with source code
    
    Source code(tar.gz)
    Source code(zip)
  • v0.3.0(Sep 9, 2014)

    Hi Inbox Developers,

    Over the past month we've been hard at work at Inbox HQ as well as around the globe to improve the Inbox Sync Engine, API, and SDKs, and are proud to announce the release of version 0.3.0. You can find all the gory details on GitHub, but the high-level changes are noted below.

    API changes

    While we strive to maintain API stability, we've been working with folks building apps on top of Inbox and have found that the following API changes make some apps drastically simpler—enough to justify a backwards-incompatible change.

    • We've changed a number of endpoints to refer to items by item_id or item_ids rather than just item for greater clarity. This includes:
      • Rename the namespace attribute of all objects to namespace_id.
      • Rename the thread attribute of messages and drafts to thread_id.
      • Rename the messages and drafts attributes of threads to message_ids and draft_ids, respectively.
      • Rename the thread query parameter for filtering messages and drafts to thread_id.
    • The Draft update endpoint now uses the PUT HTTP method, consistent with other objects like threads and messages.
    • Drafts now have a version attribute, and updating a draft now simply changes its version, instead of creating a new draft object. (Note that updating or sending a draft now requires the version value as a parameter, in order to prevent write conflicts.)

    New Calendar and Events APIs

    These new APIs allow access to calendar and event information for accounts from Google, iCloud, Hotmail/Outlook.com and Microsoft Exchange (contact [email protected] to request beta hosted access). Check out the docs to get started!

    New SDKS

    We've released Ruby and Python bindings, making it even faster to get started building email apps against the hosted Inbox API.

    Here's a quick Python example:

    inbox = APIClient(APP_ID, APP_SECRET, token)
    
    namespace = inbox.namespaces.first()
    for thread in namespace.threads.items():
        print thread.subject
    

    Other feature additions

    • Attachment tag added to threads which have attachments.
    • Create an archive folder where necessary for various providers.
    • Namespace endpoint now support filtering options such as limit, offset and email_address.
    • Files endpoint supports delete for files that are not currently attachments.
    • User-created tags can be deleted.

    Bug Fixes

    • Propagate unread status changes to threads in update_metadata.
    • Better handling of HTML stripping for snippets.
    • Remove unused UIDNEXT from IMAP mailsync, since some providers don't support it.
    • More graceful handling of various IMAP errors.
    • Improved coverage for unit tests, notably over the API calls.
    • Refactor message / parts / blocks relationship to avoid creating new blocks when they are attached to messages.
    • Remove duplicated code around SMTP mail sending.
    • Truncate fields if they are too long on calendar/event parsing.
    • Properly check to, cc, bcc fields in drafts for formatting.

    With love from Team Inbox, -- mg, spang, kavya, eben, ben, charles, karim, dwayne, and zoë

    Source code(tar.gz)
    Source code(zip)
  • v0.2.0(Aug 13, 2014)

    Hi Inbox Developers,

    We are pleased to announce a new release of Inbox. We are again excited to see the enthusiasm from the community and we've been hard at work integrating change requests, adding new features and fixing bugs.

    Here's what's changed since the last release:

    New Features

    • Support for generic providers. We've now made it easier to add support for more providers through the "providers.py" file, where you may specify the relevant information for new providers without modifying other parts of the code.
    • Basic multicore support for mailsync.
    • Automatic detection for providers which support RFC4551 / 7162 (CONDSTORE).
    • An improved threading algorithm for providers which do not support automatic threading on the backend.
    • Theinbox-auth command is now scriptable with the options --exit_after_link and --token.
    • Better handling for invalid API query parameters.
    • The API message representation now includes detailed attachment information such as content_type, size, and filename.
    • Initial support for Outlook.com/Hotmail including sending, receiving, archiving and draft management
    • The drafts API supports ?thread=[filter], which returns all the drafts of a thread.

    Bug Fixes

    • Improved handling for accounts which no longer have valid credentials or cannot connect to the underlying provider.
    • Updated html2text version to avoid issues with malformed html.
    • A significantly reduced number of database connections are now needed to sync accounts.
    • Cleanly handle corrupted Gmail metadata cache files.
    • SIGTERM is properly handled in inbox-start/
    • The file attachment API call now returns a proper JSON response.
    • Assorted drafts/sending bugs.
    • Many performance improvements and other various bugfixes.
    • Improved provider identification during authorization process.

    Upgrading

    If you're running Inbox on your own infrastructure, make sure you've disabled the sync, API and syncback processes and run the following to upgrade:

    $ ./setup.sh
    

    Thanks to everyone for their continued support and interest in Inbox! If you run into problems with the latest, we hope you'll file an issue[1] or hop onto ##inbox to get help.

    The following folks contributed to this release (GitHub usernames by # of commits): emfree, charlesg3, kav-ya, spang, khamidou, grinich, bengotow, mmattioli, rmasters

    [1] https://github.com/inboxapp/inbox/issues
    
    Source code(tar.gz)
    Source code(zip)
Owner
Nylas
Helping developers quickly build features that connect to every email, calendar, and contacts provider in the world.
Nylas
Spam-bot - Simple email-spammer discord bot

📝 Functional [ ✔️ ] Premium system via .json [ ✔️ ] Spammer [ ✔️ ] Validater [ ✔️ ] Discord bot ❓ How to launch ➡️ 1) Make discord bot ➡️ 2) Paste to

1 Feb 18, 2022
Disposable email validator for python

disposable-email-validator installation pip install disposable-email-validator

1 Jan 05, 2022
Automatically Send Custom Named Certificates via Mail

Welcome to Certificate Launchpad 🚀 Automatically Send Custom Named Certificates via Email Intro After any event, sending certificates to attendees or

Dc7 16 Oct 16, 2022
A functional demo of the O365 Module to send an email on an authenticated, tokenized account.

O365_email A functional demo of the O365 Module to send an email on an authenticated, tokenized account. Prep Create an app in Azure Developer's porta

2 Oct 14, 2022
Django email backends and webhooks for Amazon SES, Mailgun, Mailjet, Postmark, SendGrid, Sendinblue, SparkPost and more

Django email backends and webhooks for Amazon SES, Mailgun, Mailjet, Postmark, SendGrid, Sendinblue, SparkPost and more

1.4k Jan 01, 2023
Send email in Python conveniently for gmail using yagmail

yagmail -- Yet Another GMAIL/SMTP client For the asynchronous asyncio version, look here: https://github.com/kootenpv/aioyagmail The goal here is to m

Pascal van Kooten 2.4k Dec 31, 2022
Djrill is an email backend and new message class for Django users that want to take advantage of the Mandrill transactional email service from MailChimp.

Djrill: Mandrill Transactional Email for Django Djrill integrates the Mandrill transactional email service into Django. PROJECT STATUS: INACTIVE As of

Brack3t 327 Oct 01, 2022
This simple python script uses cv2 to create and mail certificates to participants of workshops.

This simple python script uses cv2 to create and mail certificates to participants of workshops. Just collect the names and email ids of participants in a csv file (i used google docs), and place it

Sounder Rajendran 0 Dec 19, 2022
A Discord Mod Mail bot made in python

Fish-Mail The mod mail bot for Fish Hosting Note: You are not allowed to remove the names in the credit command Note: If you want any ideas/commands a

28 Aug 30, 2022
Generate Email, Register for anything, Get the OTP/Link

OTE : One Time Email Introduction ote is a command line utility that generates temporary email address and automatically extracts OTPs or confirmation

Somdev Sangwan 457 Jan 03, 2023
Secret Service Email Encryption/Steganography

SecretService Decoy Encrypted Emailer

Unit 221B 6 Aug 05, 2022
Python Email Sender (PES) is a program made with Python using smtplib, socket and tkinter.

Python Email Sender (PES) is a program made with Python using smtplib, socket and tkinter. This program was made for sender email to be a gmail account because that's what I used when testing it out,

Zacky2613 1 Aug 26, 2022
A Django app that allows you to send email asynchronously in Django. Supports HTML email, database backed templates and logging.

Django Post Office Django Post Office is a simple app to send and manage your emails in Django. Some awesome features are: Allows you to send email as

User Inspired 856 Dec 25, 2022
A simple email sender

Email-Sender Un semplice Email-Sender che utilizza il modulo smtplib con aggiunta di interfaccia grafica realizzata con il modulo tkinter Per il corre

Vincenzo Caliendo 0 Jan 14, 2022
An API to send emails through python3's smtplib module.

An API to send emails through python3's smtplib module. Just configure your SMTP server credentials and you are ready to send a lot of emails through API, designed to be used as a newsletter service.

Adnan Ahmad 15 Nov 24, 2022
A django package which act as a gateway to send and receive email with amazon SES.

django-email-gateway: Introduction: A Simple Django app to easily send emails, receive inbound emails from users with different email vendors like AWS

MicroPyramid 28 Nov 09, 2022
Email-bomber - Email bomber unlike other email bombers u don't need your gmail email id to use this

Email-bomber - Email bomber unlike other email bombers u don't need your gmail email id to use this

rfeferfefe 82 Dec 17, 2022
Python email address and Mime parsing library

Flanker - email address and MIME parsing for Python Flanker is an open source parsing library written in Python by the Mailgun Team. Flanker currently

Mailgun Team 1.6k Dec 29, 2022
It s a useful project for developers ... It checks available and unavailable emails

EmailChecker It s a useful project for developers ... It checks available and unavailable emails Installation : pip install EmailChecker Domains are

Sidra ELEzz 19 Jan 01, 2023
:incoming_envelope: IMAP/SMTP sync system with modern APIs

Nylas Sync Engine The Nylas Sync Engine provides a RESTful API on top of a powerful email sync platform, making it easy to build apps on top of email.

Nylas 3.5k Dec 23, 2022