
Библиотека Python для разбора email-адресов и MIME
.. image:: https://travis-ci.org/mailgun/flanker.svg?branch=master :target: https://travis-ci.org/mailgun/flanker
.. image:: https://coveralls.io/repos/github/mailgun/flanker/badge.svg?branch=master :target: https://coveralls.io/github/mailgun/flanker?branch=master
Flanker — это библиотека синтаксического анализа с открытым исходным кодом, написанная на Python командой Mailgun.
В настоящее время Flanker состоит из библиотеки разбора адресов (flanker.addresslib), а также библиотеки разбора MIME (flanker.mime).
Подробная документация приведена в Руководстве пользователя <https://github.com/mailgun/flanker/blob/master/docs/User%20Manual.md>, а также в Справочнике по API <https://github.com/mailgun/flanker/blob/master/docs/API%20Reference.md>. Ниже представлено краткое руководство.
Flanker активно используется в продакшене Mailgun <www.mailgun.com>_ на Python 2.7. Текущая продакшен-версия — v0.8.5.
Поддержка Python 3 была добавлена в v0.9.0 по многочисленным просьбам сообщества. Мы не используем Flanker с Python 3 внутри компании. Всё, что нам известно, — это то, что тесты проходят на Python 3.6, так что используйте на свой страх и риск. Если заметите какие-либо проблемы, связанные с Python 3, сообщайте о них.
Вы можете установить flanker через pip или склонировать репозиторий с GitHub.
Перед началом работы с flanker вам понадобятся заголовочные файлы Python, поэтому сначала установите их:
.. code-block:: bash
sudo apt-get install python-dev
sudo yum install python-devel
Если вы используете pip, просто введите:
.. code-block:: bash
pip install flanker
Если вы клонируете с GitHub, вы можете ввести:
.. code-block:: bash
git clone [email protected]:mailgun/flanker.git cd flanker pip install -e .
Чтобы разобрать отдельный почтовый ящик (отображаемое имя, а также email-адрес):
.. code-block:: py
from flanker.addresslib import address
address.parse('Foo [email protected]') Foo [email protected]
Недопустимый адрес возвращается как None:
.. code-block:: py
from flanker.addresslib import address
print address.parse('@example.com') None
Чтобы разобрать отдельный email-адрес (без отображаемого имени):
.. code-block:: py
from flanker.addresslib import address
address.parse('[email protected]', addr_spec_only=True) [email protected]
Чтобы разобрать список адресов:
.. code-block:: py
from flanker.addresslib import address
address.parse_list(['[email protected], [email protected], @example.com']) [[email protected], [email protected]]
Чтобы разобрать список адресов, а также получить кортеж с разобранными адресами и не поддающимися разбору частями
.. code-block:: py
from flanker.addresslib import address
address.parse_list(['[email protected], [email protected], @example.com'], as_tuple=True) [[email protected], [email protected]], ['@example.com']
Чтобы разобрать список адресов в строгом режиме:
.. code-block:: py
from flanker.addresslib import address
address.parse_list(['[email protected], [email protected], @example.com'], strict=True) [[email protected], [email protected]]
Чтобы проверить email-адрес (разбор, а также проверки DNS, наличия MX и грамматики ESP):
.. code-block:: py
from flanker.addresslib import address
address.validate_address('[email protected]') [email protected]
Чтобы проверить список адресов:
.. code-block:: py
from flanker.addresslib import address
address.validate_list(['[email protected], [email protected], @mailgun.com'], as_tuple=True) ([[email protected], [email protected]], ['@mailgun.com'])
В следующих примерах message_string будет содержать следующее MIME-сообщение:
::
MIME-Version: 1.0 Content-Type: multipart/alternative; boundary=001a11c1d71697c7f004e6856996 From: Bob [email protected] To: Alice [email protected] Subject: hello, world Date: Mon, 16 Sep 2013 12:43:03 -0700
--001a11c1d71697c7f004e6856996 Content-Type: text/plain; charset=us-ascii
Hello, Alice
--001a11c1d71697c7f004e6856996 Content-Type: text/html; charset=us-ascii
Hello, Alice
--001a11c1d71697c7f004e6856996--
Чтобы разобрать MIME-сообщение:
.. code-block:: py
from flanker import mime
msg = mime.from_string(message_string)
Заголовки MIME-сообщения (unicode-словарь с несколькими значениями для заголовков):
.. code-block:: py
from flanker import mime
msg = mime.from_string(message_string) msg.headers.items() [('Mime-Version', '1.0'), ('Content-Type', ('multipart/alternative', {'boundary': u'001a11c1d71697c7f004e6856996'})), ('From', 'Bob [email protected]'), ('To', 'Alice [email protected]'), ('Subject', 'hello, world'), ('Date', 'Mon, 16 Sep 2013 12:43:03 -0700')]
Полезный атрибут content_type с предикатами:
.. code-block:: py
from flanker import mime msg = mime.from_string(message_string)
msg.content_type.is_multipart() True
msg.content_type.is_singlepart() False
msg.content_type.is_message_container() False
Декодированное тело сообщения:
.. code-block:: py
from flanker import mime msg = mime.from_string(message_string)
None because message is multipart
print msg.body None
for part in msg.parts: print 'Content-Type: {} Body: {}'.format(part, part.body)
Content-Type: (text/plain) Body: Hello, Alice Content-Type: (text/html) Body:
Hello, Alice
None because no enclosed messages exist
print msg.enclosed None