{ "info": { "author": "St\u00e9phane RAULT", "author_email": "stephane.rault@radicalspam.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: BSD License", "Operating System :: POSIX :: Linux", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Topic :: Communications :: Email", "Topic :: Communications :: Email :: Mail Transport Agents" ], "description": "=================\nMongo Mail Server\n=================\n\n**Gevent SMTP Server with MongoDB storage** \n\n|Build Status| |pypi downloads| |pypi version| |pypi licence| |requires status|\n\n**Demo:**\n\n- URL: http://188.165.254.60:8083\n- Login: admin@example.net\n- Password: password\n\n**Features:**\n\n- SMTP Server high performance with Gevent Coroutine_ ( fork of Gsmtpd_ )\n- Postfix XFORWARD_ extension\n- Record messages in MongoDB_\n- Ability to use a custom python plugin to edit the message before recording\n\n**The use in production is not yet guaranteed**\n\n.. contents:: **Table of Contents**\n :depth: 1\n :backlinks: none\n\nQuarantine mode example\n=======================\n\n**Mode for quarantine or statistics only**\n\n.. image:: http://espace-groupware.com/docs/mongo-mail/img/mongo-mail-quarantine.jpg\n :alt: Mongo Mail Quarantine schema\n :align: center\n\n- Network: smtp sender or recipient (with internet or local network)\n- Content Filter: amavisd-new with xxx_quarantine_to (smtp:) parameters\n- Configuration in amavisd.conf\n- Zero configuration for Postfix\n\nProxy mode example\n==================\n\n**Mode for statistics or honey pot**\n\n.. image:: http://espace-groupware.com/docs/mongo-mail/img/mongo-mail-proxy.jpg\n :alt: Mongo Mail Proxy schema\n :align: center\n \n- Network: smtp sender or recipient (with internet or local network) \n- Optional: filtering after delivery to postfix by mongo mail\n\nFilter mode example\n===================\n\n**Mode for spam/virus filtering and statistics**\n\n.. image:: http://espace-groupware.com/docs/mongo-mail/img/mongo-mail-filter.jpg\n :alt: Mongo Mail Filter schema\n :align: center\n \n- Network: smtp sender or recipient (with internet or local network) \n- Filtering: clamav/spamassassin with TCP connection (without amavisd-new)\n- Out filter: delivered so clean else\n\nImportant Notes\n===============\n\n- **Message is not transformed (unless in quarantine mode if MMS_REAL_RCPT=1)**\n\n- **Gross message is stored in GridFS after being compressed (zlib) and converted to base64**\n\n- **In proxy mode, the raw message is sent before the registration in MongoDB and is not saved if an error occurs while sending or all recipients are rejected** \n\nTested With\n-----------\n\n- Docker_ 1.4.1\n- Ubuntu_ 14.04\n- MongoDB_ 2.6.5\n- Python_ 2.7.6\n- Gevent_ 1.0\n- Pymongo2_8_ 2.8 and Pymongo_ 3.0 \n- Postfix_ 2.5.5\n- Amavisd-new_ 2.6.4\n\nMessage Data\n============\n\nBefore sent to MongoDB\n----------------------\n\n.. code:: python\n\n {'client_address': '139.129.236.68',\n 'message': ObjectId('55252ae62d4b25262070a176'),\n 'rcpt': ['jean91@example.com'],\n 'rcpt_count': 1,\n 'rcpt_refused': {},\n 'received': datetime.datetime(2015, 4, 8, 13, 19, 34, 579000, tzinfo=tzutc()),\n 'sender': 'acollet@example.org',\n 'server': '127.0.0.1',\n 'store_key': '77bd8b356cf2c593e61a6c0a7cbc5572eb357a7b857adca402ee40021db34fa6',\n 'xforward': {'ADDR': '139.129.236.68',\n 'HELO': 'mx.example.org',\n 'NAME': 'mx.example.org'}} \n \n 'message': ObjectId('55252ae62d4b25262070a176') is reference to data in Gridfs \n \nAfter record in MongoDB - Read from mongo-mail-web\n--------------------------------------------------\n\n.. code:: python\n\n {'_id': ObjectId('55252ae62d4b25262070a178'),\n 'client_address': u'139.129.236.68',\n 'completed': 0,\n 'errors_count': 0,\n 'events': [],\n 'files': [],\n 'files_count': 0,\n 'group_name': u'DEFAULT',\n 'headers': {},\n 'internal_field': 0,\n 'is_banned': 0,\n 'is_bounce': 0,\n 'is_in': 1,\n 'is_spam': 0,\n 'is_unchecked': 0,\n 'is_virus': 0,\n 'mark_for_delete': 0,\n 'message': ObjectId('55252ae62d4b25262070a176'),\n 'parsing_errors': [],\n 'queue': 1,\n 'rcpt': [u'jean91@example.com'],\n 'rcpt_count': 1,\n 'rcpt_refused': {},\n 'received': datetime.datetime(2015, 4, 8, 13, 19, 34, 579000, tzinfo=),\n 'sender': u'acollet@example.org',\n 'server': u'127.0.0.1',\n 'size': 0L,\n 'store_key': u'77bd8b356cf2c593e61a6c0a7cbc5572eb357a7b857adca402ee40021db34fa6',\n 'tags': [],\n 'xforward': {u'ADDR': u'139.129.236.68',\n u'HELO': u'mx.example.org',\n u'NAME': u'mx.example.org'}}\n\nAfter parsing with mongo-mail-web (completed task)\n--------------------------------------------------\n\n.. code:: python\n\n {'_id': ObjectId('55252ae62d4b25262070a178'),\n 'client_address': u'139.129.236.68',\n 'completed': 1,\n 'country': u'CN',\n 'errors_count': 0,\n 'events': [],\n 'files': [],\n 'files_count': 0,\n 'group_name': u'DEFAULT',\n 'headers': {u'Content-Transfer-Encoding': [u'base64', {}],\n u'Content-Type': [u'text/plain', {u'charset': u'utf-8'}],\n u'Date': u'Wed, 08 Apr 2015 13:19:34 UTC',\n u'From': u'\"Bertrand Auger\" ',\n u'Message-Id': u'<20150408131934.10264.63423@admin-VAIO>',\n u'Mime-Version': u'1.0',\n u'Subject': u'Provident tempora ad quasi enim in ratione excepturi. Optio soluta culpa voluptas labore in. Voluptatem aliquid est rerum in est adipisci dolore.',\n u'To': u'\"Thierry Leleu\" ',\n u'X-Mailer': u'MessageFaker'},\n 'internal_field': 0,\n 'is_banned': 0,\n 'is_bounce': 0,\n 'is_in': 1,\n 'is_spam': 0,\n 'is_unchecked': 0,\n 'is_virus': 0,\n 'mark_for_delete': 0,\n 'message': ObjectId('55252ae62d4b25262070a176'),\n 'message_id': u'20150408131934.10264.63423@admin-VAIO',\n 'parsing_errors': [],\n 'queue': 1,\n 'rcpt': [u'jean91@example.com'],\n 'rcpt_count': 1,\n 'rcpt_refused': {},\n 'received': datetime.datetime(2015, 4, 8, 13, 19, 34, 579000, tzinfo=),\n 'sender': u'acollet@example.org',\n 'sent': datetime.datetime(2015, 4, 8, 13, 19, 34, tzinfo=),\n 'server': u'127.0.0.1',\n 'size': 636L,\n 'store_key': u'77bd8b356cf2c593e61a6c0a7cbc5572eb357a7b857adca402ee40021db34fa6',\n 'subject': u'Provident tempora ad quasi enim in ratione excepturi. Optio soluta culpa voluptas labore in. Voluptatem aliquid est rerum in est adipisci dolore.',\n 'tags': [],\n 'xforward': {u'ADDR': u'139.129.236.68',\n u'HELO': u'mx.example.org',\n u'NAME': u'mx.example.org'}} \n\nOriginal Message\n----------------\n\n::\n\n Content-Type: text/plain; charset=\"utf-8\"\n MIME-Version: 1.0\n Content-Transfer-Encoding: base64\n X-Mailer: MessageFaker\n Message-ID: <20150408131934.10264.63423@admin-VAIO>\n From: \"Bertrand Auger\" \n To: \"Thierry Leleu\" \n Subject: Provident tempora ad quasi enim in ratione excepturi. Optio soluta\n culpa voluptas labore in. Voluptatem aliquid est rerum in est adipisci\n dolore.\n Date: Wed, 08 Apr 2015 13:19:34 UTC\n \n U2l0IHZvbHVwdGF0ZSByZXJ1bSBjb3Jwb3JpcyBkb2xvcmlidXMgZW9zLiBRdWFzIGVvcyBub24g\n bW9kaSBxdWlzLiBBbGlhcyB2ZWwgbGF1ZGFudGl1bSBtYWduaSBzdXNjaXBpdC4gRnVnaWF0IGV0\n IHF1aXMgZXQgaW4gYWNjdXNhbXVzLg==\n\n\nInstallation\n============\n\nWithout Docker\n--------------\n\nRequired\n::::::::\n\n- MongoDB Server\n- Postfix or Amavisd-new\n- Python 2.7.6+ (< 3.x)\n- python-gevent 1.0+\n- recent setuptools and pip installer\n\nInstallation\n::::::::::::\n\n.. code:: bash\n\n $ pip install mongo-mail-server\n\n $ mongo-mail-server --help \n\n\nWith Docker\n-----------\n\nRequired\n::::::::\n\n- Docker 1.4+\n- MongoDB Server\n \nMongoDB Server example\n::::::::::::::::::::::\n\nContenair based on Ubuntu 14.04 - Python 2.7\n\nImage from Dockerfile_\n\n.. code:: bash\n\n $ docker pull dockerfile/mongodb\n \n $ docker run -d -p 27017:27017 --name mongodb dockerfile/mongodb mongod --smallfiles\n \n # Persist mongodb\n $ docker run -v /home/persist/mongodb:/data/db -d -p 27017:27017 --name mongodb dockerfile/mongodb mongod --smallfiles\n\nBuild Mongo Mail Server image\n:::::::::::::::::::::::::::::\n\n.. code:: bash\n\n $ git clone https://github.com/radical-software/mongo-mail-server.git\n \n $ cd mongo-mail-server && docker build -t mongo-mail-server .\n \n # help and verify\n $ docker run -it --rm mongo-mail-server --help\n\nRun Mongo Mail Server\n:::::::::::::::::::::\n\n.. code:: bash\n\n $ mongodb_ip=$(docker inspect -f '{{.NetworkSettings.IPAddress}}' mongodb)\n\n # start for test\n $ docker run -it --rm -e MMS_MONGODB_URI=mongodb://$mongodb_ip/message -p 172.17.42.1:14001:14001 mongo-mail-server\n\n # start of background (optional: bind of docker0 interface)\n # Add --restart=always for automatic restart \n $ docker run -d --name mms -e MMS_MONGODB_URI=mongodb://$mongodb_ip/message -p 172.17.42.1:14001:14001 mongo-mail-server\n\n # Logs\n $ docker logs mms\n 2015-02-12 07:35:36 rs_smtpd_server: [INFO] - Starting SMTP Server - server[mongo-quarantine] - on 0.0.0.0:14001 (PID:1)\n\nConfiguration\n=============\n\nMMS_SERVER\n----------\n\nServer mode: mongo-quarantine | mongo-proxy | mongo-proxy | debug\n\n*Default*: mongo-quarantine\n\n.. code:: bash\n\n # with command mode\n $ export MMS_SERVER=mongo-quarantine\n \n # with docker environ\n $ docker run -e MMS_SERVER=mongo-quarantine\n \n # with command arguments\n $ mongo-mail-server --server mongo-quarantine \n\nMMS_HOST\n--------\n\n**Host bind**\n\n*Default*: 0.0.0.0\n\n.. code:: bash\n\n # with command mode\n $ export MMS_HOST=0.0.0.0\n \n # with docker environ\n $ docker run -e MMS_HOST=0.0.0.0\n \n # with command arguments\n $ mongo-mail-server --host 0.0.0.0 \n\nMMS_PORT\n--------\n\n**Port bind**\n\n*Default*: 14001\n\n.. code:: bash\n\n # with command mode\n $ export MMS_PORT=14001\n \n # with docker environ\n $ docker run -e MMS_PORT=14001\n \n # with command arguments\n $ mongo-mail-server --port 14001\n \nMMS_MONGODB_URI\n---------------\n\n*Default*: mongodb://localhost/message\n\nhttp://docs.mongodb.org/manual/reference/connection-string/\n\n.. code:: bash\n\n # with command mode\n $ export MMS_MONGODB_URI=mongodb://localhost/message\n \n # with docker environ\n $ docker run -e MMS_MONGODB_URI=mongodb://localhost/message\n \n # with command arguments\n $ mongo-mail-server --mongo-host mongodb://localhost/message\n\n\nMMS_MONGODB_DATABASE\n--------------------\n\n**DB Name for recording mails**\n\n*Default*: message\n\n.. code:: bash\n\n # with command mode\n $ export MMS_MONGODB_DATABASE=message\n \n # with docker environ\n $ docker run -e MMS_MONGODB_DATABASE=message\n \n # with command arguments\n $ mongo-mail-server --mongo-database message\n\n\n\nMMS_MONGODB_COLLECTION\n----------------------\n\n**Collection Name for recording mails**\n\n*Default*: message\n\n.. code:: bash\n\n # with command mode\n $ export MMS_MONGODB_COLLECTION=message\n \n # with docker environ\n $ docker run -e MMS_MONGODB_COLLECTION=message\n \n # with command arguments\n $ mongo-mail-server --mongo-collection message\n \nMMS_TIMEOUT\n-----------\n\n**Timeout for smtp transaction from Postfix**\n\n*Default: 600 (seconds)*\n\nMMS_DATA_SIZE_LIMIT\n-------------------\n\n**Size limit of message (in bytes)**\n\n*Default: 0 (no limit)*\n\nMMS_REAL_RCPT (for amavisd-new < 2.7.0)\n---------------------------------------\n\n**Replace smtp recipient by real recipients (for quarantine with amavisd-new)** \n\n*Default*: disable\n\n.. code:: bash\n\n # with command mode\n $ export MMS_REAL_RCPT=1\n \n # with docker environ\n $ docker run -e MMS_REAL_RCPT=1\n \n # with command arguments\n $ mongo-mail-server --real-rcpt\n \nUsecase - Quarantine Mode configuration - with Amavis\n=====================================================\n\n**caution**\n\n::\n\n Before amavisd-new 2.7.0 the recipient envelope is replaced by xxx_quarantine_to parameters\n \n Starting from 2.7.0, use macro '%a' in xxx_quarantine_to parameters\n\n**caution**\n\n::\n \n About IP Address of smtp sender:\n \n Amavis does not use the extension SMTPD FORWARD to send mails in quarantine. The original IP address is lost.\n \n The solution might be to use postfix to amavis output for quarantine and postfix then return the message to mongo-mail \n \n\nFor Archiving only\n------------------\n\n.. code:: bash\n\n $ vi amavisd.conf\n \n # ip address and port of Mongo Mail Server\n $archive_quarantine_method = 'smtp:[172.17.42.1]:14001';\n \n # Any valid email address. Domain few not exist\n $archive_quarantine_to = 'archive-quarantine@localhost.net';\n \n # reload amavis\n\nFor Quarantine and Archiving\n----------------------------\n\n.. code:: bash\n\n $ vi amavisd.conf\n\n $archive_quarantine_method = 'smtp:[172.17.42.1]:14001';\n $archive_quarantine_to = 'archive-quarantine@localhost.net';\n\n $virus_quarantine_method = $archive_quarantine_method;\n $banned_files_quarantine_method = $archive_quarantine_method;\n $spam_quarantine_method = $archive_quarantine_method;\n \n # Not quarantine for clean mail - already stored with archive_quarantine_method\n $clean_quarantine_method = undef;\n \n # Not quarantine for bad header mail\n $bad_header_quarantine_method = undef;\n\n $virus_quarantine_to = $archive_quarantine_to;\n $banned_quarantine_to = $archive_quarantine_to;\n $spam_quarantine_to = $archive_quarantine_to;\n \n #OR\n $virus_quarantine_to = 'virus-quarantine@localhost.net';\n $banned_quarantine_to = 'banned-quarantine@localhost.net';\n $spam_quarantine_to = 'spam-quarantine@localhost.net';\n \nUsecase - Proxy Mode - Honey pot\n================================\n\n**Dedicate a postfix server for this purpose**\n\n.. code:: bash\n\n # main.cf - ip:port of Mongo Mail\n smtpd_proxy_filter=127.0.0.1:14001\n \n # or with command line\n $ postconf -e 'smtpd_proxy_filter=127.0.0.1:14001'\n \n # reload postfix\n $ postix reload\n \n\nUsing a plugin\n==============\n\n**The module must be in a package**\n\n.. code:: python\n\n # just required apply(metadata=None, data=None) method\n\n # examples/plugins/dummy_plugin.py - modify server field and print message\n \n import pprint\n def apply(metadata=None, data=None):\n metadata['server'] = \"1.1.1.1\"\n pprint.pprint(metadata) \n \n # Use:\n $ mongo-mail-server --server debug --host 127.0.0.1 --port 14001 --plugin contrib.dummy_plugin start\n\n # Use multiple plugins - run in the order of arguments\n $ mongo-mail-server --server --plugin myplugin1 --plugin myplugin2 ...\n \nSMTP Tests - With Telnet\n========================\n\n.. code:: bash\n\n # Use 172.17.42.1 is binding of docker0 else:\n $ mms_ip=$(docker inspect -f '{{.NetworkSettings.IPAddress}}' mms)\n\n $ telnet $mms_ip 14001\n \n Trying 172.17.1.19...\n Connected to 172.17.1.19.\n Escape character is '^]'.\n 220 a88632d9a311 SMTPD at your service\n \n ehlo me.com\n 250-a88632d9a311 on plain\n 250-XFORWARD NAME ADDR PROTO HELO SOURCE PORT\n 250 HELP\n \n XFORWARD NAME=mail.test.fr ADDR=1.1.1.1 HELO=test.fr\n 250 Ok\n \n MAIL FROM:\n 250 Ok\n \n RCPT TO:\n 250 Ok\n \n DATA\n 354 End data with .\n Subject: Test\n From: contact@test.fr\n To: contact@localhost.net\n \n mytest\n .\n 250 Ok: queued as ab80249748e0496b812b13c489a88002fbe102fc9c263b02a8b52101491f0128\n \n QUIT\n 221 Bye\n Connection closed by foreign host.\n \nUse mongofiles command\n======================\n\n.. code:: bash\n\n $ mongofiles -d message list\n 72c0f4898db56d5e10037e3f7f0c2af68704c8b86a2405d98a3e44e89bb56481 2188\n 571329a72c31a914251fd6fdecb160403345ee143c194cfc442ab5bee6118918 2188\n a8de0206f9978346326cbcc9ffd5df647728268c19e8564dd1c2790b6c1404f3 2192\n ... \n \n # Extract and write message to disk\n $ mongofiles -d message get 75e3896c1c5d98a21fc14e9408e1b9be91ced60f2bc224416de63c975c9c2915\n \n # Convert with python\n python -c \"import zlib,base64; print(str(zlib.decompress(base64.b64decode(open('75e3896c1c5d98a21fc14e9408e1b9be91ced60f2bc224416de63c975c9c2915', 'rb').read()))))\"\n\n # Parse to email.Message and print as_string()\n python -c \"import zlib,base64,email; print(email.message_from_string(str(zlib.decompress(base64.b64decode(open('75e3896c1c5d98a21fc14e9408e1b9be91ced60f2bc224416de63c975c9c2915', 'rb').read())))).as_string())\"\n \n \nTips\n====\n\nSMTP timeout\n------------\n\nUse MMS_TIMEOUT in environment or --timeout\n\nSize of messages\n----------------\n\nUse MMS_DATA_SIZE_LIMIT in environment or --data-size-limit\n\nOpen Message with Python\n------------------------\n\n.. code:: python\n\n >>> import os, zlib, base64\n >>> from pprint import pprint as pp\n >>> from email.parser import Parser, HeaderParser\n >>> from pymongo import MongoClient\n >>> from gridfs import GridFS\n >>> client = MongoClient(os.environ.get('MMS_MONGODB_URI'))\n >>> db = client['message']\n >>> col = db['message']\n >>> doc = col.find_one() \n >>> fs = GridFS(db)\n >>> msg_base64 = fs.get(doc['message']).read()\n >>> msg_string = zlib.decompress(base64.b64decode(msg_base64))\n >>> msg = Parser().parsestr(msg_string)\n >>> msg\n \n\n\nTODO\n====\n\n- More tests\n- Travis tests\n- Monitoring with psutil\n- Filter tasks\n- Documentation of mongo-mail-reader command\n- Documentation en Fran\u00e7ais\n\nIdeas\n=====\n\n- Record to ElasticSearch\n- Sends statistics to graphite, statsd, influxdb\n\nContributing\n============\n\nTo contribute to the project, fork it on GitHub and send a pull request, all contributions and suggestions are welcome.\n\n.. _Gsmtpd: https://github.com/34nm/gsmtpd\n.. _MongoDB: http://mongodb.org/\n.. _Docker: https://www.docker.com/\n.. _Ubuntu: http://www.ubuntu.com/\n.. _Dockerfile: http://dockerfile.github.io/#/mongodb\n.. _Python: http://www.python.org/\n.. _Pymongo2_8: http://api.mongodb.org/python/2.8/\n.. _Pymongo: http://api.mongodb.org/python/current/index.html\n.. _Gevent: http://www.gevent.org/\n.. _Postfix: http://www.postfix.org\n.. _XFORWARD: http://www.postfix.org/XFORWARD_README.html\n.. _Amavisd-new: http://www.ijs.si/software/amavisd/\n.. _Clamav: http://clamav.net/\n.. _SpamAssassin: http://spamassassin.org/\n.. _Coroutine: http://en.wikipedia.org/wiki/Coroutine\n \n.. |Build Status| image:: https://travis-ci.org/radical-software/mongo-mail-server.svg?branch=master\n :target: https://travis-ci.org/radical-software/mongo-mail-server\n :alt: Travis Build Status\n\n.. |pypi downloads| image:: https://img.shields.io/pypi/dm/mongo-mail-server.svg\n :target: https://pypi.python.org/pypi/mongo-mail-server\n :alt: Number of PyPI downloads\n \n.. |pypi version| image:: https://img.shields.io/pypi/v/mongo-mail-server.svg\n :target: https://pypi.python.org/pypi/mongo-mail-server\n :alt: Latest Version\n\n.. |pypi licence| image:: https://img.shields.io/pypi/l/mongo-mail-server.svg\n :target: https://pypi.python.org/pypi/mongo-mail-server\n :alt: License\n\n.. |pypi py_versions| image:: https://pypip.in/py_versions/mongo-mail-server/badge.svg\n :target: https://pypi.python.org/pypi/mongo-mail-server\n :alt: Supported Python versions\n\n.. |pypi dev_status| image:: https://pypip.in/status/mongo-mail-server/badge.svg\n :target: https://pypi.python.org/pypi/mongo-mail-server\n :alt: Development Status \n \n.. |requires status| image:: https://requires.io/github/radical-software/mongo-mail-server/requirements.svg?branch=master\n :target: https://requires.io/github/radical-software/mongo-mail-server/requirements/?branch=master\n :alt: Requirements Status", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/radical-software/mongo-mail-server", "keywords": null, "license": "BSD", "maintainer": null, "maintainer_email": null, "name": "mongo-mail-server", "package_url": "https://pypi.org/project/mongo-mail-server/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/mongo-mail-server/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/radical-software/mongo-mail-server" }, "release_url": "https://pypi.org/project/mongo-mail-server/0.1.1/", "requires_dist": null, "requires_python": null, "summary": "Python SMTP server with Gevent for recording messages in MongoDB", "version": "0.1.1" }, "last_serial": 1531215, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "3d9ae1ecc8380f0789c3c739c12568d3", "sha256": "edb540bdbfaa99f3f2419728f3d7259d99296eeebae3f9da534bc0af2f86c6ef" }, "downloads": -1, "filename": "mongo-mail-server-0.1.0.zip", "has_sig": false, "md5_digest": "3d9ae1ecc8380f0789c3c739c12568d3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35674, "upload_time": "2015-04-09T07:48:10", "url": "https://files.pythonhosted.org/packages/bd/4d/40507e931780bd387c918f428e03efcbb1b70275e7b7a121292f9fe620c4/mongo-mail-server-0.1.0.zip" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "19437c0eef9265b654ddf5bdc28de11f", "sha256": "9288a5426db54856c803578f4c3b55d9d42c43097e055d2c621c40961dce6d62" }, "downloads": -1, "filename": "mongo-mail-server-0.1.1.zip", "has_sig": false, "md5_digest": "19437c0eef9265b654ddf5bdc28de11f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36927, "upload_time": "2015-05-03T07:16:53", "url": "https://files.pythonhosted.org/packages/da/d6/814eb3358b5adab413f2dfe46d5ae3570364e35c22fd43d0bf2211ec54fc/mongo-mail-server-0.1.1.zip" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "19437c0eef9265b654ddf5bdc28de11f", "sha256": "9288a5426db54856c803578f4c3b55d9d42c43097e055d2c621c40961dce6d62" }, "downloads": -1, "filename": "mongo-mail-server-0.1.1.zip", "has_sig": false, "md5_digest": "19437c0eef9265b654ddf5bdc28de11f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36927, "upload_time": "2015-05-03T07:16:53", "url": "https://files.pythonhosted.org/packages/da/d6/814eb3358b5adab413f2dfe46d5ae3570364e35c22fd43d0bf2211ec54fc/mongo-mail-server-0.1.1.zip" } ] }