{ "info": { "author": "Joshua Tauberer", "author_email": "jt@occams.info", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "email\\_validator\n================\n\nA robust email address syntax and deliverability validation library\nfor Python 2.7/3.4 by `Joshua Tauberer `__.\n\nThis library validates that address are of the form ``x@y.com``. This is\nthe sort of validation you would want for a login form on a website.\n\nKey features:\n\n* Good for validating email addresses used for logins/identity.\n* Friendly error messages when validation fails (appropriate to show to end users).\n* (optionally) Checks deliverability: Does the domain name resolve?\n* Supports internationalized domain names and (optionally) internationalized local parts.\n* Normalizes email addresses (super important for internationalized addresses! see below).\n\nThe library is NOT for validation of the To: line in an email message (e.g.\n``My Name ``), which `flanker `__\nis more appropriate for. And this library does NOT permit obsolete\nforms of email addresses, so if you need strict validation against the\nemail specs exactly, use `pyIsEmail `__.\n\nThe current version is 1.0.3 (Sept 12, 2017). The only changes since 1.0.0 (Sept 5, 2015)\nhave been small bug and packaging fixes.\n\nInstallation\n------------\n\nThis package is on PyPI, so:\n\n::\n\n pip install email_validator\n\n``pip3`` also works.\n\nUsage\n-----\n\nIf you're validating a user's email address before creating a user\naccount, you might do this:\n\n::\n\n from email_validator import validate_email, EmailNotValidError\n\n email = \"my+address@mydomain.tld\"\n\n try:\n v = validate_email(email) # validate and get info\n email = v[\"email\"] # replace with normalized form\n except EmailNotValidError as e:\n # email is not valid, exception message is human-readable\n print(str(e))\n\nThis validates the address and gives you its normalized form. You should\nput the normalized form in your database and always normalize before\nchecking if an address is in your database.\n\nThe validator will accept internationalized email addresses, but email\naddresses with non-ASCII characters in the *local* part of the address\n(before the @-sign) require the `SMTPUTF8 `__\nextension which may not be supported by your mail submission library or\nyour outbound mail server. If you know ahead of time that SMTPUTF8 is\nnot supported then **add the keyword argument allow_smtputf8=False\nto fail validation for addresses that would require SMTPUTF8**:\n\n::\n\n validate_email(email, allow_smtputf8=False)\n\nOverview\n--------\n\nThe module provides a function ``validate_email(email_address)`` which takes\nan email address (either a ``str`` or ASCII ``bytes``) and:\n\n- Raises a ``EmailNotValidError`` with a helpful, human-readable error\n message explaining why the email address is not valid, or\n\n- Returns a dict with information about the deliverability of the email\n address.\n\nWhen an email address is not valid, ``validate_email`` raises either an\n``EmailSyntaxError`` if the form of the address is invalid or an\n``EmailUndeliverableError`` if the domain name does not resolve. Both\nexception classes are subclasses of ``EmailNotValidError``, which in\nturn is a subclass of ``ValueError``.\n\nBut when an email address is valid, a dict is returned containing\ninformation that might aid deliverability (see below).\n\nThe validator doesn't permit obsoleted forms of email addresses that no one\nuses anymore even though they are still valid and deliverable, since they\nwill probably give you grief if you're using email for login. (See later in the\ndocument about that.)\n\nThe validator checks that the domain name in the email address resolves.\nThere is nothing to be gained by trying to actually contact an SMTP\nserver, so that's not done here. For privacy, security, and practicality\nreasons servers are good at not giving away whether an address is\ndeliverable or not: email addresses that appear to accept mail at first\ncan bounce mail after a delay, and bounced mail may indicate a temporary\nfailure of a good email address (sometimes an intentional failure, like\ngreylisting).\n\nThe function also accepts the following keyword arguments (default as\nshown):\n\n``allow_smtputf8=True``\n Set to ``False`` to prohibit internationalized\n addresses that would require the `SMTPUTF8 `__\n extension.\n\n``check_deliverability=True``\n Set to ``False`` to skip the domain name resolution check.\n\n``allow_empty_local=False``\n Set to ``True`` to allow an empty local\n part (i.e. ``@example.com``), e.g. for validating Postfix aliases.\n\nInternationalized email addresses\n---------------------------------\n\nThe email protocol SMTP and the domain name system DNS have historically\nonly allowed ASCII characters in email addresses and domain names,\nrespectively. Each has adapted to internationalization in a separate\nway, creating two separate aspects to email address\ninternationalization.\n\nInternationalized domain names (IDN)\n''''''''''''''''''''''''''''''''''''\n\nThe first is `internationalized domain names (RFC\n5891) `__, a.k.a IDNA 2008. The DNS system has not\nbeen updated with Unicode support. Instead, internationalized domain\nnames are converted into a special IDNA ASCII form starting with\n``xn--``. When an email address has non-ASCII characters in its domain\npart, the domain part is replaced with its IDNA ASCII equivalent form\nin the process of mail transmission. Your mail submission library probably\ndoes this for you transparently. Note that most web browsers are currently\nin transition between IDNA 2003 (RFC 3490) and IDNA 2008 (RFC 5891) and\n`compliance around the web is not very good `__\nin any case, so be aware that edge cases are handled differently by different\napplications and libraries. This library conforms to IDNA 2008 using the\n`idna `__ module by Kim Davies.\n\nInternationalized local parts\n'''''''''''''''''''''''''''''\n\nThe second sort of internationalization is internationalization in the\n*local* part of the address (before the @-sign). These email addresses\nrequire that your mail submission library and the mail servers along the\nroute to the destination, including your own outbound mail server, all\nsupport the `SMTPUTF8 (RFC\n6531) `__ extension. Support for\nSMTPUTF8 varies.\n\nHow this module works\n'''''''''''''''''''''\n\nBy default all internationalized forms are accepted by the validator.\nBut if you know ahead of time that SMTPUTF8 is not supported by your\nmail submission stack, then you must filter out addresses that require\nSMTPUTF8 using the ``allow_smtputf8=False`` keyword argument (see\nabove). This will cause the validation function to raise a\n``EmailSyntaxError`` if delivery would require SMTPUTF8. That's just\nin those cases where non-ASCII characters appear before the @-sign.\nIf you do not set ``allow_smtputf8=False``, you can also check the\nvalue of the ``smtputf8`` field in the returned dict.\n\nIf your mail submission library doesn't support Unicode at all --- even\nin the domain part of the address --- then immediately prior to mail\nsubmission you must replace the email address with its ASCII-ized\nform. This library gives you back the ASCII-ized form in the\n``email_ascii`` field in the returned dict, which you can get like this:\n\n::\n\n v = validate_email(email, allow_smtputf8=False)\n email = v['email_ascii']\n\nThe local part is left alone (if it has internationalized characters\n``allow_smtputf8=False`` will force validation to fail) and the domain\npart is converted to `IDNA\nASCII `__. (You probably should not\ndo this at account creation time so you don't change the user's login\ninformation without telling them.)\n\nUCS-4 support required for Python 2.7\n'''''''''''''''''''''''''''''''''''''\n\nNote that when using Python 2.7, it is required that it was built with \nUCS-4 support (see `here `__); otherwise emails with unicode characters outside \nof the BMP (Basic Multilingual Plane) will not validate correctly.\n\nNormalization\n-------------\n\nThe use of Unicode in email addresses introduced a normalization problem.\nDifferent Unicode strings can look identical and have the same semantic\nmeaning to the user. The ``email`` field returned on successful validation\nprovides the correctly normalized form of the given email address:\n\n::\n\n v = validate_email(email)\n email = v['email']\n\nBecause you may get an email address in a variety of forms, you ought to replace\nit with its normalized form immediately prior to going into your database\n(during account creation), querying your database (during login), or sending\noutbound mail.\n\nThe normalizations include lowercasing the domain part of the email address\n(domain names are case-insensitive), `Unicode \"NFC\" normalization `__\nof the whole address (which turns characters plus `combining characters `__\ninto precomposed characters where possible and replaces certain Unicode characters\n(such as angstrom and ohm) with other equivalent code points (a-with-ring and omega,\nrespectively)), replacement of `fullwidth and halfwidth characters `__\nin the domain part, and possibly other `UTS46 `__ mappings\non the domain part.\n\n(See `RFC 6532 (internationalized email) section 3.1 `__\nand `RFC 5895 (IDNA 2008) section 2 `__.)\n\nExamples\n--------\n\nFor the email address ``test@example.org``, the returned dict is:\n\n::\n\n {\n \"email\": \"test@example.org\",\n \"email_ascii\": \"test@example.org\",\n \"local\": \"test\",\n \"domain\": \"example.org\",\n \"domain_i18n\": \"example.org\",\n\n \"smtputf8\": false,\n\n \"mx\": [\n [\n 0,\n \"93.184.216.34\"\n ]\n ],\n \"mx-fallback\": \"A\"\n }\n\nFor the fictitious address ``example@\u826f\u597dMail.\u4e2d\u56fd``, which has an\ninternationalized domain but ASCII local part, the returned dict is:\n\n::\n\n {\n \"email\": \"example@\u826f\u597dmail.\u4e2d\u56fd\",\n \"email_ascii\": \"example@xn--mail-p86gl01s.xn--fiqs8s\",\n \"local\": \"example\",\n \"domain\": \"xn--mail-p86gl01s.xn--fiqs8s\",\n \"domain_i18n\": \"\u826f\u597dmail.\u4e2d\u56fd\",\n\n \"smtputf8\": false,\n\n \"mx\": [\n [\n 0,\n \"218.241.116.40\"\n ]\n ],\n \"mx-fallback\": \"A\"\n }\n\nNote that ``smtputf8`` is ``False`` even though the domain part is\ninternationalized because\n`SMTPUTF8 `__ is only\nneeded if the local part of the address is internationalized (the domain\npart can be converted to IDNA ASCII). Also note that the ``email`` and\n``domain_i18n`` fields provide a normalized form of the email address\nand domain name (casefolding and Unicode normalization as required by\nIDNA 2008).\n\nFor the fictitious address ``\u6811\u5927@occams.info``, which has an\ninternationalized local part, the returned dict is:\n\n::\n\n {\n \"email\": \"\u6811\u5927@occams.info\",\n \"local\": \"\u6811\u5927\",\n \"domain\": \"occams.info\",\n \"domain_i18n\": \"occams.info\",\n\n \"smtputf8\": true,\n\n \"mx\": [\n [\n 10,\n \"box.occams.info\"\n ]\n ],\n \"mx-fallback\": false\n }\n\nNow ``smtputf8`` is ``True`` and ``email_ascii`` is missing because the\nlocal part of the address is internationalized. The ``local`` and ``email``\nfields return the normalized form of the address: certain Unicode characters\n(such as angstrom and ohm) may be replaced by other equivalent code points\n(a-with-ring and omega).\n\nReturn value\n------------\n\nWhen an email address passes validation, the fields in the returned dict\nare:\n\n``email``\n The canonical form of the email address, mostly useful for\n display purposes. This merely combines the ``local`` and\n ``domain_i18n`` fields (see below).\n\n``email_ascii``\n If present, an ASCII-only form of the email address\n by replacing the domain part with `IDNA\n ASCII `__. This field will be\n present when an ASCII-only form of the email address exists\n (including if the email address is already ASCII). If the local part\n of the email address contains internationalized characters,\n ``email_ascii`` will not be present.\n\n``local``\n The local part of the given email address (before the\n @-sign) with Unicode NFC normalization applied.\n\n``domain``\n The `IDNA ASCII `__-encoded form of the\n domain part of the given email address (after the @-sign), as it\n would be transmitted on the wire.\n\n``domain_i18n``\n The canonical internationalized form of\n the domain part of the address, by round-tripping through IDNA ASCII.\n If the returned string contains non-ASCII characters, either the\n `SMTPUTF8 `__ feature of MTAs\n will be required to transmit the message or else the email address('s\n domain part) must be converted to IDNA ASCII first (given in the\n returned ``domain`` field).\n\n``smtputf8``\n A boolean indicating that the `SMTPUTF8 `__\n feature of MTAs will be required to transmit messages to this address because the\n local part of the address has non-ASCII characters (the local part\n cannot be IDNA-encoded). If ``allow_smtputf8=False`` is passed as an\n argument, this flag will always be false because an exception is raised\n if it would have been true.\n\n``mx``\n A list of `(priority, domain)` tuples of MX records specified\n in the DNS for the domain (see `RFC 5321 section\n 5 `__).\n\n``mx-fallback``\n ``None`` if an ``MX`` record is found. If no MX\n records are actually specified in DNS and instead are inferred,\n through an obsolete mechanism, from A or AAAA records, the value is\n the type of DNS record used instead (``A`` or ``AAAA``).\n\nAssumptions\n-----------\n\nBy design, this validator does not pass all email addresses that\nstrictly conform to the standards. Many email address forms are obsolete\nor likely to cause trouble:\n\n- The validator assumes the email address is intended to be deliverable\n on the public Internet using DNS, and so the domain part of the email\n address must be a resolvable domain name.\n- The \"quoted string\" form of the local part of the email address (RFC\n 5321 4.1.2) is not permitted --- no one uses this anymore anyway.\n Quoted forms allow multiple @-signs, space characters, and other\n troublesome conditions.\n- The \"literal\" form for the domain part of an email address (an IP\n address) is not accepted --- no one uses this anymore anyway.\n\nTesting\n-------\n\nA handful of valid email addresses are pasted in ``test_pass.txt``. Run\nthem through the validator (without deliverability checks) like so:\n\n::\n\n python3 email_validator/__init__.py --tests < test_pass.txt\n\nFor Project Maintainers\n-----------------------\n\nThe package is distributed as a universal wheel. The wheel is specified as\nuniversal in the file ``setup.cfg`` by the ``universal = 1`` key in the\n``[bdist_wheel]`` section. To publish a universal wheel to pypi::\n\n\tpip3 install twine\n\trm -rf dist\n\tpython3 setup.py bdist_wheel\n\ttwine upload dist/*\n\tgit tag v1.0.XXX\n\tgit push --tags\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/JoshData/python-email-validator", "keywords": "email address validator", "license": "CC0 (copyright waived)", "maintainer": "", "maintainer_email": "", "name": "email-validator", "package_url": "https://pypi.org/project/email-validator/", "platform": "", "project_url": "https://pypi.org/project/email-validator/", "project_urls": { "Homepage": "https://github.com/JoshData/python-email-validator" }, "release_url": "https://pypi.org/project/email-validator/1.0.5/", "requires_dist": [ "idna (>=2.0.0)", "dnspython (>=1.15.0)" ], "requires_python": "", "summary": "A robust email syntax and deliverability validation library for Python 2.x/3.x.", "version": "1.0.5" }, "last_serial": 5996956, "releases": { "0.1.0-rc1": [ { "comment_text": "", "digests": { "md5": "d0bbcac57846e825b2f12d26aa87aa4d", "sha256": "d0cc2a53b2fcf421b01a641af5faa61ff7eab270004ada4051a139f87746de89" }, "downloads": -1, "filename": "email_validator-0.1.0-rc1.tar.gz", "has_sig": false, "md5_digest": "d0bbcac57846e825b2f12d26aa87aa4d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12348, "upload_time": "2015-04-21T14:28:44", "url": "https://files.pythonhosted.org/packages/06/7a/e596ad26286d78b43e905204d61ec981a59f8e00424efd08369e4ee0aaef/email_validator-0.1.0-rc1.tar.gz" } ], "0.1.0rc3": [ { "comment_text": "", "digests": { "md5": "b2d63074e1f56fe2a5df88e04c6a9f7c", "sha256": "ee55ca7652a81771aa0b60ae68396688ef2b722dbe017d8615ed8cb3d64ab490" }, "downloads": -1, "filename": "email_validator-0.1.0rc3.tar.gz", "has_sig": false, "md5_digest": "b2d63074e1f56fe2a5df88e04c6a9f7c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15593, "upload_time": "2015-04-29T21:12:27", "url": "https://files.pythonhosted.org/packages/ad/ff/74307d5f37f9099a7e30e97d4dfcef86ed6a0ee73068a81b644045c11f6b/email_validator-0.1.0rc3.tar.gz" } ], "0.1.0rc4": [ { "comment_text": "", "digests": { "md5": "4964974b91c18d0c81d3a46bf0dd5bf1", "sha256": "dfa20d96b32b5d5390b0b0f8b011706b1b210564d1eeca535a632148c6cb30d7" }, "downloads": -1, "filename": "email_validator-0.1.0rc4.tar.gz", "has_sig": false, "md5_digest": "4964974b91c18d0c81d3a46bf0dd5bf1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15595, "upload_time": "2015-04-29T21:17:25", "url": "https://files.pythonhosted.org/packages/c8/c7/f64de455411f9653b0787fbf4ffab04a528e692b6943720d5ba6ca7c8ba6/email_validator-0.1.0rc4.tar.gz" } ], "0.1.0rc5": [ { "comment_text": "", "digests": { "md5": "152266ab34458e264d06ffcbc807f85b", "sha256": "8dc7f201f25803003709b5d7d1353f562a1547b227c36c35e9bb24c8ce28dfc1" }, "downloads": -1, "filename": "email_validator-0.1.0rc5.tar.gz", "has_sig": false, "md5_digest": "152266ab34458e264d06ffcbc807f85b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15052, "upload_time": "2015-05-19T12:33:15", "url": "https://files.pythonhosted.org/packages/6d/a2/ba954cbd381e350698accfba7c7f756bfe469f8948bcee368e640a2f21ef/email_validator-0.1.0rc5.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "ed7991d2260fc40386cce46dad102811", "sha256": "f44a45b7ed078b205e5738065125594fd7adcabd88d0bcd0a5155ae6ab14d7fd" }, "downloads": -1, "filename": "email_validator-0.5.0.tar.gz", "has_sig": false, "md5_digest": "ed7991d2260fc40386cce46dad102811", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15041, "upload_time": "2015-06-15T15:22:17", "url": "https://files.pythonhosted.org/packages/5e/05/8fd01ef8517f34c67ed07499c044a51806fe8908c5d78016b074ab2ac17c/email_validator-0.5.0.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "4fdb93f848c513ea2ea636f03bf5d7f3", "sha256": "fd4eb8f8fd0c84339f4d88799fe1e718ff917d3a7a8570f5c613295bbbfe2501" }, "downloads": -1, "filename": "email_validator-1.0.0.tar.gz", "has_sig": false, "md5_digest": "4fdb93f848c513ea2ea636f03bf5d7f3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18272, "upload_time": "2015-09-05T12:22:15", "url": "https://files.pythonhosted.org/packages/9a/2b/a482187dd223481313f8309cbf9d0316d2ef379489cf7de85867bc79de0a/email_validator-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "73d6d6d7c08f6751cb409a48cda9698d", "sha256": "1c8bf2af1d2b213bab7298145077e2bf82b926c21054a30c47d44504cb93c856" }, "downloads": -1, "filename": "email_validator-1.0.1.tar.gz", "has_sig": false, "md5_digest": "73d6d6d7c08f6751cb409a48cda9698d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18316, "upload_time": "2016-03-06T23:24:51", "url": "https://files.pythonhosted.org/packages/ce/dd/63fc85ccc6db18cfab302d52015ed349bbd5aab11ebee713da0908744ba7/email_validator-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "0a81cf9dc6e6e3d40860626563ce0379", "sha256": "feec98c601524619e67b377f52ce331920f026d1b2e05bf5d6d0031ec844b600" }, "downloads": -1, "filename": "email_validator-1.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0a81cf9dc6e6e3d40860626563ce0379", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 17787, "upload_time": "2017-09-12T11:46:36", "url": "https://files.pythonhosted.org/packages/7c/19/1715c8e1e21ee82f6a7ceedee666e43dac628929546fb642853c4ce60fb9/email_validator-1.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3fbe652ab41aaa4f937f90bdbbedfa52", "sha256": "669eaae98d86dbd0ab62ab2f5fbc95d01cb28f8e038aa30ab165b244130949c9" }, "downloads": -1, "filename": "email_validator-1.0.2.tar.gz", "has_sig": false, "md5_digest": "3fbe652ab41aaa4f937f90bdbbedfa52", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18607, "upload_time": "2016-12-30T22:31:46", "url": "https://files.pythonhosted.org/packages/72/d9/08afd9a35e25828659f905c6b254ddf8e786174695f0e769e30b5c69d4dc/email_validator-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "f76ce9c4fb77e650462fd8dfab8b3d91", "sha256": "ddc4b5b59fa699bb10127adcf7ad4de78fde4ec539a072b104b8bb16da666ae5" }, "downloads": -1, "filename": "email_validator-1.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f76ce9c4fb77e650462fd8dfab8b3d91", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 17962, "upload_time": "2017-09-12T11:47:25", "url": "https://files.pythonhosted.org/packages/d9/0f/7e3815143e30959fd38d02f622c77912a465c153d854317b248d29d6d7bf/email_validator-1.0.3-py2.py3-none-any.whl" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "66d799674e046e3d69672cdd5169f3d2", "sha256": "79966e318d6d68fed359c90f8f19d242bcc178b724011f1c07145bd093da6cc7" }, "downloads": -1, "filename": "email_validator-1.0.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "66d799674e046e3d69672cdd5169f3d2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14910, "upload_time": "2019-05-02T19:44:01", "url": "https://files.pythonhosted.org/packages/09/31/f1a496192ea2e87ec4db40dfc2f000de3fbce565e10e95f09a614127e09f/email_validator-1.0.4-py2.py3-none-any.whl" } ], "1.0.5": [ { "comment_text": "", "digests": { "md5": "a37be88e669f27508763aff5f61ebe12", "sha256": "e3e6ede1765d7c1e580d2050d834b2689361f7da2d50ce74df6a5968fca7cb13" }, "downloads": -1, "filename": "email_validator-1.0.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a37be88e669f27508763aff5f61ebe12", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14953, "upload_time": "2019-10-18T18:28:40", "url": "https://files.pythonhosted.org/packages/8a/67/9f2e15c3052ac54773b99bedcc9cb3c0654ab1065652bb2c0145bea6335d/email_validator-1.0.5-py2.py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a37be88e669f27508763aff5f61ebe12", "sha256": "e3e6ede1765d7c1e580d2050d834b2689361f7da2d50ce74df6a5968fca7cb13" }, "downloads": -1, "filename": "email_validator-1.0.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a37be88e669f27508763aff5f61ebe12", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14953, "upload_time": "2019-10-18T18:28:40", "url": "https://files.pythonhosted.org/packages/8a/67/9f2e15c3052ac54773b99bedcc9cb3c0654ab1065652bb2c0145bea6335d/email_validator-1.0.5-py2.py3-none-any.whl" } ] }